2016-07-21 16 views
0

Ich bin sehr neu in VBA und lerne, einen großen (10 + Jahr) Datensatz zu verarbeiten, um in ein geeignetes Format für Analysen zu konvertieren. Der Datensatz besteht aus 52 verschiedenen Blättern, die auf jedem Blatt das gleiche Layoutformat (jedoch unterschiedlichen Bereich - unterschiedliche Anzahl von Beobachtungen) aufweisen.VBA Handhabung IF/THEN Anweisungen in Schleife für große Datensätze (auf mehreren Blättern)

Diese Daten beziehen sich auf Sichtungen von Elefanten. Momentan habe ich alle ID-Codes für Elefanten in Spalte A, und nachfolgende Spalten sind Beobachtungen an verschiedenen Daten, mit einer 1, um das Vorhandensein einer Person anzuzeigen.

Ich muss alle diese 1s durch den ID-Code für die Einzelperson ersetzen (d. H. Den entsprechenden Zeilentext aus Spalte A). Ich habe eine Eingabe für den benutzerdefinierten Bereich eingerichtet, die das Problem der unterschiedlichen Bereichsgrößen für verschiedene Blätter umgeht. Der Punkt, an dem ich festhalte, ist herauszufinden, welches Argument für die ????? In meinem Code unten: Welches Argument gibt den Text aus der ersten Spalte dieser Zeile zurück?

[Ich hatte ursprünglich ein Makro mit einem wenn, dann = A2 aufgezeichnet, dann gezogen und gefüllt, um den gesamten Bereich. Aber das geht natürlich nicht auf den anderen Blättern].

Was ich bisher habe ist;

Sub ReplaceOneswithIDcode() 
' 
' replace all ones with ID code. 
' 
Dim rng As Range 
Dim InputRng As Range 
Set InputRng = Application.Selection 
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8) 
For Each rng In InputRng 
If rng.Value = 1 Then 
    ????? 
End If 

End Sub 

Natürlich wäre jeder andere logische Ansatz willkommen, der auch funktionieren könnte.

+0

Vielen Dank für die Hilfe - war krank, aber gerne wieder in diese. Sehr geschätzt! –

Antwort

0

Füllen Sie Array("Elephants", "Elephants (2)") mit den Namen der Arbeitsblätter, die Sie verarbeiten möchten. Sie betrachten und die Spaltennummer aus Spalte A

Sub FillElephantIDs() 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

    Dim lastColumn As Integer, lastRow As Long, x As Long 
    Dim ws 

    For Each ws In Array("Elephants", "Elephants (2)") 
     With Worksheets(ws) 
      lastColumn = .Cells(1, Columns.count).End(xlToLeft).Column 
      lastRow = .Range("A" & Rows.count).End(xlUp).Row 

      For x = 2 To lastRow 

       .Range(.Cells(x, 2), .Cells(x, lastColumn)).Replace 1, .Cells(x, 1).Value 

      Next 

     End With 

    Next 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
End Sub 
0

Sie können den ID-Code mit der Zeilennummer der Zelle verweisen - so den fehlenden Code ?????

ist
rng.Value = Cells(rng.Row, 1).Value 

wo rng.Row der Zeilenindex der Zelle (RNG) Sie betrachten und „1“ ist Spalte A

Sie müssen auch eine 'Next rng' nach 'End If'

Alternativ Sie kann den InputRng als den verwendeten Bereich auf dem Blatt festlegen, der nur die Aktion für alle verwendeten Zellen auf dem Blatt ausführt - siehe zweites Codebeispiel (erspart das Auswählen des Bereichs).

Hoffe, das funktioniert für Sie (das ist meine erste "Antwort" aller Zeiten - ich dachte, es war Zeit, dass ich zurückgab - also fühlen Sie sich frei, Probleme oder Fehler zu erkennen). Cheers, Claire

Sub ReplaceOneswithIDcode() 
' 
' replace all ones with ID code. 
' 
Dim rng As Range 
Dim InputRng As Range 

On Error GoTo Handler: 
Set InputRng = Application.InputBox("Range :", xTitleId, Default:=Selection.Address, Type:=8) 
For Each rng In InputRng 
If rng.Value = 1 Then 
    rng.Value = Cells(rng.Row, 1).Value 
End If 
Next rng 
Handler: 
End Sub 

Sub ReplaceOneswithIDcode_usedrange() 
' 
' replace all ones with ID code in used range. 
' 
Dim rng As Range 
Dim InputRng As Range 

On Error GoTo Handler: 
Set InputRng = ActiveSheet.UsedRange 

For Each rng In InputRng 
If rng.Value = 1 Then 
    rng.Value = Cells(rng.Row, 1).Value 
End If 
Next rng 
Handler: 
End Sub 
0

Sie es ohne Iteration tun können, wie

Sub ReplaceOneswithIDcode(ws As Worksheet) 
    With ws 
     With Intersect(.UsedRange, .Columns("B").Resize(, .UsedRange.Columns.Count - 1)) 
      .Replace what:=1, replacement:="=OFFSET($A$1,ROW()-1,0)", lookat:=xlWhole 
      .Value = .Value 
     End With 
    End With 
End Sub 

folgt, die Sie wie folgt verwenden:

Option Explicit 

Sub main() 
    Dim ws As Worksheet 

    For Each ws In ThisWorkbook.Worksheets '<--| loop through all worksheets of the workbook the macro resides in 
     ReplaceOneswithIDcode ws 
    Next ws 
End Sub 

oder auf andere Art und Weise müssen Sie ein Arbeitsblatt Schleife Sammlung

+0

@VFishlock: hast du es geschafft? – user3598756

Verwandte Themen