2016-08-20 3 views
0

Dies ist mein Code zum Kopieren eines Blattes auf ein neues Blatt. Wenn ich das Programm mit Breakpoint auf Workbooks.Open(path) lief, funktionierte es richtig, aber wenn ich ohne den Haltepunkt lief, öffnete es einfach die Arbeitsmappe, ohne ein Blatt zu erstellen.
Ich habe mein Bestes versucht, um den Fehler zu beheben, aber ich konnte nicht das gewünschte Ergebnis erhalten.VBA Excel-Programm funktioniert nur mit Haltepunkt

Sub CopyCat()  

Dim ws As Worksheet 
Dim no As Integer 
Set ws1 = ActiveSheet 
Dim path As String 

temp_name = InputBox("Enter the Sheet No to be Created", "Enter the Value") 

For Loop1 = 1 To ws1.UsedRange.Rows.Count 
    path = Application.ActiveWorkbook.path & "\" & Application.WorksheetFunction.Trim(Trim(ws1.Cells(Loop1, 1).Value)) & " " & ws1.Cells(Loop1, 2).Value & ".xlsx" 

    Set wb1 = Workbooks.Open(path) 

    'ListBox1.AddItem wb.Name 
    temp_name = "Sheet" & temp_name 

    'error1 = CheckSheet(wb1, temp_name) 
    'If (error1 <> True) Then 
    ws1.Cells(4, 1).Value = "Created" & CStr(Loop1) 
    Set ws = wb1.Worksheets(Sheets.Count) 

    ws.Copy After:=wb1.Sheets(Sheets.Count) 
    Set ws = ActiveSheet 
    ws.Name = temp_name 

    'Call PageSetting 
    wb1.Close SaveChanges:=True 
    ws1.Cells(4, 1).Value = "Created Done" & CStr(Loop1) 
    'Else 
    'wb1.Close SaveChanges:=True 
    'End If 
Next Loop1 

End Sub 


Function CheckSheet(ByVal wb As Workbook, ByVal sSheetName As String) As Boolean 

Dim oSheet As Excel.Worksheet 
Dim bReturn As Boolean 

For Each oSheet In wb.Sheets 

    If oSheet.Name = sSheetName Then 
     bReturn = True 
     Exit For 
    End If 

Next oSheet 

CheckSheet = bReturn 

End Function 
+0

Sie Fehler bekommen Sie? Welcher [Fehlerbehandlungsmodus] (http://stackoverflow.com/q/12687105/11683) ist eingestellt? – GSerg

+0

Kein Fehler, den ich habe. Es öffnete einfach das Blatt, während ich es lief. Aber als ich dieses Modul kopiert und ein neues Modul mit demselben Code erstellt habe, lief es perfekt. Ich weiß nicht, warum es passiert ist, aber es hat funktioniert. –

+0

Es ist noch nicht gelöst –

Antwort

-1

Diese Frage ist ein bisschen vage, also nahm ich ein paar Dinge an, die auf dem von Ihnen bereitgestellten Code basierten.

Sie möchten ein Arbeitsblatt aus einer Arbeitsmappe kopieren, die das Makro in einer anderen Excel-Datei ausführt.

Alle Dateinamen sind im Quellarbeitsblatt, Spalte A aufgeführt - nennen wir es "Interface" Arbeitsblatt.

Sie müssen einen Verweis auf Microsoft Scripting Runtime in Ihrem Projekt hinzufügen, damit das FileSystemObject funktioniert.

Code unten ist nicht sehr gut geschrieben oder optimiert, aber es funktioniert.

Sub CopySht(NamesRange As Range, NameOfSheetToCopy As String) 

Dim fso As FileSystemObject, oFile As File, fPath As String, fNamesArr() As Variant, fFolder As Folder 
Set fso = New FileSystemObject 

Dim InputWb As Workbook, InterfaceWs As Worksheet 
Set InputWb = ThisWorkbook 
Set InterfaceWs = InputWb.Worksheets("Interface") 

Dim SheetToCopy As Worksheet 
Set SheetToCopy = InputWb.Worksheets(NameOfSheetToCopy) 

Set NamesRange = InterfaceWs.Range(NamesRange.Address) 



fNamesArr() = NamesRange.Value 

fPath = InputWb.path 
Set fFolder = fso.GetFolder(fPath) 

Dim i As Integer 

For Each oFile In fFolder.Files 
    For i = LBound(fNamesArr) To UBound(fNamesArr) 
     If oFile.Name = fNamesArr(i, 1) & ".xls" Or oFile.Name = fNamesArr(i, 1) & ".xlsx" Then 

      On Error Resume Next 
      If Not (Workbooks(oFile.Name) Is Nothing) Then 
       Workbooks(oFile.Name).Close SaveChanges:=False 
      End If 

      Workbooks.Open (oFile.path) 

      If Not (CheckSheet(Workbooks(oFile.Name), SheetToCopy.Name)) Then 
       SheetToCopy.Copy After:=Workbooks(oFile.Name).Sheets(1) 
       Workbooks(oFile.Name).Close SaveChanges:=True 
      End If 

      If Not (Workbooks(oFile.Name) Is Nothing) Then 
       Workbooks(oFile.Name).Close SaveChanges:=False 
      End If 

     End If 
    Next i 
Next oFile 


End Sub 

Function CheckSheet(ByVal wb As Workbook, ByVal sSheetName As String) As Boolean 

    Dim oSheet As Excel.Worksheet 
    Dim bReturn As Boolean 

    For Each oSheet In wb.Sheets 

     If oSheet.Name = sSheetName Then 

      bReturn = True 
      Exit For 

     End If 

    Next oSheet 

    CheckSheet = bReturn 

End Function 

Dabei spielt es keine Rolle, ob Sie NamesRange als qualifizierte oder unqualifizierte Bereich Objekt übergeben, wie unten

gezeigt
Sub Wrapper() 

    CopySht Range("A1:A6"), "CopyMe" 
    'CopySht ThisWorkbook.Worksheets("Interface").Range("A1:A6"), "CopyMe" 

End Sub 
+0

Die Frage ist nicht vage. Das Problem besteht darin, dass der OP-Code mit einem Breakpoint arbeitet und ohne ihn nicht funktioniert. Es passiert manchmal in Excel. – GSerg

+0

@GSerg, können Sie das näher ausführen? Warum passiert es manchmal? – hstdggsdtgsdafssarf456

+1

In der Regel aufgrund der Race-Bedingungen im Zusammenhang mit externen Ereignissen. Das Dateisystem ist eine der möglichen Quellen. Wenn Sie einen Haltepunkt treffen, hat das externe Ereignis genug Zeit, um abgeschlossen zu werden, damit der Code fehlerfrei fortgesetzt werden kann. Ein Beispiel wäre das Löschen einer Datei und das sofortige Erstellen der Datei, nur um festzustellen, dass sie noch nicht vollständig gelöscht wurde, sodass die Erstellung fehlschlägt. Es sollte nicht wirklich passieren, aber manchmal. – GSerg

Verwandte Themen