excel vba的CONCATENATE及取代寫法尋問
問題一:
平常在處理excel儲存格合併都會使用CONCATENATE這個函數
但都需新增一列出來輔助,資料合併後不需再還原
所以改使用底下的vba來解決,但是它的限制只能相鄰的儲存格合併,像是D1與E1的值加上空格後合併到D1,如果想合併大範圍,如D1~E30內的資料就沒辦法達成,得分次合併,不知道VBA有辦法達成像CONCATENATE這個函數的輸出結果嗎?
圖片參考:http://imgcld.yimg.com/8/n/AC04676521/o/1012010609...
Sub combine()
Application.DisplayAlerts = False
Result = ""
For Each Data In Selection
Result = Result & " " & Data
Next Data
Selection.Merge
Selection = Result
Application.DisplayAlerts = True
End Sub
問題二:
F欄一共有將近1千百筆資料,內容由*與空白儲存格組成,
想把*換成name,空白儲存格寫入no,G欄的結果
圖片參考:http://imgcld.yimg.com/8/n/AC04676521/o/1012010609...
錄製的巨集
ActiveCell.FormulaR1C1 = "name"
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = "no"
ActiveCell.Offset(1, 0).Range("A1").Select
小花大,有辦法直接在原本的欄位上處理嗎?
問題一直接合併在D欄
問題二直接在F欄取代
弄了一個版本出來但還不甚完美,D與G欄下方都還有一些資料不是我想處理的,我只想依C欄的數列(起始值C8~最後)當作處理範圍,有辦法以C欄做為資料終止值判斷依據嗎?
範例及輸出檔
Sub AA()
'欄位合併
Columns("D:D").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
For i = 8 To ActiveSheet.[E65536].End(xlUp).Row
Cells(i, "D") = Cells(i, "E") & " " & Cells(i, "F")
Next i
'取代補值
For i = ActiveSheet.Range("G8") To ActiveSheet.[G65536].End(xlUp).Row
Columns("G:G").Select
Selection.Replace What:="~*", Replacement:="Gorilla", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:=" ", Replacement:="NIL", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next i
End Sub
4 個解答
- 小花Lv 59 年前最佳解答
第一個
Sub ee()
For i = 1 To ActiveSheet.[D65536].End(xlUp).Row
Cells(i, "F") = Cells(i, "D") & " " & Cells(i, "E")
Next i
End Sub
第二個
Sub DD()
For i = 1 To ActiveSheet.[F65536].End(xlUp).Row
If Cells(i, "F") = "*" Then
Cells(i, "G") = "name"
Else: Cells(i, "G") = "no"
End If
Next i
End Sub
- 准提部林Lv 79 年前
來函收到,先用以下程式碼試試:
Sub T0110_1()
Dim xRow&, xR As Range
xRow = [C65536].End(xlUp).Row
If xRow < 9 Then Exit Sub
2012-01-10 11:01:35 補充:
For Each xR In Range("D9:D" & xRow - 1)
If xR <> "" And xR(1, 2) <> "" Then
xR = xR & " " & xR(1, 2)
xR(1, 2).ClearContents
End If
2012-01-10 11:01:39 補充:
If xR(1, 3) = "*" Then xR(1, 3) = "Gorilla"
If xR(1, 3) = " " Then xR(1, 3) = "NIL"
Next
End Sub
2012-01-10 14:41:14 補充:
最後兩行改為:
If Trim(xR(1, 3)) = "*" Then xR(1, 3) = "Gorilla"
If Trim(xR(1, 3)) = "" Then xR(1, 3) = "NIL"
2012-01-10 17:43:47 補充:
小花大大已回答主要問題,
若以學習VBA為目的,誰答都一樣,
小花大大的程式碼也不錯的!
所以不貼答了!
- 9 年前
To 小花大,有辦法直接在原本的欄位上處理嗎?
問題一直接合併在D欄
問題二直接在F欄取代
2012-01-09 10:35:38 補充:
懂..如果是先在旁邊自動新增一個row再合併應該就不會衝突
2012-01-10 01:36:21 補充:
弄了一個版本出來但還不甚完美,D與G欄下方都還有一些資料不是我想處理的,我只想依C欄的數列(起始值C8~最後)當作處理範圍,有辦法以C欄做為資料終止值判斷依據嗎?
範例及輸出檔
2012-01-10 13:32:15 補充:
謝謝准大,
目前測試後有發現F欄有一些例外狀況,
原先的規則是
*取代為Gorilla,空的儲存格填入NIL,
而實際運行時,
1.*的前後可能包含空格→(1)空格+*+空格、(2)空格+*、(3)*+空格
2.空的儲存格內原先會有一個空格,但有些則發現沒有空格,因此沒有空格的空白儲存格無法被取代為NIL
不知vba能不能做到先把空格過濾後,再開始處理
2012-01-10 16:34:51 補充:
OK!測試成功,謝謝准大的精簡VBA~
再麻煩准大把內容回覆至回答
以便設為最佳解
2012-01-10 17:50:47 補充:
非常謝謝小花大與准大
有你們的協助讓我也能學習到更多