nick 發問時間: 電腦與網際網路軟體 · 9 年前

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欄取代

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

4 個解答

評分
  • 小花
    Lv 5
    9 年前
    最佳解答

    第一個

    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

  • 9 年前

    來函收到,先用以下程式碼試試:

    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為目的,誰答都一樣,

    小花大大的程式碼也不錯的!

    所以不貼答了!

  • 瘦子
    Lv 5
    9 年前

    直接在原本的欄位上處理

    自己合併自己...應該會合併個沒完沒了吧....

  • 9 年前

    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 補充:

    非常謝謝小花大與准大

    有你們的協助讓我也能學習到更多

還有問題?馬上發問,尋求解答。