有一段EXCEL VBA代码,部分语句看不太懂,买的书上也没有找到。求解释
插入用户窗体
C1、C2为两个按钮,cd1为CommonDialog 控件(如果没有需要安装VB6)
注明 这一步可以让人检查(即鼠标要能动)不能实现,你可以看到选择的部分但是不能在文件里面动鼠标,如果你懂得VBA运行机制的话,这个你就不应该提的
Dim gg As String
Private Sub C1_Click()
On Error Resume Next
CD1.Filter = "EXCEL (*.xls)|*.xls"
CD1.FilterIndex = 1
CD1.ShowOpen
If Err.Number = 32755 Then Exit Sub
If CD1.Filename "" Then
Workbooks.Open Filename:=CD1.Filename
TextBox1.Text = CD1.Filename
Windows(CD1.FileTitle).Activate
gg = Cells(2, 4)
If gg = "语文" Then
Range("D3", Range("E3").End(xlDown)).Select
Else
Range("D3", Range("D3").End(xlDown)).Select
End If
Selection.Copy
C2.Enabled = True
End If
End Sub
Private Sub C2_Click()
Windows("主文件.xls").Activate
Select Case gg
Case "语文"
Range("D2").Select
Case "数学"
Range("F2").Select
Case "英语"
Range("G2").Select
Case "物理"
Range("H2").Select
Case "化学"
Range("I2").Select
Case "生物"
Range("J2").Select
End Select
ActiveSheet.Paste
End Sub
Dim d as New Dictionary,这句话等效于下面两句:
Dim d as Dictionary
Set d = New Dictionary
表示声明了一个Dictionary类型的对象型变量,并且创建了一个Dictionary对象的实例,可以通过d这个变量来操控。
Set d = CreateObject("Scripting.Dictionary"),如果这句话出现在Dim d as New Dictionary后面,那么其实做了两件事。
首先,在Dim d as New Dictionary这句话里面创建的Dictionary对象不再指派到变量d上,至于这个对象现在处境如何,我们完全交给VBA来安排,不管。
其次,通过CreateObject函数创建了一个Scripting类型库下的Dictionary类,然后让d来操控这个类。
需要指出的是,这段代码写的是有问题的。因为在执行了CreateObject函数后,第一句话中创建的Dictionary类完全失去了作用,变成了一个游荡者的幽灵,你没办法重新让这个类绑定到变量上,又没办法完全消除这个类,只能指望着VBA本身来接受这个烂摊子。也就是说,这两句代码导致了多余对象实例的创建。
不过,更复杂的是,你现在有两个版本的Office,就有两个版本的VBA,他们对于这种不符合规范的代码如何处理,我没有了解过,显然,他们的处理方式不一样。
在VBA中,(VB6一样),通常都不建议采用Dim var as New Class的方式,因为很难调试、控制。正规路子是:
Dim var as Class
Set var = New Class
最后那句 Set d = Nothing,表明在内存中释放这个类的实例,这样的话这个被创建并且绑定到d上的类实例就完全清除了,这是写代码的好习惯,甚至说是一种必须,一般不要删除。否则这个实例就又变成了幽灵,只能指望着VBA自己来处理了。
我建议你作如下尝试:
先尝试如下方法:
Dim d as Dictionary
Set d = New Dictionary
如果不行,尝试:
Dim d as Dictionary
Set d= CreateObject("Scripting.Dictionary")
还是不行,尝试:
Dim d as Object
Set d= CreateObject("Scripting.Dictionary")
其中最后一种方法在调试上很麻烦,尤其是当Dictionary出现错误时,不知道具体是什么错误,因此尽量不要使用。
这一句呀,r是上面一句获取的最后一个行号,反正是个数值,这里假如r是100
那么arr = .Range("a2:b" & r) 就可以写成 arr = .Range("a2:b100")
意思就是把Range("a2:b100") 把区域的数据放到一个叫arr的二维数据里面。
--------------------------------------------------------
brr(1, m) = arr(i, 1): brr(2, m) = arr(i, 2) 这句中的冒号 就是把本来要写在两行的代码写在一行的做法,等价于
brr(1, m) = arr(i, 1)
brr(2, m) = arr(i, 2)
这样就好理解了哦,就是给brr 数组赋值,赋的是arr的数据
-----------------------------------------------------
[a1].CurrentRegion.Offset(1).ClearContents 这句分开理解,
最主要的后面一个ClearContents 就是清空内容的意思
[a1].CurrentRegion.Offset(1) 这一堆其实就定位要清空内容单元格的地址
[a1].CurrentRegion 是从A1开始和A1相连接的有数据的单元格区域
offset 是区域偏移用的,
------------------------------------------------------------
.[a2:b2].Resize(m) = Application.Transpose(brr)这句总体意思是把数组内容回写但单元格里面,
.[a2:b2].Resize(m) 中的resize是重新调整选区大小的意思,.[a2:b2].Resize(m) 就是把[a2:b2] 扩大M行,假如m是50,区域到时候就是A2:B51 了,
后面的Application.Transpose(brr) 就是把brr数组转置的意思,就是把原来的行变成列,原来的列变成行
------------------------------------------------
大致就这样,这些都是很基础的东西,你要把书全看了,肯定就都明白了
原云玉屏: 代码如下: sub m() selection.value=int(rnd*10)+1 end sub
海曙区19121194916: 请教excel 中的一段vba代码 - ?
原云玉屏: sub test () dim arr,brr,x&,y& arr=sheet1.usedrange '把原数据赋值给数组arr redim brr(1 to ubound(arr)*10,1 to ubound(arr,2))'定义一个数组行数是arr的10倍 for x=1 to ubound(arr) for y=1 to ubound(arr,2) brr(x*10,y)=arr(x,y) next y next x sheet1.range("A1").resize(ubound(brr),ubound(brr,2))=brr'把新数组写入工作表中 end sub
海曙区19121194916: 有一段EXCEL VBA代码,部分语句看不太懂,买的书上也没有找到.求解释 - ?
原云玉屏: arr = .Range("a2:b" & r) 这一句呀,r是上面一句获取的最后一个行号,反正是个数值,这里假如r是100 那么arr = .Range("a2:b" & r) 就可以写成 arr = .Range("a2:b100") 意思就是把Range("a2:b100") 把区域的数据放到一个叫arr的二维...
海曙区19121194916: 求一段excel vba循环代码 - ?
原云玉屏: Sub FontFormat() Dim rngSelect As Range Set rngSelect = Worksheets("Sheet1").Range("A1:G10")For Each Cell In rngSelectWith Cell.Characters(Start:=8, Length:=1).Font.Name = "宋体".FontStyle = "常规".Size = 16End WithNext End Sub代码基本上是这样的,可以根据你的需要修改一下.
海曙区19121194916: 如何使用VBA代码将EXCEL中一部分区域的单元格进行从小到大排序,并填充在制定的区域内?求详细代码. - ?
原云玉屏: 因为截图不全,我这里先假设数据区为A1:F9, 填充区为H1:M9 代码如下: Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim arr1(1 To 54), arr2(1 To 54) Dim x, y, z As Integer Dim b, c Dim a As Variant z = 1 x = 1 y = 1 c = ...
海曙区19121194916: 求一段VBA代码,实现excel中3个工作表筛选相同数据,谢谢 - ?
原云玉屏: 按alt +f11复制代码到代码区 Sub ABC() For x = 2 To 58 If Sheets("第一个表的名字").Range("F" & x) = "" Then Exit Sub For x1 = 2 To 58 If Sheets("第一个表的名字").Range("F" & x) = Sheets("第二个表的名字").Range("F...
海曙区19121194916: 求一段Excel导出TXT的VBA代码 - ?
原云玉屏: 下面的这个是按照你所说的,仅仅根据第二行的第一列的值,如果是空或者“追加”,则输出第二行的值到TXT里面.如果第二行的列数比较多(大于256列)且你用的是2007及以上的版本,请将下文中的256改为16384.Public Sub TextOutPut() ...
海曙区19121194916: 求一段excel vba代码,用于将子表行合并到父表,结果:父行1(若干子行)父行2(若干子行) - ?
原云玉屏: 假设你的第一行是标题行从第二行开始 Sub 合并() Endcol1 = Sheet1.[iv1].End(xlToLeft).Column endrow1 = Sheet1.Range("B65536").End(xlUp).Row endcol2 = Sheet2.[iv1].End(xlToLeft).Column endrow2 = Sheet2.Range("B65536").End(...
海曙区19121194916: excel vba 求解释这段代码 - ?
原云玉屏: C 判断最后一个非单元格 cells(rows.count,3).end(3).row 复制使用:range("a1:B100").copy range("a1") 参照,地址自己修改
海曙区19121194916: 求一段vba代码,很简单,但实用 - ?
原云玉屏: Sub BeFile()Set fs = CreateObject("Scripting.FileSystemObject")'Set a = fs.CreateTextFile("C:\a.txt", True)If fs.FileExists("C:\a.txt") = False ThenDim strPath As StringstrPath = Application.ActiveWorkbook.FullNameApplication....