excel - VBA 新手 : Compile Error Invalid Qualifier.

标签 excel vba

此代码旨在获取原始数据的电子表格,省略几列,并重新格式化剩余的内容。我欢迎对代码的任何和所有批评,因为我是 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/

相关文章:

excel - 如何设置依赖于具有可变位置的另一个单元格的单元格值

VBA 检查十进制值是否只有 2 个小数点。使用 Int() 时出错

excel - 选择要与选择本身联合的选择标题?

Excel vba GetPrivateProfileString 工作 2007,但不是 2010

VBA:如何允许在 protected 工作表上打开和关闭过滤器?

excel - Perl 使用 OLE 写入 Excel 工作表

excel - 如何从excel文件中读取数据并显示在我的 View 中?

excel - 如何让 VBA 函数存储单元格地址值而不是这些单元格地址处的值

vba - Excel VBA - 几秒钟后调用宏来清除状态栏

vba - 如何使用VBA将某些记录添加到某些工作表