此代码旨在获取原始数据的电子表格,省略几列,并重新格式化剩余的内容。我欢迎对代码的任何和所有批评,因为我是 VBA 新手并且一无所知。关键问题在下面用 astriscs 指示的行的代码末尾。这是“编译错误:无效的限定符”出现的地方。我正在尝试将格式应用于 B 列和 F 列,但我只希望它一直到日期的最后一行。最后一行数据会因一张纸而异。
当错误被触发时,调试器会突出显示单词“count”。
在此先感谢您的帮助。
Sub Macro2()
'
' Macro2 Macro
'
Union(Range("A:A"), Range("F:F"), Range("K:Q"), Range("S:V")).Delete
Range("A1").Select
ActiveCell.FormulaR1C1 = "FIRST"
Range("B1").Select
ActiveCell.FormulaR1C1 = "LAST"
Range("C1").Select
ActiveCell.FormulaR1C1 = "G"
Range("D1").Select
ActiveCell.FormulaR1C1 = "PHONE"
Range("E1").Select
ActiveCell.FormulaR1C1 = "ADDRESS"
Range("F1").Select
ActiveCell.FormulaR1C1 = "CITY"
Range("G1").Select
ActiveCell.FormulaR1C1 = "STATE"
Range("H1").Select
ActiveCell.FormulaR1C1 = "ZIP"
Range("I1").Select
ActiveCell.FormulaR1C1 = "MONTH"
Range("J1").Select
ActiveCell.FormulaR1C1 = "YEAR"
Columns("e:h").Insert Shift:=xlToRight
Columns("A:B").ColumnWidth = 12
Columns("C:C").ColumnWidth = 2
Columns("D:d").ColumnWidth = 13
Columns("e:e").ColumnWidth = 0.38
Columns("F:F").ColumnWidth = 5
Columns("G:G").ColumnWidth = 11
Columns("H:H").ColumnWidth = 0.38
Columns("I:N").ColumnWidth = 14
**Union(Range("B:B"),Range("F:F")).Rows.Count.End(xlUp).Row**
Range("B1").Activate
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.599993896298105
.PatternTintAndShade = 0
End With
End Sub
最佳答案
当我对通过字符串属性创建的对象类型感到困惑时,我会使用这种技术。
如果您没有希望以这种方式使用的现有模块,请在 Excel 的 Visual Basic 编辑器中创建一个新模块。如果您在 Project Explorer 中选择模块并单击 F4,您可以将模块的名称更改为“Experiments”,例如。
输入或复制:
Option Explicit
Sub TestA()
End Sub
我 总是 以
Option Explicit
开始我的模块.看Option Explicit
在 VBA 帮助中,它会告诉你为什么这是一个好主意。我还创建了一个空子例程,我将在其中键入一些语句。
开始输入新语句,以便您拥有:
Sub TestA()
Debug.Print Range("B:B").
End Sub
当您在此新行的末尾键入句点时,弹出窗口将显示可用的方法和属性。正如预期的那样,此列表将显示 Range 的所有方法和属性。键入“地址”或从列表中选择地址以获取:
Sub TestA()
Debug.Print Range("B:B").Address
End Sub
单击 F5 运行此宏,立即窗口中将出现以下内容:
$B:$B
这是 B 列中所有行的地址,这是您所期望的。
现在向宏添加另外两个语句:
Debug.Print Range("F:F").Address
Debug.Print Union(Range("B:B"), Range("F:F")).Address
再次运行这个宏,你会得到:
$B:$B
$F:$F
$B:$B,$F:$F
这又是预期的结果。
现在添加:
Debug.Print Union(Range("B:B"), Range("F:F")).Rows.
出现的弹窗将不变,因为
Range.Rows
仍然是一个范围。通过添加或选择“地址”来完成语句并再次运行宏以获得:
$B:$B
$F:$F
$B:$B,$F:$F
$B:$B,$F:$F
这可能不是您所期望的,但请考虑一下。
$B:$B,$F:$F
是 B 列和 F 列中的所有行,因此添加属性 Rows
不改变地址。现在将以下语句添加到宏中:
Debug.Print Union(Range("B:B"), Range("F:F")).Count
Debug.Print Union(Range("B:B"), Range("F:F")).Rows.Count
运行宏,这些语句将分别输出一个整数。我正在使用 Excel 2003,所以我得到:
131072
65536
如果您使用的是更高版本的 Excel,您将获得更大的整数。第二个整数是您的 Excel 版本的工作表中的行数。第一个整数是您的 Excel 版本的工作表的两列中的单元格数。
现在添加:
Debug.Print Union(Range("B:B"), Range("F:F")).Rows.Count.
当您键入最后一个句点时,不会出现弹出窗口,因为整数没有您可以通过这种方式选择的方法或属性。方法
.End(xlUp)
在一个范围内操作;它不是 Count
的属性这就是为什么你得到“无效的限定符”。将属性串在一起时很容易混淆。就我个人而言,我避免使用字符串属性,因为即使运行速度更快,我也需要更长的时间来理解和调试。在某些情况下,最小化运行时间是重中之重,但这是其中一种情况吗?你用这种方法浪费了多少时间?
考虑:
Dim Rng1 As Range
Dim Rng2 As Range
Dim Rng3 As Range
Dim RowMax As Long
Set Rng1 = Range("B:B")
Set Rng2 = Range("F:F")
Set Rng3 = Union(Rng1, Rng2)
RowMax = Rng3.Count
Debug.Print RowMax
Debug.Print Rng3.Find("*", Range("B1"), xlValues, xlWhole, xlByRows, xlPrevious).Row
你不需要
RowMax
但我已将其包含在内,因此您绝对清楚 Rng3.Count
是什么返回。我也用范围去了OTT。我很乐意输入:Set Rng3 = Union(Range("B:B"), Range("F:F"))
因为我觉得很容易理解。方法
.End(xlUp)
在一个单元格上运行。 MultiCellRange.End(xlUp).Row
是有效的语法,但我无法让它返回有用的信息。如果你想使用 .End(xlUp)
考虑: Dim RowMaxColB As Long
Dim RowMaxColF As Long
RowMaxColB = Cells(Rows.Count, "B").End(xlUp).Row
RowMaxColF = Cells(Rows.Count, "F").End(xlUp).Row
我同意悉达多,
Find
在这种情况下似乎是最好的方法。但是,你应该看看我的这个答案,https://stackoverflow.com/a/20849875/973283 ,换一个问题。它包括一个宏,该宏演示了一系列查找最后一行和最后一列的方法,并显示了它们失败的情况。
关于excel - VBA 新手 : Compile Error Invalid Qualifier.,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20929736/