计算列中的行数

时间:2018-01-31 04:19:14

标签: excel vba excel-vba ms-word word-vba

我想在列#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中,这个属性可用?

3 个答案:

答案 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,那么这可能会导致你的错误。

以这种方式思考:所有工作表都是工作表,但并非所有工作表都是工作表。