Excel VBA对于每个+ if语句异常问题

时间:2017-07-14 19:31:19

标签: excel vba excel-vba

我正在尝试实现一个简单的for-each语句,它应该将数据从一个工作表(模板)复制到另一个(原始数据),然后是另一个'clean-up'for-each + If语句,除了5个具有预定义计算的单元格之外,它应该清除以前复制的所有单元格。

我开始使用for-each语句清除所有字段(并且工作正常),除了后来我认为我需要在某些字段上有例外的事实。所以,我添加了一个简单的If语句,它指示sub在没有清除它的情况下转到下一个单元格,以防那些特定的单元格范围。

由于某些原因,在运行该代码时,它会清除定义范围内的所有字段,除了字段K15(未包含在异常中),我不知道为什么会发生这种情况; __;我尝试过排除故障,但无法提出任何建议。

我的代码粘贴在下面。任何建议将不胜感激 - 包括改进代码的任何提示。谢谢!

Sub CopyData()

Dim TargetRow, CopyRange, Cell As Range
Dim RowCount, ColumnCount, ColumnLast, ColC As Long
Dim ws As Worksheet

Application.ScreenUpdating = False

ColumnCount = 1
ColumnLast = 51
ColC = 1
Set ws = ThisWorkbook.ActiveSheet
Set CopyRange = Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45")

Sheets("RawData").Activate
RowCount = Range("A1").CurrentRegion.Rows.Count + 1

Set TargetRow = Range(Cells(RowCount, ColumnCount), Cells(RowCount, ColumnLast))

For Each Cell In CopyRange
    TargetRow.Cells(ColC).Value = Cell.Value
    ColC = ColC + 1
Next Cell

ws.Activate

For Each Cell In CopyRange
    If Cell = Range("K4") Or Cell = Range("K5") Or Cell = Range("K6") Or Cell = Range("K9") _
    Or Cell = Range("K46") Then
        GoTo Forward
    Else
        Cell.Value = ""
    End If
Forward:
Next Cell

Application.ScreenUpdating = True

End Sub

2 个答案:

答案 0 :(得分:1)

你的话说

If Cell = Range("K4") Or Cell = Range("K5") Or _
   Cell = Range("K6") Or Cell = Range("K9") Or _
   Cell = Range("K46") Then
    GoTo Forward

相当于

If Cell.Value = Range("K4").Value Or Cell.Value = Range("K5").Value Or _
   Cell.Value = Range("K6").Value Or Cell.Value = Range("K9").Value Or _
   Cell.Value = Range("K46").Value Then
    GoTo Forward

我认为您打算使用

If Cell.Address = Range("K4").Address Or Cell.Address = Range("K5").Address Or _
   Cell.Address = Range("K6").Address Or Cell.Address = Range("K9").Address Or _
   Cell.Address = Range("K46").Address Then
    GoTo Forward

相当于

If Cell.Address = "$K$4" Or Cell.Address = "$K$5" Or _
   Cell.Address = "$K$6" Or Cell.Address = "$K$9" Or _
   Cell.Address = "$K$46" Then
    GoTo Forward

但您可能还想考虑让一个Range变量包含要复制的单元格,另一个Range变量包含要清理的单元格。

答案 1 :(得分:0)

这应该可以让您了解如何简化部分代码

使用F8单步执行此代码并同时查看工作表

sub test()

    ' the select statements are only to show the range, and are not needed

    Range("a1").Select                                                ' get highlight out of the way
    Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45") = "abc123"
    Range("C10:C12,C17:C18,E12").ClearContents
    Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45").SpecialCells(xlCellTypeBlanks).Select
    Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45").Select   
    Range("a1").Select
    Range("C10:C15,C17:C18,E12,E17:E18,K4:K6,K9,K11:K45").ClearContents
end sub