2014-07-17 33 views
1

我一直工作在一個項目中的數據,我有一個嵌套 IF(COUNTIF(),,*)公式在Excel中幫助我分類CSV文件。VBA腳本添加公式列,如果下一列有該行

我試圖做到這一點,當CSV導入(到單元格B2)A列將填充公式。我有麻煩得到的公式複製到1單元格,因爲不管我多麼努力,它不適合一行。該公式正在檢查3個不同單元的內容,可能有23個以上的輸出給你一個想法。

反正有:

  1. 得到一個VBA腳本將公式複製的(我已經錄製了 宏甚至未修改宏爆發)
  2. 使宏觀ONLY填寫儘可能多包含儘可能信息的行
  3. 在VBA中進行整個計算並相應地填充單元格。

下面是我在每一行使用的公式,其中可能有幾千個CSV文件。

=IF(COUNTIF(BZ2,"8075 *research*"), 
IF(COUNTIF(BR2, "780 B*"), 
    IF(COUNTIF(AU2,"*ground*"),"51", 
     IF(COUNTIF(AU2,"*next*"),"52", 
      IF(COUNTIF(AU2,"*2*"),"53", 
       IF(COUNTIF(AU2,"*3*"),"54", 
        IF(COUNTIF(AU2,"*charge*"),"546","Unclassified" 
        ) 
       ) 

      ) 
     ) 
    ), 
    IF(COUNTIF(AU2,"*ground*"),"25430", 
     IF(COUNTIF(AU2,"*next*"),"25431", 
      IF(COUNTIF(AU2,"*2*"),"25432", 
       IF(COUNTIF(AU2,"*3*"),"25433", 
        IF(COUNTIF(AU2,"*charge*"),"2546","Unclassified" 
        ) 
       ) 
      ) 
     ) 
    ) 
), 
IF(COUNTIF(BZ2, "780 B*"), 
    IF(COUNTIF(BR2,"8075 *research*"), 
     IF(COUNTIF(AU2,"*ground*"),"251", 
      IF(COUNTIF(AU2,"*next*"),"252", 
       IF(COUNTIF(AU2,"*2*"),"253", 
        IF(COUNTIF(AU2,"*3*"),"254", 
         IF(COUNTIF(AU2,"*charge*"),"2546","Unclassified" 
         ) 
        ) 
       ) 
      ) 
     ), 
     IF(COUNTIF(AU2,"*ground*"),"15430", 
      IF(COUNTIF(AU2,"*next*"),"15431", 
       IF(COUNTIF(AU2,"*2*"),"15432", 
        IF(COUNTIF(AU2,"*3*"),"15433", 
         IF(COUNTIF(AU2,"*charge*"),"1546","Unclassified" 
         ) 
        ) 
       ) 
      ) 
     ) 

    ), 
    IF(COUNTIF(BR2, "780 B*"),"540", 
     IF(COUNTIF(BR2,"8075 *research*"),"2540", "Unclassified" 
     ) 
    ) 
) 

+0

我很困惑,但對於'3)在VBA中進行整個計算並相應地填充單元格「,請參閱使用UDF的http://www.cpearson.com/excel/writingfunctionsinvba.aspx – dcromley

+0

您是否正在使用'COUNTIF()'只用來檢查某個關鍵字是否存在?或者我看錯了你的公式? –

+0

是的,COUNTIF()僅用於檢查keword是否存在(不區分大小寫)併爲原始IF語句設置True/Flase標誌。 @dcromley謝謝你的教程鏈接,它比我找到的大多數都要好!我最大的問題仍然是我不確定如何使它僅在X行上運行,其中X由導入的CSV確定。根據情況顯然可以運行數千或數十萬個,額外的行並不是完全需要的。 – Kandirma

回答

1

OK,我沒有試過,但我認爲你應該寫宏或UDF沿着這些線路:

Public Sub CheckMyCells() 

    Dim thisCell As Range 

    With ThisWorkbook.Sheets("MySheet") 
     For Each thisCell In .Range("RangeWithCSVValues") 
      If .Range("BZ2").Value2 = "8075 *research*" Then 
       If .Range("BR2").Value2 = "780 B*" Then 
        Select Case .Range("AU2").Value2 
         Case "*ground*" 
          thisCell.Value = 51 
         Case "*next*" 
          thisCell.Value = 51 
         Case "*2*" 
          thisCell.Value = 53 
         Case "*3*" 
          thisCell.Value = 54 
         Case "*charge*" 
          thisCell.Value = 546 
         Case Else 
          thisCell.Value = "ERROR!" 
       Else 
        Case "*ground*" 
          thisCell.Value = 25430 
         Case "*next*" 
          thisCell.Value = 25431 
         Case "*2*" 
          thisCell.Value = 25432 
         Case "*3*" 
          thisCell.Value = 25433 
         Case "*charge*" 
          thisCell.Value = 2546 
         Case Else 
          thisCell.Value = "ERROR!" 
       Else 
        '... Same thing again but with different values ... 
       End If 
      End If 
     Next 
    End With 

End Sub 

和執行導入數據之後。 顯然,MySheet是您工作的工作表的名稱,而RangeWithCSVValues是包含要處理的值的範圍的名稱,例如"A1:A2300"

希望這能讓你開始。

+0

這看起來不錯,我唯一關心的是如何讓它做一個可變範圍? 因此,基本上有時進口可能會從BZ2進入BZ937,有時可能進入BZ5476。我寧願它不在任何行上運行,包括沒有被使用的行,因爲我懷疑這個文件將會是1048576行。 (上帝保佑我,如果是的話) – Kandirma

+0

沒關係,我現在明白 - 對不起。非常感謝你!我會嘗試沿着這些線出去看看它是否有效^ -^ – Kandirma

+0

嘿,很高興聽到這幫助你。您可能已經知道了這一點,但您可以使用「選擇」關鍵字來處理選定的單元格。或者你可以在運行之前打開宏並指定範圍(我知道不太實際......但這是一個開始)。或者你可以運行一整列,並檢查單元格值thisCell。當你到達一個空單元時,Value2 =「」'並使用'exit sub'停止宏。選項大量:) –