返回列表 上一主題 發帖

[發問] 橫式資料轉換為直式資料

回復 9# aer


    曾幫朋友整理過類似的資料,提供幾個建議參考
   1.應考慮資料唯一性,姓名是有可能重複的,應加入身份證號或報名代號等等一併處理,不然後續常有問題
   2.注意排序需求,例如用日期或第xx梯的xx排序(用xx排序,可能得自建清單)
   3.准版已給了完整的公式和vba,後續看單位長官或需求單位常需要提供各種不同型式整理後的資料,可運用樞紐分析作初步整理再進行細項調整。

TOP

回復 10# 准提部林
謝謝准提部林版主,如有問題再請教您,再次感謝您!

TOP

回復 11# KCC
KCC 謝謝您的指教,此資料轉換後即是用樞紐分析表做統計分析 。

TOP

本帖最後由 handmuch 於 2016-7-25 22:32 編輯

類似的問題很多人都問過 只是題目長得不太一樣     這類都是二維轉一維

可以用"樞紐分析表和樞紐分析圖精靈"來完成!!

二維轉一維教學影片
http://expresmile.teachable.com

TOP

本帖最後由 Andy2483 於 2022-12-2 10:04 編輯

回復 1# aer
回復 10# 准提部林


    謝謝前輩指導
謝謝 aer前輩發表此主題與範例
以下心得註解請再指導!謝謝

Option Explicit
Sub TEST()
Dim Arr, Brr, T, i&, N&, j%
'↑宣告變數(Arr,Brr,T)是通用型變數,(i,N)是長整數,(j)是短整數,
請教 准提部林前輩:
1.這裡的j變數為什麼要宣告為短整數?
2.什麼時候該用長整數? 短整數?

With Sheets("Sheet1").UsedRange
'↑以下是關於 名為: "Sheet1" 工作表的使用儲存格的程序
'使用儲存格是指有被編輯過的儲存格
'工作表的使用儲存格是指:能涵蓋所有 使用儲存格 的最小方正區域
'例如:
'1.開個全新的工作表>[D3]輸入 "左上角",[F10]輸入 "右下角" ,.Address=$D$3:&F$10]
'2.再在[K2]輸入 "右上角" .Address=$D$2:$K$10
'3.再在[G12]輸入 "下邊邊" .Address=$D$2:$K$12
'4.再在[H1]輸入 "上邊邊" .Address=$D$1:$K$12]
'5.再在[S20]輸入 "新右下角" .Address=$D$1:$S$20]
'謝謝 准提部林前輩常用不同的陳述方式讓後輩學習!謝謝

     Arr = .Value
     '↑令Arr是二維陣列!陣列值就是 工作表的使用儲存格的值
     ReDim Brr(1 To .Count, 1 To 3)
     '↑宣告二維Brr陣列的範圍! 縱向從1 到工作表的使用儲存格格數 列,
     '橫向從1 到3欄

End With
For i = 2 To UBound(Arr)
'↑設外順迴圈i變數從2 到Arr陣列的縱向最大列號數
   For j = 2 To UBound(Arr, 2)
   '↑設內順迴圈j變數從2 到Arr陣列的橫向向最大欄號數
      If Arr(i, j) <> "" Then
      '↑如果迴圈Arr陣列值 不是空字元??
         N = N + 1
         '↑N累加 1
         'N變數在前面都沒出現過!
         '只有宣告是 長整數,所以N的初始值是0 ,每次if條件成立就會加 1

         T = Split(Trim(Arr(i, j)), "梯")
         '↑令T變數是 迴圈Arr陣列值經過去頭尾空白字元後,
         '以"梯"字元分割的一維陣列
         'T變數在最前面是宣告為 通用型變數!此一動作會讓T變成一維陣列
         'T變數變化舉例:T=5 (T是數字),T="5" (T是字串),T=5 & 5 (T是字串)

         Brr(N, 1) = Arr(i, 1)
         '↑將Arr陣列迴圈列第一欄的值倒入 Brr陣列N列第一欄裡
         Brr(N, 2) = T(0) & "梯"
         '↑將T這一維陣列的第一個值連接"梯"成為字串後,放進Brr陣列N列第二欄裡
         '因為被Split()拆解的陣列都從(0)開始編號!
         Brr(N, 3) = T(1)
         '↑將T這一維陣列的第二個值,放進Brr陣列N列第三欄裡
      End If
   Next j
Next i
With Sheets("Sheet2")
'↑以下是關於 名為: "Sheet2" 工作表的程序
     .UsedRange.Clear
     '↑工作表的使用儲存格清除掉!
     '這個動作會讓.UsedRange.Address=$A$1
     If N = 0 Then Exit Sub
     '↑如果N變數是0,就結束程式執行!
     'N變數如果是0,是因為前面的程序IF條件都不成立!N都沒機會累加

     .[A1:C1] = Array("姓名", "梯次", "日期")
     '↑[A1],[B1],[C1]儲存格用一維陣列個別倒進去,[A1]="姓名",[B1]="梯次",[C1]="日期"
     .[A2:C2].Resize(N) = Brr
     '↑從[A2:C2]向下擴展N變數 列數的區域儲存格,以Brr陣列值倒進去
     Application.Goto .[A1]
     '↑儲存格游標跳到Sheets("Sheet2").[A1]
End With
End Sub

TOP

'使用儲存格是指有被編輯過的儲存格
'工作表的使用儲存格是指:能涵蓋所有 使用儲存格 的最小方正區域
'例如:
'1.開個全新的工作表>[D3]輸入 "左上角",[F10]輸入 "右下角" ,.Address=$D$3:&F$10]
'2.再在[K2]輸入 "右上角" .Address=$D$2:$K$10
'3.再在[G12]輸入 "下邊邊" .Address=$D$2:$K$12
'4.再在[H1]輸入 "上邊邊" .Address=$D$1:$K$12
'5.再在[S20]輸入 "新右下角" .Address=$D$1:$S$20

TOP

        靜思自在 : 有多少力量就做多少事,不要心存等待,等待才會落空。
返回列表 上一主題