2016-06-06 10 views
0

Ich habe Daten, die ich häufig aus einer Quellarbeitsmappe exportieren (Format ist konsistent, d. H. Alle Spaltennamen befinden sich in der ersten Zeile). Ich brauche nur die Daten von etwa 8 Spalten, die sporadisch im Arbeitsblatt verteilt sind ("Sheet1"). Unten ist der Code, den ich bisher dazu habe.Excel VBA - Spalten löschen, wenn Spaltenname <> "Zeichenfolgenname"

ich zwei Probleme habe,

  1. das Makro alle meine Daten löschen und

  2. Meine If-Anweisung ist sehr ineffizient. Ich möchte eine Variable erstellen, die alle Zeichenfolgen enthält, die die Spaltennamen enthalten, die ich nicht löschen möchte. Ich denke, ein Array zu schaffen, aber ich bin nicht sicher, ob meine Schleife richtig

    i.e., colNames = array("Col 1 that I want to keep", "Col 2", etc) 
    

der Code handeln würde:

Sub test2() 

Dim currentSht As Worksheet 
Dim i As Integer 
Dim lastRow As Long, lastCol As Long 
Dim startCell As Range 

Set currentSht = ActiveWorkbook.Sheets("Sheet1") 
Set startCell = currentSht.Range("A1") 

lastRow = startCell.SpecialCells(xlCellTypeLastCell).Row 
lastCol = startCell.SpecialCells(xlCellTypeLastCell).Column 

With currentSht 
    For i = lastCol To 1 Step -1 
     If .Cells(1, i).Text <> "First Name" Or .Cells(1, i).Text <> "Last Name" Or .Cells(1, i).Text <> "OB Hours(hr)" Or .Cells(1, i).Text <> "OB Talk Time (TT)" Or .Cells(1, i).Text <> "OB ACW Time" Or .Cells(1, i).Text <> "Handled-OB" Or .Cells(1, i).Text <> "Handled-OB/hr" Or .Cells(1, i).Text <> "TT Avg" Or .Cells(1, i).Text <> "Max Talk Time" Then 
     Columns(i).EntireColumn.Delete 
    End If 
Next i 
End With 

End Sub 

Nochmals vielen Dank alle.

+0

Ändern Sie den '' Or' zu und' in der if-Anweisung –

Antwort

0

Um Ihre erste Frage:

Ändern der Or zu And in der if-Anweisung

Um Ihre zweite:

Sub test2() 

Dim currentSht As Worksheet 
Dim i As Long, j As Long 
Dim lastRow As Long, lastCol As Long 
Dim startCell As Range 
Dim colnames 
Dim here As Boolean 

colnames = Array("First Name", "Last Name", "OB Hours(hr)", "OB Talk Time (TT)", "OB ACW Time", "Handled-OB", "Handled-OB/hr", "TT Avg", "Max Talk Time") 

Set currentSht = ActiveWorkbook.Sheets("Sheet1") 
Set startCell = currentSht.Range("A1") 

lastRow = startCell.SpecialCells(xlCellTypeLastCell).Row 
lastCol = startCell.SpecialCells(xlCellTypeLastCell).Column 

With currentSht 
    For i = lastCol To 1 Step -1 
     here = False 
     For j = LBound(colnames) To UBound(colnames) 
      If .Cells(1, i).Value = colnames(j) Then 
       here = True 
       Exit For 
      End If 
     Next j 
     If Not here Then 
      Columns(i).EntireColumn.Delete 
     End If   
    Next i 
End With 

End Sub 
+0

Das sieht gut aus, danke. Ich werde es gleich ausprobieren ... auch das ist mir gerade aufgegangen. Ich bin es gewohnt, ähnliche Schleifen zum Zählen von Zeilen zu schreiben. Dafür benutze ich den Schritt -1. Muss dies an etwas wie Schritt (0, -1) angepasst werden, da wir uns jetzt mit Spalten beschäftigen? –

+0

@AndyG Nein, die Spalten sind ganze Zahlen wie die Zeilen. –