標題:

excel vba的CONCATENATE及取代寫法尋問

勸和論全文翻譯發問:

問題一:平常在處理excel儲存格合併都會使用CONCATENATE這個函數但都需新增一列出來輔助,資料合併後不需再還原所以改使用底下的vba來解決,但是它的限制只能相鄰的儲存格合併,像是D1與E1的值加上空格後合併到D1,如果想合併大範圍,如D1~E30內的資料就沒辦法達成,得分次合併,不知道VBA有辦法達成像CONCATENATE這個函數的輸出結果嗎? 圖片參考:http://imgcld.yimg.com/8/n/AC04676521/o/101201060938413869651420.jpg Sub combine() Application.DisplayAlerts = False ... 顯示更多 問題一: 平常在處理excel儲存格合併都會使用CONCATENATE這個函數 但都需新增一列出來輔助,資料合併後不需再還原 所以改使用底下的vba來解決,但是它的限制只能相鄰的儲存格合併,像是D1與E1的值加上空格後合併到D1,如果想合併大範圍,如D1~E30內的資料就沒辦法達成,得分次合併,不知道VBA有辦法達成像CONCATENATE這個函數的輸出結果嗎? 圖片參考:http://imgcld.yimg.com/8/n/AC04676521/o/101201060938413869651420.jpg 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/101201060938413869651421.jpg 錄製的巨集 ActiveCell.FormulaR1C1 = "name" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "no" ActiveCell.Offset(1, 0).Range("A1").Select 更新: 小花大,有辦法直接在原本的欄位上處理嗎? 問題一直接合併在D欄 問題二直接在F欄取代 更新 2: 弄了一個版本出來但還不甚完美,D與G欄下方都還有一些資料不是我想處理的,我只想依C欄的數列(起始值C8~最後)當作處理範圍,有辦法以C欄做為資料終止值判斷依據嗎? 範例及輸出檔 http://www.funp.net/219940 更新 3: 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 更新 4: '取代補值 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, _ 更新 5: ReplaceFormat:=False Selection.Replace What:=" ", Replacement:="NIL", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Next i End Sub

最佳解大衛美語答:

第一個 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.[Faces兒童美語65536].End(xlUp).Row If Cells(i, "F") = "*" Then Cells(i, "G") = "name" Else: Cells(i, "G") = "no" End If Next i End Sub

其他解答:

來函收到,先用以下程式碼試試: 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為目的,誰答都一樣, 小花大大的程式碼也不錯的! 所以不貼答了!|||||直接在原本的欄位上處理 自己合併自己...應該會合併個沒完沒了吧....|||||To 小花大,有辦法直接在原本的欄位上處理嗎? 問題一直接合併在D欄 問題二直接在F欄取代 2012-01-09 10:35:38 補充: 懂..如果是先在旁邊自動新增一個row再合併應該就不會衝突 2012-01-10 01:36:21 補充: 弄了一個版本出來但還不甚完美,D與G欄下方都還有一些資料不是我想處理的,我只想依C欄的數列(起始值C8~最後)當作處理範圍,有辦法以C欄做為資料終止值判斷依據嗎? 範例及輸出檔 http://www.funp.net/219940 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 補充: 非常謝謝小花大與准大 有你們的協助讓我也能學習到更多D3F18FEF0F69EBA3
arrow
arrow

    蘇山亨耶敏蒂轄粒 發表在 痞客邦 留言(0) 人氣()