Я пытаюсь выбрать и удалить несколько столбцов в Excel в зависимости от того, имеют ли они определенные значения в первой строке.
Код ниже. Я извлек функцию FindAll из http://www.cpearson.com/excel/findall.aspx.
Sub delete_unwanted_columns()
Dim rng2 As Range
Set rng2 = FindAll(Range("1:1"), "p-value", xlValues, xlPart)
Dim rng3 As Range
Set rng3 = FindAll(Range("1:1"), "type", xlValues, xlPart)
With ActiveSheet
Set Rng = Union(rng2, rng3)
End With
Rng.Select
' ActiveSheet.Range(Selection, Selection).EntireColumn.Select
' Selection.Delete Shift:=Left
End Sub
Это дает мне это:
Когда я раскомментирую предпоследнюю строку, я получаю это:
Я хотел бы, чтобы он выбрал все столбцы, начинающиеся с «значения p» или «типа», но он выбирает только первые 2. Почему это происходит и как это исправить?
@ScottCraner Это не сработало для «Аргумент не является обязательным», но я сделал Rng.EntireColumn.Select, а затем Selection.Delete. Спасибо!
У меня есть функция, которая делает нечто подобное, используя цикл Do While, чтобы проверять каждую ячейку, пока она не достигнет пустой ячейки в строке заголовка. Адаптировано для вас, это выглядит так:
Dim currentCol as Integer
With ActiveWorkbook.ActiveSheet
Do While Not Cells(1, i) = ""
currentCol = Cells(1, i).Column
findValue1 = "type"
findValue2 = "p-value"
If InStr(1, Left$(Cells(1, i), 4), findValue1) or InStr(1, Left$(Cells(1, i), 7), findValue2) ' Notice the "4" and the "7" used to limit how much of the cell's value to check... don't want it finding "type" or "p-value" anywhere but at the beginning
Columns(currentCol).Delete
Else
i = i + 1 ' You only need to advance one column if you've deleted a column.
End IF
Loop
End With
Sub DeleteUnwantedColumns()
Dim Begins() As Variant: Begins = Array("p-value", "type")
Dim ws As Worksheet: Set ws = ActiveSheet ' improve!
Dim rg As Range: Set rg = ws.Range("A1").CurrentRegion
Dim frg As Range: Set frg = rg.Rows(1)
Dim lcell As Range: Set lcell = frg.Cells(frg.Cells.Count)
Dim urg As Range, fcell As Range, Begin As Variant, FirstColumn As Long
For Each Begin In Begins
Set fcell = frg.Find(Begin & "*", lcell, xlFormulas, xlWhole)
If Not fcell Is Nothing Then
FirstColumn = fcell.Column
Do
If urg Is Nothing Then
Set urg = fcell
Else
Set urg = Union(urg, fcell)
End If
Set fcell = frg.FindNext(fcell)
Loop Until fcell.Column = FirstColumn
End If
Next Begin
If urg Is Nothing Then
MsgBox "Columns had already been deleted!", vbExclamation
Else
Intersect(rg, urg.EntireColumn).Delete xlToLeft
MsgBox "Columns deleted.", vbInformation
End If
End Sub
rng.entirecolumn.delete Shift:=Left