2016-07-05 10 views
0

Ich schreibe ein VBA-Makro in Excel 2010 in einer .xlam-Datei.Fehler beim Ausführen von VBA-Add-In

Wenn ich versuche, es zu laufen ich diesen Fehler:

object variable or with block variable not set

Es sollte Spalten in bestimmten Tabelle tauschen, und wenn ich laufe es als nur einen Makro (nicht in der Add-In) ist es funktioniert perfekt. Das ist mein Makro:

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 
+1

Welche Zeile gibt den Fehler? Was ist 'ActiveSheet', wenn Sie es als Add-In ausführen? –

+0

it doent show wich line! und das 'ActiveSheet' ist das Blatt mit der Tabelle. – ALEXM

+1

Das ist seltsam. Normalerweise wird die Cursorposition, wenn das Makro bricht, Ihnen eine Idee geben, welche Zeile. Wiederholen: Was ist 'ActiveSheet', wenn Sie es als Add-In ausführen? –

Antwort

2

Vermeiden Sie ActiveSheet! Es wird Ihnen nur Probleme geben wie das, das Sie haben, wo Sie nicht sicher sind, auf welches Blatt es verweist. Vermeiden Sie ActiveWorkbook, während Sie gerade dabei sind, aus dem gleichen Grund.

Stattdessen erhalten einen Verweis auf das Blatt mit dem Sie arbeiten wollen:

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 

Oder Sie könnten einen Index verwenden, wie Sie bereits in einigen Orten zu tun, aber Sie müssen auch eine Arbeitsmappe angeben, zu Vermeiden Sie die Verwendung von ActiveWorkbook: