Board logo

標題: 組合字串加入空白字元區隔 [打印本頁]

作者: p212    時間: 2013-5-20 11:09     標題: 組合字串加入空白字元區隔

問題描述如圖示,敬請版友們指教,謝謝!
作者: Bodhidharma    時間: 2013-5-20 12:46

本帖最後由 Bodhidharma 於 2013-5-20 12:48 編輯

回復 1# p212

多字串結合好像是phonetic函數
但是phonetic函數又不能輸入公式,所以沒辦法使用像是
{phonetic(1:1&" ")} 之類的公式
所以大概得用輔助欄列=A1&" ",下拉右拉
再選擇性貼上→值
然後再用phonetic連起來

我也不知道有沒有更好的方式
大概得寫VBA吧

[attach]15035[/attach]
作者: zz5151353    時間: 2013-5-24 22:04

問題描述如圖示,敬請版友們指教,謝謝!
p212 發表於 2013-5-20 11:09


請參考一下
作者: aer    時間: 2013-5-25 09:35

請參考一下
zz5151353 發表於 2013-5-24 22:04



    版主,請問您是如何做的?為什麼我照您的方法打,可是都會出現 #NAME? 呢?謝謝
作者: Bodhidharma    時間: 2013-5-25 09:46

回復 4# aer

耶…他寫了一個簡單的程式
可以到開發人員→Visual Basic→模組 查看
作者: 准提部林    時間: 2013-5-25 17:27

利用FUNCTION自訂函數,以分隔符號連接文字串,可能較簡單便利,也較具彈性!
作者: sunnyso    時間: 2013-6-4 00:29

  1. Function CONTEXT(inprng As Range, Optional delimiter As String, Optional row1st As Boolean) As String
  2.     'delimiter Optional. String character used to separate the substrings in the returned string.
  3.     'If omitted, a zero-length string (""), all items in the list are concatenated with no delimiters.
  4.     'row1st Optional. Boolean from Row to Column. If omitted, from column to row
  5.     Dim RowN As Double
  6.     Dim ColN%, i%
  7.     Dim TmpAr() As Variant
  8.     RowN = IIf(inprng.Rows.Count < 16384, inprng.Rows.Count, 16384)
  9.     ColN = inprng.Columns.Count
  10.    
  11.     Select Case 0
  12.         Case RowN + ColN - 2
  13.             CONTEXT = inprng
  14.         Case RowN - 1
  15.             CONTEXT = Join(Application.Transpose(Application.Transpose(inprng)), delimiter)
  16.         Case ColN - 1
  17.             CONTEXT = Join(Application.Transpose(inprng), delimiter)
  18.         Case Else
  19.             If row1st = True Then
  20.                 ReDim TmpAr(1 To RowN)
  21.                 For i = 1 To RowN
  22.                     TmpAr(i) = Join(Application.Transpose(Application.Index(Application.Transpose(inprng), , i)), delimiter)
  23.                 Next i
  24.                 CONTEXT = Join(TmpAr, delimiter)
  25.             Else
  26.                 ReDim TmpAr(1 To ColN)
  27.                 For i = 1 To ColN
  28.                     TmpAr(i) = Join(Application.Transpose(Application.Index(inprng, , i)), delimiter)
  29.                 Next i
  30.                 CONTEXT = Join(TmpAr, delimiter)
  31.             End If
  32.     End Select
  33. End Function
複製代碼
回復 3# zz5151353
作者: c_c_lai    時間: 2013-6-4 06:27

本帖最後由 c_c_lai 於 2013-6-4 06:28 編輯
版主,請問您是如何做的?為什麼我照您的方法打,可是都會出現 #NAME? 呢?謝謝
aer 發表於 2013-5-25 09:35

E2 (E2欄內之輸入內容):
  1. =CONCATENATE(A2, " ", B2, " ",C2, " ",D2)
複製代碼
或者是直接輸入:
  1. =A2 & " " & B2 & " " & C2 & " " & D2
複製代碼
兩者結果值是一樣的。
織田信長 李世民 曹操 王之渙
作者: p212    時間: 2013-6-4 09:17

回復 3# zz5151353
的確僅能以VBA解決問題,非常感謝Mr. zz5151353提供簡潔明確的通則解法。
ps. 該VBA語法必須置於「模組」內方可發揮功能,不然將會出現4# Mr. aer所提之「出現 #NAME?」問題。
作者: sunnyso    時間: 2013-6-4 09:58

這個自訂函數可以自己設定串接符號; 假如串接的是多欄多列,還可以設定先欄後列(或是先列後欄)

回復  zz5151353
sunnyso 發表於 2013-6-4 00:29

作者: ML089    時間: 2013-6-4 21:48

回復 3# zz5151353

太好了,你這簡短的VBA我看得懂。有一行好像可以不用。
  1. Function zz(i As Range) As String
  2.     For Each j In i
  3.         zz = Trim(zz & " " & j)
  4.     Next
  5.     'zz = Application.WorksheetFunction.Substitute(A, " ", " ")
  6. End Function
複製代碼

作者: Hsieh    時間: 2013-6-4 23:05

[attach]15167[/attach]
可製成增益集後引用
作者: 准提部林    時間: 2013-6-5 10:32

  1. Function QQString(QBase, QMark$, QBy%) As String
  2. Dim TT$, xR
  3. If Val(QBy) > 0 Then QBase = QBase
  4. For Each xR In QBase
  5.   If xR <> "" Then TT = TT & QMark & xR
  6. Next
  7. QQString = Mid(TT, 2)
  8. End Function
複製代碼
 
公式:=QQString(A1:E5,"-",0)
   =QQString(A1:E5,"-",1)
 
QMark(連接符號).QBy=0(循列.由左而右>由上而下).QBy>0(循欄.由上而下>由左而右)
作者: sunnyso    時間: 2013-6-6 18:49

回復 13# 准提部林

If Val(QBy) > 0 Then QBase = QBase

請問這句放在Function 和 放在 Sub中會有不同結果,爲什麽?




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