VBA Excel - 如果单元格明确等于零,则删除列

时间:2015-08-10 08:06:30

标签: excel vba excel-vba

我正在尝试创建一个宏,它将在我的工作簿中使用特定的工作表通过某一行,如果一个单元格显式为= 0,则删除该列,然后删除右边的下四列

我对VB的经验很少,所以我很难理解它。

非常感谢任何帮助。

这是我到目前为止的代码:

Sub SaveAsW()

Dim strFilename As String
Dim strpath As String
Dim curCell As Range
Dim TempValue, ColNr, RowNr, SecCol

RowNr = 35

strpath = Sheets("Rebooking Calculations").Range("AK9").Text
strFilename = Sheets("Ticket Input").Range("M10").Text

ThisWorkbook.Sheets("Tickets (1-48)").Copy
With ActiveWorkbook
    For ColNr = 8 To 320
        TempValue = Cells(RowNr, ColNr)
        If (Application.IsNumber(TempValue)) And TempValue.Value = 0 Then
            For SecCol = 1 To 4
                Cells.EntireColumn.Delete
            Next SecCol
        End If
    Next ColNr
    .SaveAs strpath & "\" & strFilename & "(1-48)" & ".xls"
    .Close 0
End With

更新:

w / help这就是我解决问题的方法。

    ThisWorkbook.Sheets("Tickets (1-48)").Copy
With ActiveWorkbook
    For ColNr = 8 To 250
        If Cells(RowNr, ColNr - 1) = "0" Then
            TempValue = Cells(RowNr, ColNr - 1)
            If TempValue = "0" Then
                For i = 0 To 9
                    Cells(RowNr, ColNr - 1).Select
                    Cells(RowNr, ColNr - 1).EntireColumn.Delete
                Next i
            ColNr = ColNr - 1
            Else
            End If
        Else
        End If
    Next ColNr
    .SaveAs strpath & "\" & strFilename & "(1-48)" & ".xls"
    .Close 0
End With

感谢。 (注意:我最终不得不删除以下9列,因此循环)

1 个答案:

答案 0 :(得分:0)

这是一个好的开始,但您的代码中存在一些问题:

首先,当你删除行或列时,通常是更容易降低你的变量,以避免丢失的行/列作为当删除一个(即列他们将转向第(i + 1)将成为删除后柱(I)初始列(i)和你会递增到第(i + 1)和错过初始第(i + 1)在初始重新启动第(i + 2))。

所以改变你的循环以避免这种情况。

一个临时变量来提高效率的想法是好的,但我认为,测试,你就指派到输入变量IsNumber(TempValue)将无法正常工作,因此这将是不如直接在这里工作与细胞。

最后,如果您使用行和列指定特定单元格,或者在没有循环的情况下直接删除5列,Cells.EntireColumn.Delete将更准确,请参阅更正的代码:

Sub SaveAsW()

Dim Ws As Worksheet, _
    strFilename As String, _
    strPath As String, _
    ColNr As Integer, _
    RowNr As Integer

RowNr = 35

strPath = Sheets("Rebooking Calculations").Range("AK9").Text
strFilename = Sheets("Ticket Input").Range("M10").Text

Set Ws = ActiveWorkbook.Sheets("Tickets (1-48)")

With Ws
    '.Copy
    For ColNr = 320 To 8 Step -1
        If (Application.IsNumber(.Cells(RowNr, ColNr))) And .Cells(RowNr, ColNr) = 0 Then
            .Columns(ColNr & ":" & ColNr + 4).EntireColumn.Delete
        End If
    Next ColNr
    .SaveAs strPath & "\" & strFilename & "(1-48)" & ".xls"
    .Close 0
End With

Set Ws = Nothing

End Sub