我想在列#34; A"中添加listbox1列表中的数据。在excel中
Sub Macro3()
Dim excelobject As Object, wb As Object, r As Long, i As Integer
Dim hh As Boolean
Dim a As String
Dim b As Integer
Set excelobject = CreateObject("excel.application")
excelobject.Visible = False
Set wb = excelobject.Workbooks.Open("C:\test.xlsx")
Me.ListBox1.Visible = True
Me.ListBox1.Clear
For i = 2 To wb.Sheets(1).Cells(Rows.count, 1).End(xlUp).Row
If InStr(UCase(wb.Sheets(1).Cells(i, 1).Value), UCase(a)) > 0 Then
Me.ListBox1.AddItem wb.Sheets(1).Cells(i, 1).Value
End If
Next i
excelobject.Quit
end sub
但运行wb.Sheets(1).Cells(Rows.count, 1).End(xlUp).Row
msgbox显示"需要对象"。我在哪里写错了,为什么在Excel中,这个属性可用?
答案 0 :(得分:3)
问题出现在xlUp
wb.Sheets(1).Cells(Rows.count, 1).End(xlUp).Row
由于您没有将Excel
库导入或引用到您的项目中,因此您的程序无法通过xlUp
了解您的意思。
幸运的是,您可以通过转到Excel VBA中的任何Visual Basic立即选项卡并只需输入
来获取该常量内的值? xlUp
输出:
-4162
尝试更换您的专线:
wb.Sheets(1).Cells(Rows.count, 1).End(xlUp).Row
这一个:
wb.Sheets(1).Cells(Rows.count, 1).End(-4162).Row
' or if you worry that constant can have different values in
' different Excel versions, you may simply explicitly define it as wb.xlDirection.xlUp
wb.Sheets(1).Cells(Rows.count, 1).End(wb.xlDirection.xlUp).Row
注意:同样的问题也适用于Rows.count
。在这种情况下,您需要明确地将其定义为wb.Sheets(1).Rows.count
:
wb.Sheets(1).Cells(wb.Sheets(1).Rows.count, 1).End(wb.xlDirection.xlUp).Row
答案 1 :(得分:2)
如果我可以提出建议,请务必在访问其他库(例如Word中的Excel)时使用早期绑定。并非所有的库都可以使用早期绑定,但是在使用时,您可以获得智能感知的所有好处,以及所有枚举(xlUp
是其中的一部分)是可见的。此外,代码应该运行得更快。
您必须在工具 - >下勾选Microsoft Excel 15.0 Object Library
。引用...
(可能是13.0,14.0或16.0,具体取决于您的Office版本)
您的代码看起来像
Sub Macro3()
Dim excelobject As Excel.Application, wb As Object, r As Long, i As Integer
Dim hh As Boolean
Dim a As String
Dim b As Integer
Set excelobject = New Excel.Application
excelobject.Visible = False
Set wb = excelobject.Workbooks.Open("C:\test.xlsx")
Me.ListBox1.Visible = True
Me.ListBox1.Clear
For i = 2 To wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
If InStr(UCase(wb.Sheets(1).Cells(i, 1).Value), UCase(a)) > 0 Then
Me.ListBox1.AddItem wb.Sheets(1).Cells(i, 1).Value
End If
Next i
wb.Close
excelobject.Quit
End Sub
我还会在关闭Excel之前关闭工作簿。它可能需要一个像false这样的参数来表示不保存工作表。
正如@ Mat的Mug正确建议的那样,未使用Option Explicit
,未初始化的变量为Variant
,默认情况下初始值为0
。无助于调试。
早期绑定与Option Explicit
一起将在编译时进行更多错误检查,并帮助消除错误。
答案 2 :(得分:1)
所以,我首先担心的是您可能无法正确打开工作簿。可能是错误的路径或文件名。
此外,就像您将.Cells
引用到工作簿一样,您还需要引用Rows.Count
。出于这个原因,我添加了With...End With
语句。
Sub Macro3()
Dim excelobject As Object, wb As Object, r As Long, i As Integer
Dim a
Set excelobject = CreateObject("excel.application")
excelobject.Visible = False
Set wb = excelobject.Workbooks.Open("C:\test.xlsx")
If wb Is Nothing Then
MsgBox "YOU DO NOT HAVE THE CORRECT PATH TO YOUR WORKBOOK"
Exit Sub
End If
With wb.Worksheets(1)
a = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
MsgBox a
excelobject.Quit
End Sub
您还应该避免使用sheets()
而是使用Worksheets()
。虽然在很多情况下,sheet()对你有用,但如果你有一个图表或工作表以外的东西作为索引1,那么这可能会导致你的错误。
以这种方式思考:所有工作表都是工作表,但并非所有工作表都是工作表。