Board logo

標題: VBA如何把字串中的英文字前插入空格? [打印本頁]

作者: s13030029    時間: 2022-8-24 09:04     標題: VBA如何把字串中的英文字前插入空格?

請問VBA要如何在同一儲存格中,在英文字的前面插入空格?
如下圖左邊處理前,右邊處理後。

[attach]35170[/attach]
作者: Andy2483    時間: 2022-8-24 16:27

回復 1# s13030029


    請前輩試試看

Option Explicit
Sub test()
Dim Arr, i, x, T, j$, c
Arr = Range([A1], [A65536].End(3))
For i = 1 To UBound(Arr)
   j = Trim(Arr(i, 1))
   c = Len(j)
   For x = c To 2 Step -1
      If UCase(Mid(j, x, 1)) Like "[A-Z]" Then
         j = Trim(Mid(j, 1, x - 1)) & " " & Mid(j, x, c * 2)
      End If
   Next
   Arr(i, 1) = j
Next
[B1].Resize(UBound(Arr), 1) = Arr
End Sub
作者: samwang    時間: 2022-8-24 18:30

回復 1# s13030029

請測試看看,謝謝

Sub test()
Dim Arr, i, x, T, j$, c
Arr = Range([A1], [A65536].End(3))
For i = 1 To UBound(Arr)
    j = Trim(Arr(i, 1))
    c = Len(j)
    For x = c To 2 Step -1
        T = UCase(Mid(j, x, 1))
        If Asc(T) > 64 And Asc(T) < 123 Then
            Arr(i, 1) = Replace(Arr(i, 1), T, " " & T)
        End If
   Next
Next
[B1].Resize(UBound(Arr), 1) = Arr
End Sub
作者: s13030029    時間: 2022-8-25 08:37

本帖最後由 s13030029 於 2022-8-25 08:41 編輯

回復 2# Andy2483
因為我這個是要處理同一儲存格中的字串,而且還有換行,所以在Arr的地方會有出錯。
[attach]35171[/attach]
作者: s13030029    時間: 2022-8-25 08:38

本帖最後由 s13030029 於 2022-8-25 08:41 編輯

回復 3# samwang
因為我這個是要處理同一儲存格中的字串,而且還有換行,所以在Arr的地方會有出錯。
[attach]35172[/attach]
作者: samwang    時間: 2022-8-25 09:35

本帖最後由 samwang 於 2022-8-25 09:38 編輯
回復  samwang
因為我這個是要處理同一儲存格中的字串,而且還有換行,所以在Arr的地方會有出錯。
s13030029 發表於 2022-8-25 08:38


Arr = Range([A1], [A65536].End(3)) 改成 Arr = [a1],for 循環移除,還有...,可以試著改看看,有問題再提出,謝謝
作者: hcm19522    時間: 2022-8-25 10:17

函數 參考
https://blog.xuite.net/hcm19522/twblog/590513450
作者: s13030029    時間: 2022-8-25 10:29

回復 6# samwang
請問Arr要怎樣才能抓跨行的資料呢?
因為在這行就出錯了
作者: Andy2483    時間: 2022-8-25 11:49

回復 8# s13030029


    謝謝前輩發表此主題,請前輩再試試看
謝謝 samwang 前輩 指導
後學認識了 Asc與Chr 的關係,
後學對字典觀念薄弱 藉此習得把字元倒入字典中
請前輩再指導!

Option Explicit
Sub test4() '單列或多列都可以用
Dim Arr, i, x, j$, c, d, xD, T
Arr = Range([A1], [A65536].End(3).Offset(1, 0))
Set xD = CreateObject("Scripting.Dictionary")
For d = 65 To 122 '65~90是大寫 97~122是小寫
   xD(d) = Chr(d)
   If d = 90 Then d = 96
Next
T = Join(xD.items, "//")
For i = 1 To UBound(Arr) - 1
   j = Arr(i, 1)
   j = Replace(Replace(j, " ", ""), " ", "") '去除空白字元
   c = Len(j)
   For x = c To 2 Step -1
      If InStr(T, Mid(j, x, 1)) And Mid(j, x - 1, 1) <> vbLf Then
         j = Mid(j, 1, x - 1) & " " & Mid(j, x, c * 2)
      End If
   Next
   Arr(i, 1) = j
Next
[B1].Resize(UBound(Arr) - 1, 1) = Arr
Set Arr = Nothing
End Sub
作者: s13030029    時間: 2022-8-25 14:25

回復 9# Andy2483
非常感謝~使用起來沒有問題!!!
作者: samwang    時間: 2022-8-25 17:31

回復  samwang
請問Arr要怎樣才能抓跨行的資料呢?
因為在這行就出錯了
s13030029 發表於 2022-8-25 10:29


請再測試看看,謝謝
Sub test()
Dim Arr, a, T, i&, x, j%
Arr = Range([A1], [A65536].End(3).Offset(1, 0))
For i = 1 To UBound(Arr) - 1
    a = Split(Trim(Arr(i, 1)), Chr(10))
    For x = 0 To UBound(a)
        For j = 2 To Len(a(x))
            T = UCase(Mid(a(x), j))
            If Asc(T) > 64 And Asc(T) < 123 Then
                If Cells(i, 2) = "" Then
                    Cells(i, 2) = Replace(a(x), T, " " & T)
                Else
                    Cells(i, 2) = Cells(i, 2) & Chr(10) & Replace(a(x), T, " " & T)
                End If
            End If
        Next
    Next
Next
End Sub
作者: 准提部林    時間: 2022-9-3 10:48

回復 2# Andy2483


If Mid(j, x, 1) Like "[A-z]" Then  大小通吃~~
作者: Andy2483    時間: 2022-9-3 11:57

回復 12# 准提部林
    謝謝 前輩指導
作者: Andy2483    時間: 2022-12-15 11:11

回復 2# Andy2483


    修正自己的認知
j = Trim(Mid(j, 1, x - 1)) & " " & Mid(j, x, c * 2) 改為
j = Trim(Mid(j, 1, x - 1)) & " " & Mid(j, x)即可
當初學習時還在考慮 length 要用多少??  

https://learn.microsoft.com/zh-tw/office/vba/language/reference/user-interface-help/mid-function
Mid(string, start, [ length ])
string        必要。 字串運算式的功能是會從中傳回字元。 如果 字串 包含 Null,則傳回 Null。
start        必要;Long。 string 中要擷取做為開始部分的字元位置。 如果 start 中的字元數大於 string,則 Mid 會傳回零長度字串 ("")。
length        選用;Variant (Long)。 要傳回的字元數。 如果省略此參數,或是字元數少於文字中的 length 字元 (包含 start 所在的字元),就會傳回從 start 位置開始一直到字串結尾的所有字元。




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)