2014-01-16 82 views
1

我想在VBA中編寫一個函數,它允許我連接單元格並在元素之間添加「,」。這個函數的另一個方面是,我只想連接與所選範圍中的第一個填充顏色和字體顏色相同的單元格。 (我的電子表格中包含不同顏色和字體顏色的單元格列表)。 如果在網上找到一個代碼,可以在沒有條件的情況下工作。但是當我嘗試添加它們時,它會返回一個值錯誤。 這裏是我的功能:VBA連接選中的單元格填充條件

Function Concat(rng As Range) As String 
    Dim rngCell As Range 
    Dim strResult As String 
    Dim bcolor As Long 
    Dim fcolor As Long 
    bcolor = rng.Cells(1, 1).Interior.ColorIndex 
    fcolor = rng.Cells(1, 1).Font.ColorIndex 
    For Each rngCell In rng 
     If rngCell.Value <> "" And rngCell.Interior.ColorIndex = bcolor And rngCell.Font.ColorIndex = fcolor Then 
      strResult = strResult & "," & rngCell.Value 
     End If 
    Next rngCell 
    If rngCell.Value <> "" And rngCell.Interior.ColorIndex = rng.Cells(1, 1).Interior.ColorIndex And rngCell.Font.ColorIndex = rng.Cells(1, 1).Font.ColorIndex Then 
     strResult = Mid(strResult, Len(",") + 1) 
    End If 
    Concat = strResult 
End Function 

我很新的VBA(我開始今天下午),所以我之所以加入bcolor和fcolor是進行調試。其實我覺得有一些基本的東西我不理解VBA,因爲即使下面的函數不返回任何值:

Function Concat(rng As Range) As Long 'Replace "Long" by "String" after debug is over 
    Dim rngCell As Range 
    Dim strResult As String 
    Dim bcolor As Long 
    Dim fcolor As Long 
    bcolor = rng.Cells(1, 1).Interior.ColorIndex 
    fcolor = rng.Cells(1, 1).Font.ColorIndex 
    For Each rngCell In rng 
     If rngCell.Value <> "" And rngCell.Interior.ColorIndex = bcolor And rngCell.Font.ColorIndex = fcolor Then 
      strResult = strResult & "," & rngCell.Value 
     End If 
    Next rngCell 
    If rngCell.Value <> "" And rngCell.Interior.ColorIndex = rng.Cells(1, 1).Interior.ColorIndex And rngCell.Font.ColorIndex = rng.Cells(1, 1).Font.ColorIndex Then 
     strResult = Mid(strResult, Len(",") + 1) 
    End If 
    Concat = bcolor 
End Function 

這真讓我心煩,這個函數不返回電池,同時顏色他如下:

Function color1(rng As Range) As Long 
    color1 = rng.Cells(1, 1).Font.ColorIndex 
End Function 

我知道有一些基本的東西,我不明白這裏的VBA編碼。但我不知道是什麼。如果你看到什麼是錯的,我會很感激糾正和解釋我的錯誤是什麼。 謝謝! Xavier

回答

1

我不確定代碼的最後部分是否完成您想要的操作。另外,您不能在For Each rngCell In rng之外使用rngCell

語句的內部只刪除字符串的第一個字符。 (Mid()截斷從傳入位置的字符開始的字符串,如果要提供第二個數字,它將設置子字符串將包含的字符數; Len()將返回提供的字符串的長度)。

所以strResult = Mid(strResult, Len(",") + 1)幾乎意味着存儲一個原始字符串的字符串,但從字符2(1 + 1)開始。

試試這個!

Function Concat(rng As Range) As String 
    Dim rngCell As Range 
    Dim strResult As String 
    Dim bcolor As Long 
    Dim fcolor As Long 
    bcolor = rng.Cells(1, 1).Interior.ColorIndex 
    fcolor = rng.Cells(1, 1).Font.ColorIndex 
    For Each rngCell In rng 

     If rngCell.Value <> "" And rngCell.Interior.ColorIndex = bcolor And rngCell.Font.ColorIndex = fcolor Then 
      If strResult = "" Then 
       strResult = rngCell.Value 
      Else 
       strResult = strResult & ", " & rngCell.Value 
      End If 
     End If 

    Next rngCell 
    'this probably doesn't do what you want, so I commented it out. 
    'If rngCell.Value <> "" And rngCell.Interior.ColorIndex = rng.Cells(1, 1).Interior.ColorIndex And rngCell.Font.ColorIndex = rng.Cells(1, 1).Font.ColorIndex Then 
    ' strResult = Mid(strResult, Len(",") + 1) 
    'End If 
    Concat = strResult 
End Function 
+0

感謝您的回覆,我會立即嘗試您的代碼。這裏額外的原因是,否則,我返回的字符串以「,」開頭。試過這個功能後我會回來一點。 – XababaX

+0

其實在嘗試之後,我的理解更少。編譯時,編譯器告訴我有一個錯誤,因爲Next沒有For(這顯然不是真的),因爲只有一個Next和一個For! 閱讀你的代碼,我認爲它在刪除第一個「,」時更優雅! – XababaX

+0

其實這個錯誤的原因是什麼,一個End If在你添加If後就失蹤了。代碼有效! – XababaX

0

對於Concat()要返回一個值,你的函數必須給函數體內的變量賦值。

+0

是的,對不起,我更改了函數的名稱,使其更易讀,並忘記在代碼中更改它。我確實使用相同的名稱。感謝您指出!我編輯了這個問題。 – XababaX

相關問題