亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用VBA在Excel中融化/重塑?

使用VBA在Excel中融化/重塑?

吃雞游戲 2019-12-02 11:06:23
我目前正在適應新工作,我與同事共享的大部分工作都是通過MS Excel。我經常使用數據透視表,因此需要“堆疊的”數據,恰恰是我依賴R melt()的reshape(reshape2)包中函數的輸出。誰能讓我開始使用VBA宏來完成此任務,或者已經存在?宏的輪廓為:在Excel工作簿中選擇一個單元格區域。啟動“融化”宏。宏將創建一個提示,“輸入ID列數”,在此輸入標識信息前幾列。(例如下面的示例R代碼為4)。在excel文件中創建一個名為“ melt”的新工作表,該工作表將堆疊數據,并創建一個名為“ variable”的新列,該列等于原始選擇的數據列標題。換句話說,輸出看起來與簡單地在R中執行這兩行的輸出完全相同:require(reshape)melt(your.unstacked.dataframe, id.vars = 1:4)這是一個例子:# unstacked data> df1  Year Month Country  Sport No_wins No_losses High_score Total_games2 2010     5     USA Soccer       4         3          5           93 2010     6     USA Soccer       5         3          4           84 2010     5     CAN Soccer       2         9          7          115 2010     6     CAN Soccer       4         8          4          136 2009     5     USA Soccer       8         1          4           97 2009     6     USA Soccer       0         0          3           28 2009     5     CAN Soccer       2         0          6           39 2009     6     CAN Soccer       3         0          8           3# stacking the data> require(reshape)> melt(df1, id.vars=1:4)  Year Month Country  Sport    variable value1  2010     5     USA Soccer     No_wins     42  2010     6     USA Soccer     No_wins     53  2010     5     CAN Soccer     No_wins     24  2010     6     CAN Soccer     No_wins     45  2009     5     USA Soccer     No_wins     86  2009     6     USA Soccer     No_wins     07  2009     5     CAN Soccer     No_wins     28  2009     6     CAN Soccer     No_wins     39  2010     5     USA Soccer   No_losses     310 2010     6     USA Soccer   No_losses     311 2010     5     CAN Soccer   No_losses     912 2010     6     CAN Soccer   No_losses     813 2009     5     USA Soccer   No_losses     114 2009     6     USA Soccer   No_losses     015 2009     5     CAN Soccer   No_losses     016 2009     6     CAN Soccer   No_losses     017 2010     5     USA Soccer  High_score     518 2010     6     USA Soccer  High_score     419 2010     5     CAN Soccer  High_score     7
查看完整描述

3 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

Microsoft最近推出了Power Query,這是一個Excel加載項,它為Excel內的數據操作添加了許多有趣的功能,包括您要查找的內容。

內外接的實際功能被稱為“逆透視列”,這是解釋在這篇文章中。這是要點:

  1. 下載并安裝加載項

  2. 打開您的Excel / CSV文件

  3. 選擇要熔化/重塑的表/范圍

  4. 在“高級查詢”選項卡中,單擊“從表”,這將打開“查詢編輯器”

  5. 選擇您要熔化/重塑的列(按Ctrl或Shift-Select,不要拖動)

  6. 在“轉換”選項卡中,單擊“取消透視列”(您還可以在此處應用其他轉換,然后再返回Excel)

  7. 在“主頁”選項卡中,單擊“關閉并加載”。這將在Excel中創建具有所需結果的新表/查詢對象。


查看完整回答
反對 回復 2019-12-02
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

首先創建一個用戶窗體,并將其命名為Unpivot_Form,其中包含兩個RefEdit字段-rng_id和value_id以及一個提交/執行按鈕。我也是R用戶,rng_id是包含id的范圍,而value_id包含值;兩個范圍都包括標題。


做兩個宏:


Sub unpivot()

Unpivot_Form.Show

End Sub

另一個宏位于該字段的提交/執行按鈕內:


Private Sub submit_Click()

'Code to unpivot (convert wide to long for excel)


Dim rng_id, rng_id_header, val_id As Range

Dim colvar, emptyrow, col As Integer

Dim new_sheet As Worksheet


'Put val_id range into a range object

Set val_id = Range(value_id.Value)


'Determine the parameter for the value id range

'This is used for the looping later on

numrows = val_id.Rows.Count

numcols = val_id.Columns.Count


'Resize changes the "block" to the size defined by the row and column

'Offset moves the "block"

Set rng_id_header = Range(range_id.Value).Resize(1)

Set rng_id = Range(range_id.Value).Offset(1, 0).Resize(numrows - 1)


Set new_sheet = Worksheets.Add


'Set up the first column and first batch of id vars

new_sheet.Activate

Range("A65535").End(xlUp).Activate

rng_id_header.Copy ActiveCell

colvar = Range("XFD1").End(xlToLeft).Column + 1

Range("XFD1").End(xlToLeft).Offset(, 1).Value = "Variable"

Range("XFD1").End(xlToLeft).Offset(, 1).Value = "Value"


'Start populating the value ids

For col = 1 To numcols


  'populate var_id

  'determine last row

   emptyrow = Range("A65535").End(xlUp).Row + 1

   'no need to activate to source to copy

   rng_id.Copy new_sheet.Cells(emptyrow, 1)

  'copy the variable

  val_id.Offset(, col - 1).Resize(1, 1).Copy new_sheet.Range(Cells(emptyrow, colvar), Cells(emptyrow + numrows - 2, colvar))

  'copy the value

  val_id.Offset(1, col - 1).Resize(numrows - 1, 1).Copy new_sheet.Range(Cells(emptyrow, colvar + 1), Cells(emptyrow + numrows - 2, colvar + 1))


Next


Unload Me


End Sub

請享用!


查看完整回答
反對 回復 2019-12-02
  • 3 回答
  • 0 關注
  • 727 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號