2016-12-30 14 views
4

Ich suche nach einer Möglichkeit, durch die Zellen im Arbeitsblatt zu durchlaufen, um Werte einzufügen.VBA Iterate durch Zellen

Der unten angegebene Code erkennt die Zellenpositionen nicht. Gibt es eine Möglichkeit, den Zellstandort zu wiederholen, um die Informationen schrittweise in die gewünschten Bereiche einzufügen? Ich möchte, dass der Code den Wert zuerst in A1: C1 einfügt und dann über 4 Leerzeichen bewegt und an E1: G1 und so weiter schreibt.

Nicht sicher, wie die Buchstaben durchlaufen werden, um die Zelle zu verschieben.

Sub test() 

Dim x As Integer 
Dim y As Integer 
Dim InputSheet As Worksheet 
Dim myBook As Workbook 

Set myBook = Excel.ActiveWorkbook 
Set InputSheet = myBook.Sheets("InputSheet") 

For y = 0 To 5 
    x = 4 
    InputSheet.Range("A1 + 4*y : C1 + 4*y").Value = x 
Next y 

End Sub 
+0

['.Offset()' und '.Resize()'] (https://www.businessprogrammer.com/power-excel-vba-secret-avoid-using-select/) sind deine Freunde. – ja72

Antwort

2

Sie erzählen die Arbeitsmappe buchstäblich Bereich suchen "A1 + 4 * y: C1 + 4 * y", die offensichtlich keine gültige Adresse ist. Sie müssen den numerischen Ausdruck außerhalb der Zeichenkette auswerten, zurück in eine Zeichenkette konvertieren (entweder explizit mit Cstr) oder Sie können den Ausdruck in Klammern setzen und den Compiler das für Sie tun lassen, da VBA dynamisch typisiert ist, was ein wichtiges Konzept ist Im Grunde ist es in der Lage, aus dem Kontext herauszufinden, dass es sich um eine Variable vom Stringtyp handelt) und es schließlich wieder an Ihre Adresse anzuhängen, damit dies funktioniert.

Da Sie scheinen neu zu VBA/Codierung Ich würde Ihnen raten, herauszufinden, wie Sie Haltepunkte und Uhren verwenden, um zu sehen, wie Ihre Maschine tatsächlich Ihre Variablen bewertet.

InputSheet.Range("A" & (1+4*y) & ":C" & (1+4*y)).Value = x 
+1

Danke für die Informationen, die Haltepunkte und Uhren scheinen definitiv bessere Möglichkeiten, um Probleme im Code zu identifizieren. Bevor ich im gesamten Code msgbox hinzufügen würde, um Werte von Variablen zu überprüfen, um zu sehen, wo etwas schief gelaufen ist. – SgtYui

+0

Hey, wir haben alle angefangen :-) herauszufinden, wie man auf die effizienteste Weise debuggen kann, ist ein großer Meilenstein (und ich habe immer noch Probleme damit, haha) Viel Glück !! –

+1

FWIW 'Cstr' Wrapper wird hier nicht benötigt @SgtYui –

2

Ich würde versuchen, "Zellen" zu verwenden, um dies zu tun.

Sub test() 

Dim x As Integer 
Dim y As Integer 
Dim InputSheet As Worksheet 
Dim myBook As Workbook 

Set myBook = Excel.ActiveWorkbook 
Set InputSheet = myBook.Sheets("InputSheet") 

For y = 0 To 5 
    x = 4 
    InputSheet.Range(InputSheet.Cells(1, 4 * y + 1), InputSheet.Cells(1, 4 * y + 3)).Value = x 
Next y 

End Sub 
+0

Das ist gut zu wissen, dass ich die Zellenorte direkt in ganze Zahlen übersetzen kann, anstatt mit den Buchstaben umzugehen. Vor allem, wenn sie zu AA übergehen. – SgtYui

2

Sie könnten die Offset-Funktion verwenden.

For i = 0 to 5 
    x = 4 
    InputSheet.Range("A1:C1").Offset(0, i * 4) = x 
Next i 
0

Ich habe den folgenden Code, weil ich auch einige Laufzeitfehler hatte. Ich hoffe es hilft.

Dim wb As Workbook 

Dim ws As Object 

Set wb = Workbooks("Libro2") 

Set ws = wb.Sheets("Hoja1") 

For i = 1 To 10000 

     Dim strrangoa As String 
     Dim strrangob As String 
      'Creating a string variable replaces selecting the cell 
      strrangoa = "A" & i 
      strrangob = "B" & i 
      'If the active cell does not have data, it exits the loop 
      If ws.Range(strrangoa).Value = "" Then 
       GoTo Salir 
      Else 
      'The data from cells in Column A are passed to Column B 
       ws.Range(strrangob).Value = ws.Range(strrangoa).Value 
      End If 

Next 

Salir: 

End Sub 
0

Ok, hier jede andere Antwort hat es versäumt, die .Resize() Funktion verwenden, um einen Bereich von Zellen auszuwählen, die die empfohlene Methode ist.

Option Explicit 

Sub Test() 

    Dim x As Integer 
    Dim y As Integer 
    Dim InputSheet As Worksheet 
    Dim myBook As Workbook 

    Set myBook = Excel.ActiveWorkbook 
    Set InputSheet = myBook.Sheets("InputSheet") 

    For y = 0 To 5 
     x = 4 
     ' Start for "A1", move down 4*y rows, and select 
     ' one row and 3 columns to set the value 
     InputSheet.Range("A1").Offset(4*y, 0).Resize(1, 3).Value = x 

     ' Similar to using the `.Cells()` method 
     ' InputSheet.Range("A1").Cells(4*y+1, 1).Resize(1, 3).Value = x 
    Next y  

End Sub 

PS. Sie können auch Dinge wie

InputSheet.Range("A2").Resize(1,3).Value = Array(1,2,3) 

Um Zellen A2, B2, C2 zu 1,2,3

oder

InputSheet.Range("A2").Resize(3,1).Value = _ 
      WorksheetFunction.Transpose(Array(1,2,3)) 

So stellen Sie die Zellen A2, A3, A4 auf 1 gesetzt, 2,3


lesen here von Microsoft, wieverwenden, .Offset() und .Cells().