返回列表 上一主題 發帖

[發問] 如何把三個儲存格內容整合成一個並對齊

回復 10# olisun

陣列公式
e2    =IF(AND(A2<>"",C2<>""),(A2&REPT(" ",MAX(LEN($A$2:$A$1000))-LEN(A2)) & IF(B2=""," ","+") & B2 & REPT(" ",MAX(LEN($B$2:$B$1000))-LEN(B2)+1) & C2),"")

TOP

本帖最後由 Andy2483 於 2022-12-28 15:30 編輯

回復 1# olisun


    謝謝前輩發表此主題與範例,謝謝各位前輩指導
後學藉此帖習得很多知識與經驗,用布林變數整合迴圈,認識Rept()運算式.....
以下執行過程與心得註解請各位前輩指導

執行前:


執行結果:


Option Explicit
Sub TEST_20221228_2()
Dim Arr, i&, j&, S&, A&(3), B$(3), T As Boolean
'↑宣告變數:Arr是通用型變數,(i,j,S)是長整數變數,(A,B)是一維陣列,T是布林變數
Arr = Range([C2], [A65536].End(3))
'↑令Arr是二維陣列!以[C2]到A欄最後有內容儲存格值倒入
Head:
S = IIf(T, 1, 3)
'↑令S這長整數變數依 IIf()判斷T變數是Ture:S=1,T變數是False:S=3
For i = 1 To S
'↑設順迴圈!i從1到S變數
   For j = 1 To UBound(Arr)
   '↑設順迴圈!j從1到Arr陣列縱向最大列索引號
      If T Then
      '↑如果T變數是 Ture     PS:T是 布林變數,其初始值是False
         B(1) = Arr(j, 1) & Application.Rept(" ", A(1) - Len(Arr(j, 1)))
         '↑令索引號1的B陣列值是 j迴圈列第1欄Arr陣列值連接 數個" "空白字元,
         '數個?:以Rept()運算式複製(索引號1的A陣列值- j迴圈列第1欄Arr陣列值的字數)個" "空白字元
         'https://learn.microsoft.com/zh-tw/office/vba/api/excel.worksheetfunction.rept

         B(2) = Arr(j, 2) & Application.Rept(" ", A(2) - Len(Arr(j, 2)))
         '↑類推
         Arr(j, i) = B(1) & "+" & B(2) & " " & Arr(j, 3)
         '↑令j迴圈列i迴圈欄Arr陣列值是 三個B陣列值連接"+"和" "符號的字串
         ElseIf A(i) < Len(Arr(j, i)) Then
         '↑否則如果i迴圈A陣列值 < j迴圈列i迴圈欄Arr陣列值裡的字數??
            A(i) = Len(Arr(j, i))
            '↑令i迴圈A陣列值是 j迴圈列i迴圈欄Arr陣列值裡的字數
            '(求最大字數)
      End If
   Next
Next
If T = False Then T = True: GoTo Head
'↑如果T變數是 False,就讓T變數是 True,程序跳到 Head標示處繼續執行
[H2].Resize(UBound(Arr), 1) = Arr
'↑令[H2]擴展向下Arr陣列縱向最大列索引號數,向右不擴展,這欄儲存格值以Arr陣列值倒入
Set Arr = Nothing
Erase A, B
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2022-12-29 15:11 編輯

回復 12# Andy2483


    練習改為自訂函數,請各位前輩指導,謝謝
[I2]儲存格輸入:    =三欄合併以字符連接並對齊("="," ",A2:C2,A:C)


I2下拉至I6:


Option Explicit
Function 三欄合併以字符連接並對齊(X As String, Y As String, Z As Range, Area As Range)
'↑自訂函數:三欄合併以字符連接並對齊(第一個連接字符,第二個連接字符,連接儲存格,對齊參照儲存格)
Dim Arr, i&, j&, S&, A&(2), B$(2), T As Boolean
Arr = Area
Head:
S = IIf(T, 1, 2)
For i = 1 To S
   For j = 1 To UBound(Arr)
      If Arr(j, 1) = "" Then Exit For
      If T Then
         B(1) = Arr(j, 1) & Application.Rept(" ", A(1) - Len(Arr(j, 1)))
         B(2) = Arr(j, 2) & Application.Rept(" ", A(2) - Len(Arr(j, 2)))
         Arr(j, i) = B(1) & "+" & B(2) & " " & Arr(j, 3)
         ElseIf A(i) < Len(Arr(j, i)) Then
            A(i) = Len(Arr(j, i))
      End If
   Next
Next
If T = False Then T = True: GoTo Head
三欄合併以字符連接並對齊 = Arr(Z.Row, 1)
Set Arr = Nothing
Erase A, B
End Function
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 【行善要及時】行善要及時,功德要持續。如燒開水一般,未燒開之前千萬不要停熄火候,否則重來就太費事了。
返回列表 上一主題