VBA循环跨越一行以查找包含单元格的值并删除该列之前的列

时间:2018-05-23 15:40:27

标签: excel vba excel-vba

我需要从C7(C7,D7,E7等)开始检查第7行中的每个单元格,并找到一个包含特定日期的字符串值的单元格(例如,字符串中的“9/30/2017” “2017年6月30日至9月30日”)并删除C列中的所有列到单元格所在的列。如何使用VBA代码执行此操作?我是VBA的新手,并尝试过我能找到的一切。感谢任何建议

我的代码:

Sub DeleteUnnecessaryColumns(specifiedWorksheet) 

Dim lastCol As Long 
lastCol = Cells.Find(What:="*", After:=[C1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 

For i = 1 To lastCol 
    If InStr(Cells(7, 0), specifiedDate, vbTextCompare) = 0 Then 
        Columns(i).Delete 
    End If 
Next i 

End Sub

2 个答案:

答案 0 :(得分:0)

一些变化:

  1. 使用With块明确定位指定的工作表
  2. .集合之前添加Cells以明确链接到指定的工作表(通过With块)
  3. 使用列C = 3(For i = 3 ...)
  4. 的正确列索引启动循环
  5. 您错过了InStr函数的第一个参数:起始字符(假设为1)MSDN
  6. InStr的第二个参数未设置为i变量。现在,这将循环显示每列中的值
  7. 找到搜索文本后,循环不会停止。所以我添加了一个Else子句,在找到For后退出specifiedDate循环,阻止脚本删除目标列右侧的列。
  8. specifiedDate从未传递给Sub或声明,因此我将其添加为参数。您也可以在此过程中声明和设置它。如果它被声明为公共变量,则删除参数。
  9. .Find方法仅适用于范围对象,因此我使用了一种可用于单元格的方法
  10. 删除列后,其余列的索引减1,因此必须对控制循环的变量进行相同的操作
  11. 如果在第7行中找不到搜索文本,它现在应该正确删除列,并在找到第一个匹配后停止执行,剩下的列保持不变。

    Sub DeleteUnnecessaryColumns(specifiedWorksheet, specifiedDate) 
    
    Dim lastCol As Long
    With specifiedWorksheet
        lastCol = .Cells(7, .Columns.Count).End(xlToLeft).Column
        For i = 3 To lastCol
            If InStr(1, .Cells(7, i), specifiedDate, vbTextCompare) = 0 Then 
                .Columns(i).Delete
                i = i - 1
                lastCol = lastCol - 1
            Else
                Exit For
            End If 
        Next i 
    End With
    
    End Sub
    

答案 1 :(得分:0)

类似的东西......您需要使用DeleteUnnecessaryColumns "Sheet1", "9/30/2017"

之类的语法从其他地方调用它
Sub DeleteUnnecessaryColumns(specifiedWorksheet as worksheet, SpecifiedDate as string) 

dim r as range   ' set up a range for row 7, columns C to the end
set r = specifiedWorksheet.rows(7)
set r = r.resize(Columnsize:= r.columns.count - 2)
set r =  r.offset(0,2)

Dim lastCol As Long, i as long

for i = 1 to r.columns.count  'loop through the cells in the r range
    if instr(string:=r.cells(i), substring:= SpecifiedDate) > 0 then
        lastcol = i  'this ends the loop and sets the value for lastcol
    end if 
next

SpecifiedWorksheet.range(cells(1, 3), cells(1, lastcol - 1).entirecolumn.delete

End Sub