EXCEL的单元格有自动换行功能,那么它是如何知道一行已写满的??我在程序中能不能知道?我能不能在程序中获得单元格一行写满的消息?
解答:第一种方法,alt+enter。第二种方法,看你打算一行多长,如20个字符,那在程序里设定到这么长就加Chr(13)&Chr(10),即加硬回车
indirect?取数组的问题?
INDIRECT("sheet"&ROW(B2)&"!a:a")?取数组时出错,而INDIRECT("sheet"&ROW(B2)&"!a1")却可行。能解答一下吗?
解答:Q、sheet?&?row(b2)不就是sheet2吗?,直接用sheet2!A:A就可以了。
A、我只是想弄清楚这个问题,这样做法问题出在哪里?
Q、引号中的是字符串,A1是字符串没关系,A:A恐怕就不行了。:应该是一个运算符号。
Q、indirect(.....)结果是一个区域时必须只能用数组输入(CTRL+SHIFT+ENTER),或作为另一个函数的参数,或在定义-名称中使用。我也曾遇到过在用有的函数时(),用A:A不行,而必须改为A1:A65535才能通过(就是要比工作表最大行数少1)
Q、这样?=INDIRECT("sheet"&ROW(B2)&"!a1:a1")
以下公式中,我还不太理解用LEN-ROW的用意,还有MID的作用是什么呢,能介绍一下么?谢谢。
wait duilet dhgsl 8
=RIGHT(A1,MATCH("",MID(A1,LEN(A1)-ROW(INDIRECT("1:"&LEN(A1))),1),0))
Q、不明白你公式求什么
LEN(A1) = 19
ROW(INDIRECT("1:"& LEN(A1))) = 1
其实是 {1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19} 但储存格只显示第一个数字
MID(A1,LEN(A1)-ROW(INDIRECT("1:"&LEN(A1))),1) = " "
其实是 {" ";"l";"s";"g";"h";"d";" ";"t";"e";"l";"i";"u";"d";" ";"t";"i";"a";"w";#value!}
这公式会出错:19 - 19 = MID(A1,0,1)
可改成 =MID(A1,LEN(A1)-ROW(INDIRECT("1:"&LEN(A1))) +1,1)
实在= {"8";" ";"l";"s";"g";"h";"d";" ";"t";"e";"l";"i";"u";"d";" ";"t";"i";"a";"w"}
至于 Match 不是用于单一储存格
Lookup_array ? 是个连续的储存格范围,其中含有被比对值的数据。 Lookup_array 必须是个数组或数组参照地址。
MID(text,start_num,num_chars)
MIDB(text,start_num,num_bytes)
文字是含有您想选录的部分字符串之文字字符串。
Start_num ? 为用以指定您要由 text 的第若干个字节开始抽选。text 中的第一个字符为 start_num 1,依此类推。
Num_chars ?指定您要 MID 从字符串传回的字符组。
Num_bytes ?指定您要 MIDB 从字符串传回的字符组 (以字节)。
批注
如果 start_num 大于 text 的长度,MID 将传回 " " (空字符串)。
如果 start_num 小于 text,但 start_num 加上 num_chars 的长度超过 text 的长度,MID 将传回由 start_num 到 text 结尾的所有字符。
如果 start_num 小于 1,MID 将传回 #value ! 的错误值。
如果 num_chars 为负值,MID 将传回 #value ! 的错误值。
如果 num_bytes 为负值,MIDB 将传回 #value ! 的错误值。
ListBox如何取得横向数据
请问:ListBox如何取得横向
数据,?ListBox1.RowSource?=?"a1:a4"是取得纵向的值,但我希望是取得a1:d1横向的值,然后在ListBox1内纵向列出,请高手告知方法谢谢
Q、由于EXCEL的局限性,很多时候需要进行过渡性操作。楼主也可以取出源数据,转置后再赋值给?li
stbox?,反之亦然。
我目前正是用此方式,我只是想应该有更好的方式,或是应该说有正确的属性
Q、方式如下:ListBox1.List?=?Application.WorksheetFunction.Transpose(Range("A1:D1"))
5、VBA疑难问题两条
我想请教以下两个困扰着我的有关EXCEL中VBA的问题:
?1,如何在程序中动态地创建一个新的控件?
?2,如果去定义一个控件数组???(如要创建一个总共有十个标签的标签组)
Q、Sub?AddControls()
????Dim?ctrl(1?To?10)?As?OLEObject?'定义变量
????With?Worksheets("sheet1").OLEObjects.Add(classtype:="Forms.CommandButton.1",?Left:=288,?Top:=201,?Width:=72,?Height:=24)
????????.Name?=?"MyCmd"
End With
'Worksheets("sheet1").OLEObjects.Add classtype:="Forms.CommandButton.1", Left:=288, Top:=401, Width:=72, Height:=24
Set ctrl(1) = Worksheets("sheet1").OLEObjects.Add(classtype:="Forms.TextBox.1", Link:=False, Top:=201, Width:=72, Height:=18)
ctrl(1).Left = 100
ctrl(1).Name = "MyText"
End Sub
Q2、根据你的问题:
Sub?AddLabels()
????Dim?i?As?Integer
????Dim?ws?As?Worksheet
????Set?ws?=?Worksheets("sheet1")
????Dim?ctrl(1?To?10)?As?OLEObject?'定义变量
????For?i?=?1?To?10
????????Set?ctrl(i)?=?ws.OLEObjects.Add(classtype:="Forms.label.1",?Left:=100,?Width:=72,?Height:=18)
????????With?ctrl(i)
????????.Name?=?"MyLabel"?&?i
????????.Top?=?60?+?30?*?i
????????.Object.BackColor?=?vbGreen
????????.Object.Caption?=?"MyLabel"?&?i
????????End?With
????Next?i
End?Sub
(注:EdgeofCity的控件数组引用方式不错,可以在创建控件或启动时把控件对象指派给数组元素,但是我感觉和vb中的控件数组相比还是有些不足,比如说不能共享事件过程)
6、人民币大写公式:123.25?转换为?壹佰贰拾叁元贰角伍分。=concatenate("大写金额:",if(not(isnumber(find(".",text(b14,"[dbnum2]g/通用格式"),1))),concatenate(text(b14,"[dbnum2]g/通用格式"),"元整"),concatenate(left(text(b14,"[dbnum2]g/通用格式"),find(".",text(b14,"[dbnum2]g/通用格式"),1)-1),"元",if(mid(text(b14,"[dbnum2]g/通用格式"),find(".",text(b14,"[dbnum2]g/通用格式"),1)+1,1)="零","零",concatenate(mid(text(b14,"[dbnum2]g/通用格式"),find(".",text(b14,"[dbnum2]g/通用格式"),1)+1,1),"角")),if(mid(text(b14,"[dbnum2]g/通用格式"),find(".",text(b14,"[dbnum2]g/通用格式"),1)+2,1)="","整",concatenate(mid(text(b14,"[dbnum2]g/通用格式"),find(".",text(b14,"[dbnum2]g/通用格式"),1)+2,1),"分")))))
上述公式中假设?b14?单元格为阿拉伯数字
7、请帮我修改以下公式(急)
下面是统计区间数字中指定个位数数量的公式,请帮我修改成如没有要
统计的数字就保持空格.不等于零,谢谢! =SUM((RIGHT(B18:H18)="2")*1)
Q、=if(SUM((RIGHT(B18:H18)="2")*1)=0,"",SUM((RIGHT(B18:H18)="2")*1))
8、用变量如何简写以下代码?
下列代码是以30为单位递增的.我想把公式写入b列相应的单元格内.如果只写B列的话不知用定义变量的方法如何写。我还有C、D、F列也是写入一样的公式如果把B、C、D、F写在一起用变量的方法又怎样写。谢谢!
Sheet1.Range("b89") = "=COUNTA(b60:b88)"
Sheet1.Range("b119") = "=COUNTA(b90:b118)"
Sheet1.Range("b149") = "=COUNTA(b120:b148)"
? ?? ?? ???.? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???.
vba计算字符串长度? ?? ?? ???.? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???.
Sheet1.Range("b6869") = "=COUNTA(b6840:b6868)"
Q、可以实现
建立以下的宏,运行没有问题。
Sub 宏1()
Dim S1, S2 As String
Dim Temp, Left, Right As Integer
For m = 89 To 6869
Temp = m
Left = m - 29
Right = m - 1
S1 = "b" & m
S2 = "=COUNTA(b" & Left & ":b" & Right & ")"
Sheet1.Range(S1) = S2
m = m + 30
Next m
End Sub
有其他列,可以将b设置为string变量,每次自动获取或手工编写。
(注:这是一个典型的动态改变单元格公式的例子,在vba中经常用到)
9、这个条件求和的函数如何编写?
sumif函数的计算格式为: =sumif($a$1:$a$20,">1000")。即返回$a$1:$a$20中大于1000的数值的和,但如果想计算900~1000之间的数值之和,应该如何编写。
Q、请参考:{=SUM(IF((A1:A20>900)*(A1:A20<1000),A1:A20))}或{=SUM((900<A1:A20)*(A1:A20<1000)*A1:A20)}
Q2、=SUMIF(A1:A20,">900")-SUMIF(A1:A20,">1000")
10、根据身份证号码自动提取性别和出生年月及求年龄的公式
这是根据身份证号码(15位和18位通用)自动提取性别和出生年月的自编公式,供需要的网友参考:
说明:公式中的B2或B4是身份证号
1、根据身份证号码求性别:
=IF(LEN(B2)=15,IF(MOD(value(RIGHT(B2,3)),2)=0,"女","男"),IF(LEN(B2)=18,IF(MOD(value(MID(B2,15,3)),2)=0,"女","男"),"身份证错"))
2、根据身份证号码求出生年月:
=IF(LEN(B4)=15,CONCATENATE("19",MID(B4,7,2),".",MID(B4,9,2)),IF(LEN(B4)=18,CONCATENATE(MID(B4,7,4),".",MID(B4,11,2)),"身份证错"))
3、根据身份证号码求年龄:
=IF(LEN(B4)=15,year(now())-1900-value(MID(B4,7,2)),if(LEN(B4)=18,year(now())-value(MID(B4,7,4)),"身份证错"))
11、结合各位大虾的代码,工作中写的工资表转工资条程序.
如题.?请各位指教,?如何进一步优化. 实际当中这样的功能已经不错了,?就懒得再改了,?哪位兄弟改进了欢迎贴上来共享.
'?工资总表转工资条程序
'?应用环境:?Excel?2000?VBA
'?当前版本:?0.9c
'例:
'月份????工??號??項目????工???????????????????????????????????資?????????????????加??????班??????工???????資?????????????勤工????津??????貼??????應?????得??????工?????資????應????扣????項????目????????????????????????實???????支????????金??????額???扣除????
罰款????實????付??金????額??備註
'????????姓名????底薪????津貼????工作????應得????應得????平時加班????????假日加班????????????夜班????其他????????稅款????箱.餐???插座????伙食????住宿????共扣
'????????????????????????????????天數????工資????津貼????時間????金額????時間?金額???????????夜班????其他?????????????????牌?????????????費??????費??????金額
'10月份???a-001???朱xx???16.00??????26??416.00??????107?285.33??????0.00????32.00???108.00??20.00???861.33??????????????20.00???15.00???35.00???826.33??????826.33
'10月份???B-108???袁xx???16.00??????25.5????408.00??????150?400.00??????0.00????32.00???????????840.00??????????????40.00???15.00???55.00???785.00??????785.00
Sub?CreatePayRoll()
Dim?TitleRow?As?Integer?????'?工资表标题行数
Dim?TitleCol?As?Integer?????'?工资表标题栏数
Dim?MyPageBreak?As?Integer??'?每页打印多少个工资条
CurVer?=?"0.9c"??'?当前版本号
TitleRow?=?3
MyPageBreak?=?7
response?=?MsgBox("本程序由?WongMokin?制作,?当前版本号?"?&?CurVer,?vbOKOnly?+?vbInformation?+?vbDefaultButton0,?"工资表转换成工资条",?"",?0)
'先关闭屏幕刷新,免的闪
Application.ScreenUpdating?=?False
'实有工资条?=?取得当前区域的最后一行行号?-?标题行数
num?=?ActiveSheet.Range("A1").CurrentRegion.Rows.Count?-?TitleRow
num?=?InputBox("请在下面的输入框中键入要生成工资条的条数.?"?&?Chr(13)?&?Chr(10)?&?Chr(13)?&?Chr(10)?&?_
"只能输入数值,?若输入其他内容将导致程序出错,?后果自负.?"?&?Chr(13)?&?Chr(10)?&?Chr(13)?&?Chr(10)?&?_
"经检查共有工资记录:?"?&?num?&?"?条",?"要生成的工资条的条数",?num)
If?Int(num)?<?1?Then
???response?=?MsgBox("要生成的工资条数目太少,不需要执行此程序.",?vbOKOnly?+?vbExclamation?+?vbDefaultButton0,?"工资表转换成工资条?-?警告",?"",?0)
???Exit?Sub
End?If
'工资表的栏数,如?TitleCol?=?10
TitleCol?=?33
TitleCol?=?InputBox("请在下面的输入框中键入工资条表头的栏数.?"?&?Chr(13)?&?Chr(10)?&?Chr(13)?&?Chr(10)?&?_
"只能输入数值,?若输入其他内容将导致程序出错,?后果自负.?"?&?Chr(13)?&?Chr(10)?&?Chr(13)?&?Chr(10)?&?_
"默认值为:?"?&?TitleCol,?"工资条表头的栏数",?TitleCol)
TitleCol?=?Int(Abs(Val(TitleCol)))?????'将输入的数值取正整数,?防止一般的输入性错误.
MyPageBreak?=?InputBox("每页打印多少条工资条?"?&?Chr(10)?&?Chr(13)?&?Chr(10)?&?Chr(13)?&?_
"预设每页打印?"?&?Int(MyPageBreak)?&?"?条"?&?Chr(10)?&?Chr(13),?"工资表转成工资条",?7)
MyPageBreak?=?Int(Abs(Val(MyPageBreak)))
response?=?MsgBox("工资表转工资条的过程即将开始?"?&?Chr(13)?&?Chr(10)?&?Chr(13)?&?Chr(10)?&?_
"按?是(Yes)?后将开始进行转换,?未完成前您的电脑可能无法执行其他操作.?"?&?Chr(13)?&?Chr(10)?&?_
"请先将您的Excel文档保存后再继续此操作.?"?&?Chr(13)?&?Chr(10)?&?Chr(13)?&?Chr(10)?&?_
"工资条标题格式为?"?&?TitleRow?&?"?行?"?&?TitleCol?&?"?栏,?要转换的工资条数为:?"?&?num?&?"?条"?&?_
"每页打印工资条数为:?"?&?MyPageBreak?&?"?条",?vbYesNo?+?vbExclamation?+?vbDefaultButton2,?"工资表转工资条?-?执行前确认",?"",?0)
If?response?=?vbYes?Then????'?用户按下?"是"
????????'?暂未使用
Else????'?用户按下?"否"
????Exit?Sub????'退出此程序
End?If
'?复制当前工作表并更改名字
ActiveSheet.Copy
ActiveSheet.Name?=?"工资条打印"
'总人数×5,如工资表中有100人则为100×5即num?=?500
'即表头3行,?工资单一行,?空一行
num?=?Int(Abs(Val(num)))?*?(TitleRow?+?2)
'判断有多少条记录
'?x?=?ActiveSheet.Range("A1").CurrentRegion.Rows.Count
'?or?x?=?Range("a1").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row
'开始插入标题
For?y?=?5?To?(num?-?1)?Step?5
'将标题复制到记录上面
????Rows("1:3").Select
????Selection.Copy
????Rows(y).Select
????Selection.Insert?Shift:=xlDown
?
???Selection.Insert?Shift:=xlDown
????If?y?Mod?MyPageBreak?*?(TitleRow?+?2)?=?0?Then
???????'插入分页符
???????Range("A"?&?y).PageBreak?=?xlPageBreakManual
????End?If
??Next
??Cells.Select
'选择整个表去掉表格线
Range("F1").Activate
Selection.Borders(xlDiagonalDown).LineStyle?=?xlNone
Selection.Borders(xlDiagonalUp).LineStyle?=?xlNone
Selection.Borders(xlEdgeLeft).LineStyle?=?xlNone
Selection.Borders(xlEdgeTop).LineStyle?=?xlNone
Selection.Borders(xlEdgeBottom).LineStyle?=?xlNone
Selection.Borders(xlEdgeRight).LineStyle?=?xlNone
Selection.Borders(xlInsideVertical).LineStyle?=?xlNone
Selection.Borders(xlInsideHorizontal).LineStyle?=?xlNone
Range(Cells(1,?1),?Cells(4,?TitleCol)).Select
Application.CutCopyMode?=?False
'定义表格边框线、内线样式
Selection.Borders(xlDiagonalDown).LineStyle?=?xlNone
Selection.Borders(xlDiagonalUp).LineStyle?=?xlNone
With?Selection.Borders(xlEdgeLeft)
'返回或者设置边框的线型。可为下列?XlLineStyle?常量之一:
'xlContinuous、xlDash、xlDashDot、xlDashDotDot、xlDot、xlDouble、xlSlantDashDot?或?xlLineStyleNone。Variant?类型,可读写
.LineStyle?=?xlContinuous
'返回或者设置边框的粗细。可为下列?XlBorderWeight?常量:
'xlHairline、xlThin、xlMedium?或?xlThick。Long?类型,可读写
.Weight?=?xlThin
.ColorIndex?=?xlAutomatic
End?With
With?Selection.Borders(xlEdgeTop)
.LineStyle?=?xlContinuous
.Weight?=?xlThin
.ColorIndex?=?xlAutomatic
End?With
With?Selection.Borders(xlEdgeBottom)
.LineStyle?=?xlContinuous
.Weight?=?xlThin
.ColorIndex?=?xlAutomatic
End?With
With?Selection.Borders(xlEdgeRight)
.LineStyle?=?xlContinuous
.Weight?=?xlThin
.
ColorIndex?=?xlAutomatic
End?With
With?Selection.Borders(xlInsideVertical)
.LineStyle?=?xlDash
.Weight?=?xlThin
.ColorIndex?=?xlAutomatic
End?With
With?Selection.Borders(xlInsideHorizontal)
.LineStyle?=?xlDash
.Weight?=?xlThin
.ColorIndex?=?xlAutomatic
End?With
Selection.C
opy
?num2?=?6
Do?While?num2?<=?num
'循环复制表格线样式
Range(Cells(num2,?1),?Cells(num2?+?3,?TitleCol)).Select
'接上行删除上行尾的连字符,复制表格线样式
Selection.PasteSpecial?Paste:=xlFormats,?Operation:=xlNone,?SkipBlanks:=False,?Transpose:=False
num2?=?num2?+?5
Loop
Application.CutCopyMode?=?False????'关掉剪切状态,也就是闪闪的虚框
Application.ScreenUpdating?=?True??'恢复屏幕同步刷新
Application.DisplayAlerts?=?False??'程序退出时不显示信息,比如剪贴板有资料时退出的提示.
response?=?MsgBox("转换完毕!?谢谢您的使用,?反馈及建议请及时联络我.",?vbOKOnly?+?vbInformation?+?vbDefaultButton0,?"工资表转换成工资条",?"",?0)
End?Sub
12、关于宏和程序
我现在已经用excel编了一个较完整的程序,并且能够给源程序加密码,实现"工程不可见",但是我发现在vba编辑环境?里还能看到我的大部分宏,虽然说不能编辑,但能运行,请问如何隐藏起来
Q、不用模块函数,重写成类或放到workbook中,或在程序中直接将菜单宏隐藏。或:新建类,然后将模块中的程序拷贝到类,提示:不到宏。
13、关于字符的比较!!!"3">"10"
一串数字,但是字符型的
"1","2",...."10","11",.....,"230","231"
我用>,?<?号进行比较,发现"3"是>"10",“3”>"230"的,由于程序限制,不能把这些转化为数字型
那么如何做到"3"<"10","3"<"230",我想到用字符的长度进行较,如何实现
Q、程序中可以用以下代码实现:
????columns("a:a").select
????selection.sort?key1:=range("a1"),?order1:=xlascending,?header:=xlguess,?_
????????ordercustom:=1,?matchcase:=false,?orientation:=xltoptobottom,?sortmethod?_
????????:=xlpinyin,?dataoption1:=xlsorttextasnumbers
注意其中的?dataoption1:=xlsorttextasnumbers
在工作表中手工操作时,选[i]数据[/i]菜单中的[i]排序[/i],然后在弹出的对话框中按[i]选项[/i],确认后会再弹出一个对话框,选第一项,确定就可以了
Q2、val("3")<val("10")
14、获得当前机器名和Excel用户名的代码
Private?Declare?Function?GetComputerName?Lib?"kernel32"?Alias?"GetComputerNameA"?(ByVal?lpBuffer?As?String,?_
????????????????????????????????????????????????nSize?As?Long)?As?Long
Private?Declare?Function?GetUserName?Lib?"advapi32.dll"?Alias?"GetUserNameA"?_
????????????????????????????????????????????????????????(ByVal?lpBuffer?As?String,?_
????????????????????????????????????????????????????????nSize?As?Long)?As?Long
Sub?Get_Computer_Name()
????'获得当前的机器名称
????Dim?Comp_Name_B?As?String?*?255
????Dim?Comp_Name?As?String
????GetComputerName?Comp_Name_B,?Len(Comp_Name_B)
????Comp_Name?=?Left(Comp_Name_B,?InStr(Comp_Name_B,?Chr(0)))
??????MsgBox?"您正在使用的这台机器名为:"?&?Comp_Name,?vbOKOnly,?"WINAK"
End?Sub
Sub?Get_User_Name()
????????Dim?lpBuff?As?String?*?25
????Dim?ret?As?L
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论