2010-09-17 113 views
-1

我是VBA的新手,我正努力嘗試完成這項工作。我需要一個宏來處理Sheet1上的每個單元格\列,並將結果放在Sheet2上。我相信對於那些使用VB代碼更高級的人來說這很容易。它包含了很多列..在邏輯上從另一列的一列創建多個列

每當我們遇到一個或空單元格,我們填充-999細胞(見Sheet2的例子)的第一列,其中包含"0-2"。然後,我們創建2個新列,並在第一列填入0,在第二列填寫2(請參閱Sheet2上的示例)。如果僅在一側找到某個值,則我們使用相同的數字填充兩側。

由於每個列是在Sheet1和工藝

工作表Sheet1:


A    B 
Column1   Column2 
Title   Title2 
0–2    0–4 
3    — 
—    5 
—    
—    — 
10–23   11—29 

而且結果應該是這樣在Sheet2上

Sheet2中


A   B   C   D 
Column1 Column1  Column2  Column2 
Title-A Title-B  Title-A  Title-B 
0   2   0   4 
3   3   -999   -999 
-999  -999   5   5 
-999  -999   -999  -999 
—999  -999   -999  -999 
10   23   11   29 

回答

1

你不需要VBA來做到這一點。它可以使用if函數完成。

列1將使用類似:

=IF(ISNUMBER(Sheet1!A2),Sheet1!A2,IF(OR(Sheet1!A2="-",ISBLANK(Sheet1!A2)),-999,LEFT(Sheet1!A2,1))) 

列2將使用類似:

=IF(ISNUMBER(Sheet1!A2),Sheet1!A2,IF(OR(Sheet1!A2="-",ISBLANK(Sheet1!A2)),-999,RIGHT(Sheet1!A2,1))) 

3和4將使用相同1和2只是偏移了一列。

1

好了,你的任務基本上是多部分組成: 1 - 穿越智能邏輯片 2 - 分裂 3 - 新電池放置數據

這不發麪的工作,但是這應該給你用彈藥來完成你的目標,只需輕微的努力。

Sub mySub() 
    dim i,j,dummy,dummy2, blankCounter 
    i=1 
    j=1 
    blankCounter=0 
    '@@@@@@Section1 
    do while ThisWorkbook.Worksheets(1).Cells(1, j)<>"" 
    do while blankCounter<=5 
     if ThisWorkbook.Worksheets(1).Cells(i, j)="" 
      blankCounter=blankCounter+1 
     else 
     '@@@@@@Section2 
     dummy=Split(ThisWorkbook.Worksheets(1).Cells(i, j),"—") 
     for k=0 to Ubound(dummy) 
     ThisWorkbook.Worksheets(2).Cells(i, j+k)=dummy(k) 
     next k 
     end if 
    i=i+1 
    loop 
        blankCounter=0 
     j=j+1 
    loop 


end Sub 

好的,用英語。第一部分正在研究這本工作手冊(「這個」通常出現在Java中,但這是這種邏輯更爲明顯的例子)。在本工作手冊中查看我的第一張工作表。在這個工作表中讓我們看看col1,row1。現在我們要循環行並繼續前進,直到它們爲空,對列執行相同操作。這將基本上找到矩陣(數據)的尺寸。

好的,現在我們可以遍歷工作簿了。

現在您已經瞭解了幾乎所有語言中都存在的VBA中的拆分功能。 Split在您的字符串中查找某些內容,並根據您提供的參數分割您的字符串。虛擬將持有任何返回值。假人的大小是未知的,所以我們不應該硬編碼,否則當分離器不存在時它會中斷。

這就是說,我們現在介紹Ubound。 Ubound是一種查找數組大小的功能。請注意:如果Ubound返回1,這意味着您有一個值。數組自動索引爲0,所以你必須注意到這一點,而不是從1循環到Ubound,這會產生一個錯誤,也會產生不正確的代碼。

好的,現在好了,我們可以遍歷我們的數組和我們的工作簿,現在我們只需要將這些值放入所需的單元格中。 var k應該能夠爲你做到這一點。

正如我所說我沒有證明這個代碼,所以你將需要確保這個邏輯正常工作,因爲我現在意識到它不會將數據放在正確的單元格中,但是這將會是你的解決方案。

+0

我看到的唯一問題是OP說數據可能包含空白單元格。您的代碼一旦遇到第一個空白單元就會停止。 – KevenDenen 2010-09-17 17:04:30

+0

同意。同時改爲空行而空行。這應該解決這個問題。 – 2010-09-17 17:11:03

+0

感謝您的幫助!我非常感謝您的耐心,因爲我耳朵背後真的是綠色....如果ThisWorkbook.Worksheets(1).Cells(i,j)=「」 – user450252 2010-09-17 17:22:20