返回列表 上一主題 發帖

姓名按起或止及日期排列顯示

姓名按起或止及日期排列顯示

請問先進,小弟有個檔案(如附檔),需要將左表的資料,顯示成右表的排列,請問函數公式要如何設定,謝謝先進! 姓名按起止日期排列.zip (9.57 KB)

回復 1# shan0948


    謝謝前輩發表此主題與範例
後學藉此主題練習VBA陣列的建議方案下,請前輩試試看

執行前:
2023-02-21_092357.JPG
2023-2-21 09:36


執行結果:
2023-02-21_092720.JPG
2023-2-21 09:36


Option Explicit
Sub TEST()
Dim Brr, i&, N&, T1&, T6$, T7$
Brr = Range([G4], Cells(Rows.Count, 1).End(3))
For i = 1 To UBound(Brr)
   T1 = Val(Brr(i, 1)): T6 = Brr(i, 6): T7 = Trim(Brr(i, 7))
   Brr(i, 2) = "": Brr(i, 3) = ""
   If T7 = "" Then GoTo 111
   If T1 > 0 Then
      N = i
      If T7 = "起" Then Brr(N, 2) = T6
      If T7 = "止" Then Brr(N, 3) = T6
      ElseIf T7 = "起" Then
         Brr(N, 2) = IIf(Brr(N, 2) = "", T6, Brr(N, 2) & "、" & T6)
      ElseIf T7 = "止" Then
         Brr(N, 3) = IIf(Brr(N, 3) = "", T6, Brr(N, 3) & "、" & T6)
   End If
111
Next
[J4].Resize(N, 3) = Brr
End Sub
看得懂是應該的,懂得應用才像學生,臉皮厚點學會更謹慎積極

TOP

回復 2# Andy2483


    感謝前輩的指導,因小弟需要在不同表內使用,可否使用函數公式較為簡單,感恩謝謝!

TOP

回復 3# shan0948


    謝謝前輩回復
後學函數公式很弱,函數公式比VBA難,後學努力學習中,等函數公式厲害的前輩指導
一起學習
看得懂是應該的,懂得應用才像學生,臉皮厚點學會更謹慎積極

TOP

本帖最後由 Andy2483 於 2023-2-21 11:30 編輯

回復 3# shan0948


    謝謝前輩發表此主題,讓後學有練習此情境的機會
以下是資料表與結果表不同工作表的方案,請前輩參考



Option Explicit
Sub TEST()
Dim Brr, i&, N&, T1&, T6$, T7$, Sh1 As Worksheet, Sh2 As Worksheet
'↑宣告變數:Brr是通用型變數,(i,N,T1)是長整數變數,(T6,T7)是字串變數,
'(Sh1,Sh2)是工作表變數

Set Sh1 = Sheets("資料表")
'↑令Sh1這工作表變數是 名為"資料表"的工作表
Set Sh2 = Sheets("結果表")
'↑令Sh2這工作表變數是 名為"結果表"的工作表
Brr = Range(Sh1.[G4], Sh1.Cells(Rows.Count, 1).End(3))
'↑令Brr是二維陣列!以資料表[G4]到A欄最後一個有內容儲存格,這範圍值帶入陣列裡
For i = 1 To UBound(Brr)
'↑設順迴圈!i從1到Brr陣列縱向最大索引列號數
   T1 = Val(Brr(i, 1)): T6 = Brr(i, 6): T7 = Trim(Brr(i, 7))
   '↑令T1這長整數變數是 i迴圈列第1欄Brr陣列值,以Val()轉化回傳數值,
   '↑令T6這字串變數是 i迴圈列第6欄Brr陣列值
   '↑令T7這字串變數是 i迴圈列第7欄Brr陣列值,以Trim()去除頭尾空白字元後的新字串

   Brr(i, 2) = "": Brr(i, 3) = ""
   '↑令i迴圈列第2欄Brr陣列值是 空字元:令i迴圈列第3欄Brr陣列值是 空字元
   If T7 = "" Then GoTo 111
   '↑如果T7變數是 空字元!就跳到 111位置繼續執行
   If T1 > 0 Then
   '↑如果T1變數大於 0??
      N = i
      '↑令N這長整數變數是i迴圈數
      If T7 = "起" Then Brr(N, 2) = T6
      '↑如果T7變數是 "起"!就令i迴圈列第2欄Brr陣列值是 T6變數
      If T7 = "止" Then Brr(N, 3) = T6
      '↑如果T7變數是 "止"!就令i迴圈列第3欄Brr陣列值是 T6變數
      ElseIf T7 = "起" Then
      '↑否則如果T1是 0或小於0!而且T7變數是 "起"字串
         Brr(N, 2) = IIf(Brr(N, 2) = "", T6, Brr(N, 2) & "、" & T6)
         '↑令i迴圈列第2欄Brr陣列值是 IIf()回傳值:
         '如果i迴圈列第2欄Brr陣列值是空字元,IIf()回傳值是T6變數,
         '否則,IIf()回傳值是i迴圈列第2欄Brr陣列值連接"、",再連接T6變數後的新字串

      ElseIf T7 = "止" Then
      '↑否則如果T1是 0或小於0!而且T7變數是 "止"字串
         Brr(N, 3) = IIf(Brr(N, 3) = "", T6, Brr(N, 3) & "、" & T6)
         '↑令i迴圈列第3欄Brr陣列值是 IIf()回傳值:
         '如果i迴圈列第3欄Brr陣列值是空字元,IIf()回傳值是T6變數,
         '否則,IIf()回傳值是i迴圈列第3欄Brr陣列值連接"、",再連接T6變數後的新字串

   End If
111
Next
Sh2.[J4].Resize(N, 3) = Brr
'↑令結果表[J4]擴展向下N列,向右擴展3欄範圍的儲存格以Brr陣列值帶入
Application.Goto Sh2.[J4]
'↑令儲存格游標跳到 結果表[J4]位置
End Sub
看得懂是應該的,懂得應用才像學生,臉皮厚點學會更謹慎積極

TOP

隨意窩 "EXCEL迷"  blog  或https://blog.xuite.net/hcm19522/twblog
已收集8500篇 EXCEL函數

TOP

回復 5# Andy2483


    感謝先進的指導!

TOP

回復 6# hcm19522


   非常感謝先進的指導,經測試後符合需求,助益甚大,感恩謝謝!

TOP

回復 6# hcm19522


    先進好,之前的資料顯示函數公式,因實際需要增加條件判斷,原函數公式請問要如何修正,詳細說明如附檔,謝謝! 姓名按起止日期排列-更新.zip (14.19 KB)

TOP

回復 9# shan0948


    謝謝前輩
後學練習VBA方式的解決方案如下,請前輩參考

執行結果:
2023-03-14_115528.JPG
2023-3-14 11:58


Option Explicit
Sub TEST()
Dim Brr, i&, N&, T1&, T6$, T7$, T8$
Brr = Range([H4], Cells(Rows.Count, 1).End(3))
For i = 1 To UBound(Brr)
   T1 = Val(Brr(i, 1)): T6 = Trim(Brr(i, 6)): T7 = Trim(Brr(i, 7))
   T8 = Trim(Brr(i, 8))
   Brr(i, 2) = "": Brr(i, 3) = "": Brr(i, 4) = "": Brr(i, 5) = ""
   If T8 = "" Then GoTo 111
   If T1 > 0 Then
      N = i
      If T8 = "起" Then Brr(N, 2) = T6
      If T8 = "止" Then Brr(N, 3) = T6
      ElseIf T8 = "起" Then
         Brr(N, 2) = IIf(Brr(N, 2) = "", T6, Brr(N, 2) & "、" & T6)
      ElseIf T8 = "止" Then
         Brr(N, 3) = IIf(Brr(N, 3) = "", T6, Brr(N, 3) & "、" & T6)
         If T7 = "離職" Then
            Brr(N, 5) = IIf(Brr(N, 5) = "", T6, Brr(N, 5) & "、" & T6)
         End If
   End If
   If T8 = "起" And (T7 = "新進" Or T7 = "他訓轉入") Then
      Brr(N, 4) = IIf(Brr(N, 4) = "", T6, Brr(N, 4) & "、" & T6)
   End If
   If T8 = "止" And T7 = "離職" Then
      Brr(N, 5) = IIf(Brr(N, 5) = "", T6, Brr(N, 5) & "、" & T6)
   End If
111
Next
[K4].Resize(N, 5) = Brr
End Sub
看得懂是應該的,懂得應用才像學生,臉皮厚點學會更謹慎積極

TOP

        靜思自在 : 【生命在呼吸間】佛陀說:「生命在呼吸間。」人無法管住自己的生命,更無法擋住死期,讓自己永住人間。既然生命去來這麼無常,我們更應該好好地愛惜它、利用它、充實它,讓這無常、寶貴的生命,散發它真善美的光輝,映照出生命真正的價值。
返回列表 上一主題