2016-05-11 60 views
1

我正在創建一個宏來幫助將數據轉儲(表單1)組織到發票(表單2)中。我編寫了大部分的宏,但我堅持以下。Excel宏幫助 - 如果語句的變量範圍爲

我希望宏讀取表1中的Y列,這是一個可變範圍(可以是2行到50),並檢查它是否顯示「CB」。如果這是真的,那麼E11上紙2是Yes,否則不,依此類推,直到其到達柱Y對片的端1.

我有以下:

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 

的範圍而似乎工作,它顯示列Y中的文本的單元格的數量,但我似乎無法包裝我的頭周圍如何讓它從Y1移動到Y2等等,然後將響應粘貼到E11然後E12和等等。

+0

移動「蜿蜒」語句從那裏後「結束如果」 – OpiesDad

+0

另外,看到這一點:http://stackoverflow.com/questions/10714251/how-to-avoid-using-select- in-excel-vba-macros – OpiesDad

+0

還將「Range(」Y「&intCardSize)」更改爲「Range(」Y「&intCounter)」 – OpiesDad

回答

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. 
+0

嘿,非常感謝! Wend在開始時沒有做任何事情,因爲你的評論最重要。我做了一些改變,我似乎無法正常工作......我希望它開始粘貼到列E11(在recSheet上)並從那裏下去。因此,如果Y1中有15行,在dataSheet上,recSheet將從E11粘貼到E26,是或否。我將「E」改爲「E1」,它開始在E11粘貼,但在跳到第110行之前只進行了9次迭代。你知道爲什麼會這樣嗎?櫃檯上有東西嗎? – Kamal

+0

我誤解了問題....所提供的代碼將從recSheet的第1行開始粘貼。通過將「E」改爲「E1」,您最初在單元格「E11」中粘貼,但是,一旦lngCounter等於「10」,您開始粘貼單元格「E110」,因爲「E1」與「10」 」。一種方法是「E」和(9 + lngCounter)。我會更新答案來反映這一點。代碼中的評論中描述了9。 – OpiesDad

+0

太棒了,再次感謝您的幫助! – Kamal

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 
+0

OP對如何對VBA進行編碼存在誤解。這個答案並不能解釋他們遇到的問題,而且,如果不解釋VBA,會更加難以理解。 OP將代碼粘貼到工作簿中學到的東西並不多。爲了改善這一點,請評論他們遇到的問題以及如何解決問題,然後可能包含您的附加解決方案以及解釋。 – OpiesDad

+0

@OpiesDad你知道,我學到了更多的東西,然後研究了不同的解決方案。儘管如此,我從來沒有downvoted誰有不同的想法 – user3598756

+0

我提供不同的解決方案沒有問題。這個解決方案沒有解釋任何東西可以公平地說,我太過分地建議您的解決方案需要在所要求的方法中包含解決方案,爲此,我表示歉意。然而,至少應該解釋代碼,儘管該代碼說明爲什麼這種方法比他們嘗試的方法更可取。 – OpiesDad