2017-02-10 2 views
1

Dies ist das erste Mal, dass ich selbst ein Makro schreibe und zwei kleine Probleme habe.VBA-Laufzeitfehler 1004 "Anwendungsdefinierter oder objektdefinierter Fehler" mit Bereich

Aufgabe des Makros: Kopieren Sie Informationen eines Dokuments in ein anderes Dokument in einer bestimmten Spalte, wenn die Spalte leer ist, sollte in diesem Fall die nächste Spalte verwendet werden.

Dies ist der Code so weit:

Sub CopyData() 

    Dim i As Long 
    Dim wbA As Workbook 
    Dim wbN As Workbook 
    Dim Filepath As String 

    i = 7 
    Set wbA = ThisWorkbook 

    Filepath = "C:\Users\sebastian\Desktop\assessment answers" 

    Do 
     If IsEmpty(wbA.Sheets("Answers").Cells(1, i)) Then 

      Set wbN = Workbooks.Open(Filepath) 

      If Cells(37, 3).Value = 31 Then 

       wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _ 
       Destination:=wbA.Sheets("Answers").Range(Cells(36, i), Cells(45, i)) 

      ElseIf Cells(37, 3).Value = 41 Then 

       wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _ 
       Destination:=wbA.Sheets("Answers").Range(Cells(46, i), Cells(55, i)) 

      ElseIf Cells(37, 3).Value = 51 Then 

       wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _ 
       Destination:=wbA.Sheets("Answers").Range(Cells(56, i), Cells(65, i)) 

      Else 

       MsgBox "There could be a problem with the data, please check if the candidate has selected a topic." 
       Exit Sub 

      End If 

      wbN.Sheets("Answers").Range(Cells(2, 4), Cells(3, 4)).Copy _ 
      Destination:=wbA.Sheets("Answers").Range(Cells(1, i), Cells(2, i)) 

      wbN.Sheets("Answers").Range(Cells(7, 4), Cells(36, 4)).Copy _ 
      Destination:=wbA.Sheets("Answers").Range(Cells(6, i), Cells(35, i)) 

      wbN.Close 

      Exit Sub 

     Else 

      i = i + 1 

     End If 

    Loop 

End Sub 

1. Das Problem (VBA Runtime Error 1004) tritt hier nach: Wenn Zellen (37, 3) .Value = 31 Dann Wenn ich .Range("D37:D46") und Bereiche für die anderen Zellen verwende, funktioniert es, aber ich möchte die Spalte mit der Schleife vergrößern, wenn bereits Daten ausgefüllt sind. Hast du eine Idee, das zu lösen?

2. Gibt es eine Möglichkeit, den Dateipfad zu ändern, sodass derjenige, der ihn jemals verwendet, auf den Desktop geleitet wird, auf dem sich die Datei befinden soll?

Filepath = "C:\Users\sebastian\Desktop\assessment answers" 

Vielen Dank für Ihre Ideen,

Sebastian

+1

Re 1 ist dieses Problem in vielen Fragen hier abgedeckt. Sie müssen die 'Cells'-Aufrufe auch mit einem Arbeitsblatt qualifizieren:' wbN.Sheets ("Answers"). Range (wbN.Sheets ("Answers"). Zellen (37, 4), wbN.Sheets ("Answers") .Cells (46, 4)) '. Wenn Sie eine Variable für das Blatt oder eine With-Anweisung verwenden, wird sie aufgeräumt. – Rory

+0

Sie müssen angeben, Zellen (37,3) .Wert ist aus welcher Arbeitsmappe und welches Blatt. Ich denke, das kann die Fehlermeldung lösen. Wenn ich Ihren Code teste, wird kein Fehler angezeigt. –

+0

Als Antwort auf Problem 1: https://support.microsoft.com/en-us/help/210684/copying-worksheet-programmatical-causes-run-time-error-1004-in-excel Betreffend Problem 2: Sie können Referenz Desktop wie folgt: Environ $ ("USERPROFILE") & "Desktop" aber ich bin mir nicht sicher, wie zuverlässig es ist, Sie sind besser, diesen workbook.path zu verwenden, wenn die Datei auf dem Desktop sowieso – User632716

Antwort

0

Für andere, die interessiert sein könnten, poste ich meine Lösungen hier:

Problem 1:

Nach den Vorschlägen von Rory und Naing Win Htun ich den Weg vor den Zellen eingeschlossen. Natürlich hätte ich es auch mit mit machen können.

wbN.Sheets("Answers").Range(wbN.Sheets("Answers").Cells(37, 4), wbN.Sheets("Answers").Cells(46, 4)).Copy _ 
Destination:=wbA.Sheets("Answers").Range(wbA.Sheets("Answers").Cells(36, i), wbA.Sheets("Answers").Cells(45, i)) 

Problem 2:

Der Benutzer kann nun Eingang der Pfad und der Name der Datei manuell, was offensichtlich eine weit bessere Lösung ist. Dies wurde auch von Naing Win Htun vorgeschlagen.

Vielen Dank für Ihre Hilfe.

0

Fehlernummer 1004 normalerweise bedeutet: "Ich kann nicht finden, was Sie suchen".

Für dieses spezielle Beispiel sehen Sie diesen Fehler, weil Sie mit Ihrer Codierung nicht explizit genug sind. Es ist besser, OTT wenn überhaupt zu gehen.

Also statt

If Cells(37, 3).Value = 31 Then 

Verwendung:

If wbA.Sheets("Sheet Name Here").Cells(37, 3).Value = 31 Then 

besser sind auch eine 'mit' Anweisung in Ihrem Code. Ein allgemeines Beispiel ist unten:

Sub Example() 

    Dim wb As Workbook 
    Dim sht As Worksheet 

    Set wb = ActiveWorkbook 
    Set sht = wb.ActiveSheet 

    With sht 
     .Name = "New Name" 
     .Visible = xlSheetVisible 
     .Protect 
    End With 

End Sub 

Das spart Ihnen eine Menge Tipparbeit und ermöglicht es Ihnen, mehrere Dinge auf ein Objekt in einem Schlag zu tun.

Verwandte Themen