运行 VBA 加载项时出错

error while running VBA add-in

我正在 Excel 2010 年的 .xlam 文件中编写一个 VBA 宏。

当我尝试 运行 时,我得到了这个错误:

object variable or with block variable not set

它应该交换特定 table 中的列,当我 运行 它只是一个宏(不在加载项中)时,它工作得很好。 这是我的宏:

Sub SwapTable(ByVal control As IRibbonControl)
Dim LastCol As Long
Dim LastRow As Long
Dim Swaps As Long
Dim i As Integer
Dim DocumentTitle As String
Dim SearchDetails As String

LastRow = LastRowInOneColumn()
LastCol = LastColumnInOneRow(LastRow)
StartTitlesRow = Find_TitlesRow()
'copy title rows
With ActiveSheet
    DocumentTitle = .Cells(StartTitlesRow - 3, 1).Value
    SearchDetails = .Cells(StartTitlesRow - 2, 1).Value
End With

'check how many swaps needed
If LastCol Mod 2 = 0 Then
    Swaps = LastCol / 2
Else
    Swaps = (LastCol - 1) / 2
End If

'run swap
For i = 1 To Swaps
   Call Swap(i, LastCol - i + 1, LastRow, StartTitlesRow - 1)
Next i

'past title rows
With ActiveSheet
    .Cells(StartTitlesRow - 3, 1) = DocumentTitle
    .Cells(StartTitlesRow - 2, 1) = SearchDetails
End With
Worksheets(1).Columns("A:EE").AutoFit
End Sub



Function LastColumnInOneRow(LastRow As Long) As Long
'Find the last used row in a Column: column A in this example
Dim LastCol As Long
With ActiveSheet
        LastCol = .Cells(LastRow, .Columns.Count).End(xlToLeft).Column
End With
LastColumnInOneRow = LastCol
End Function

Function LastRowInOneColumn() As Long
'Find the last used row in a Column: column A in this example
Dim LastRow As Long
With ActiveSheet
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
LastRowInOneColumn = LastRow
End Function


Function Find_TitlesRow() As Long

Dim SearchString As String
Dim StartTitlesRow As Long

SearchString = "ùåøä"

With ActiveSheet
    Set cl = .Cells.Find(What:=SearchString, _
        After:=.Cells(1, 1), _
        LookIn:=xlValues, _
        LookAt:=xlPart, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, _
        MatchCase:=False, _
        SearchFormat:=False)

        If Not cl Is Nothing Then
            StartTitlesRow = cl.Row
        Else
            MsgBox "Could'nt find start row"
        End If
End With

Find_TitlesRow = StartTitlesRow
End Function


Function Swap(Col1 As Integer, Col2 As Integer, LastRow As Long,     StartTableRow As Variant)
Dim FirstCol As Variant
Dim SecondCol As Variant
Dim temp As Variant

    temp = Sheets(1).Range(Cells(StartTableRow, Col1), Cells(LastRow, Col1)).Value
    Sheets(1).Range(Cells(StartTableRow, Col1), Cells(LastRow, Col1)).Value = Sheets(1).Range(Cells(StartTableRow, Col2), Cells(LastRow, Col2)).Value
    Sheets(1).Range(Cells(StartTableRow, Col2), Cells(LastRow, Col2)).Value = temp

End Function

避免使用 ActiveSheet!它只会给你带来类似你遇到的问题,你不确定它引用的是哪个 sheet 。出于同样的原因,避免 ActiveWorkbook

相反,获取对 sheet 您想要使用的引用:

Dim oWb As Workbook
Dim oSheet As Worksheet

Set oWb = Workbooks("[WORKBOOKNAME]")
'***** or use index like Workbooks(1)

If Not oWb Is Nothing Then
    Set oSheet = oWb.Sheets("[WORKSHEETNAME]")
    '***** or use index like Sheets(1)
End If

If Not oSheet Is Nothing Then
    '***** Do your stuff

    'past title rows
    With oSheet
        .Cells(StartTitlesRow - 3, 1) = DocumentTitle
        .Cells(StartTitlesRow - 2, 1) = SearchDetails
    End With

    '***** etc

End If

或者您可以像在某些地方已经使用的那样使用索引,但您还需要指定一个工作簿,以避免使用 ActiveWorkbook:

oWb.Worksheets(1).Columns("A:EE").AutoFit