Excel宏帮助 - 具有可变范围的语句

时间:2016-05-11 17:37:23

标签: excel vba excel-vba

我正在创建一个宏来帮助将数据转储(表单1)组织到发票中(表2)。我编写了大部分宏,但我坚持下面的内容。

我希望宏读取工作表1上的Y列,这是一个可变范围(可以是2行到50)并检查它是否显示" CB"。如果是这样,那么表2上的E11为是,否则为否,依此类推,直到它到达表1中Y列的末尾。

我有以下内容:

Sheets("Data_Dump").Select
intCounter = 1
While Range("Y" & (intCounter + 1)) <> ""
    intCounter = intCounter + 1
Wend
intCardSize = intCounter
MsgBox (intCardSize)

Sheets("Data_Dump").Select

If Range("Y" & intCardSize) = "CB" Then
    Sheets("Reconciliation").Select
    Range("E11:E" & intCardSize).Select
    Range("E11") = "Yes"
End If

while范围似乎有效,它显示Y列中带有文本的单元格数量,但我似乎无法理解如何让它从Y1移动到Y2等等然后将响应粘贴到E11,然后粘贴到E12,依此类推。

2 个答案:

答案 0 :(得分:0)

我希望我理解您的代码目标如下

With Sheets("Data_Dump")
    With Sheets("Reconciliation").Range("E11").Resize(.Cells(.Rows.Count,1).Row)
        .Formula="=IF('Data_Dump'!Y1="CB", "Yes","")"
        .Value= .Value
    End With
End With 

答案 1 :(得分:0)

您遇到的问题是您的代码没有循环以尝试比较。你只看到While循环,看看下一个单元格中是否有东西。事实上,它实际上跳过了第一行,但也许这是故意的。

Dim dataSheet As WorkSheet
Dim recSheet As Worksheet
Dim lngCounter As Long 'Use long because an integer may not be big enough for large dataset.
Dim intCardSize As Long

Set dataSheet = ThisWorkbook.Sheets("Data_Dump")
Set recSheet = ThisWorkbook.Sheets("Reconciliation")
'You want to set the sheets to a variable instead of referring to the whole path each time
'Also, Note the usage of "ThisWorkbook" which guarantees the worksheet 
'is coming from the one with code in it.
lngCounter = 2 'If you want to start looking at row 2, start at row 2 with
               'the variable instead of starting the variable and checking var+1
While dataSheet.Range("Y" & (lngCounter)) <> ""
     'While there is a value in the column

     'intCardSize = intCounter 'Not sure what this is supposed to do
     'MsgBox (intCardSize) 'This looks like debugging.  Commenting out.


     If dataSheet.Range("Y" & lngCounter) = "CB" Then
          'Check each row as you go through the loop.
          'Sheets("Reconciliation").Select 
          'Avoid selecting sheet/range.  Unneccessary work for computer.

          recSheet.Range("E" & (9 + lngCounter)) = "Yes"
          'Set reconciliation sheet value to "Yes" if data sheet has "CB"
          'The reconciliation sheet starts on row 11, whereas the datasheet
          'starts at row 2 ,a difference of 9 
     Else
          recSheet.Range("E" & (9 + lngCounter)) = "No"
          'Otherwise set to no.
     End If
     lngCounter = lngCounter + 1
Wend
intCardSize = lngCounter - 1 'It's been increased to one past the last item.
MsgBox intCardSize 'Display the last row checked.