Stata迴歸結果導出到Excel的一鍵後續處理——基於Excel宏功能

預期效果

Stata控制行業、年份迴歸,導出到Excel後,會生成很多很多行年份、行業的虛擬變量,需要手動調整格式,刪除很多很多行才能複製粘貼到論文中,對於經常跑回歸的人來說,一次一次重複很浪費時間,於是我利用Excel宏功能設置了條自動整理格式的宏。
【宏運行前】
在這裏插入圖片描述
在這裏插入圖片描述
【宏運行後】
在這裏插入圖片描述

實現過程

相信學過計量使用Stata的都知道如何從Stata輸出多個迴歸結果到Excel:

reg y1 x1 x2 x3 x4 ......  xn  i.Ind2  i.year 
est store res1 
reg y1 x1 x2 x3 x4 ......  xn  i.Ind2  i.year 
est store res2
reg y1 x1 x2 x3 x4 ......  xn  i.Ind2  i.year 
est store res3
reg y1 x1 x2 x3 x4 ......  xn  i.Ind2  i.year 
est store res4
outreg2 [res1 res2 res3 res4] using auditorreturn1,tstat e(r2_a,F) bdec(3) tdec(2) excel replace

下面開始在Excel中進行宏操作:
可將整個過程拆解成五步
第一步,錄製一個處理表頭的宏,主要操作包括刪除不必要的行,設置邊框,圖中高亮處爲光標初始定位點。
下面代碼是錄製宏時VBA窗口自動生成的代碼,後面將基於此段代碼進行改寫,這樣做相比於直接寫代碼要容易上手。

Sub 宏3()
'
' 宏3 宏
    Range("A3:E3").Select
    Selection.Delete Shift:=xlUp
    Range("A4:E4").Select
    Selection.Delete Shift:=xlUp
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    Range("A4").Select

End Sub

第二步,打開第一步錄製宏的VBA窗口,將單元格默認的絕對引用改成相對引用,再寫三行簡單的代碼將活動單元格從表頭移動到後面行業虛擬變量2.Ind2處(即上圖中第2個高亮處),改完的代碼如下:

Sub 宏1()
'
' 宏1 宏
    ActiveCell.Range("A1:E1").Select
    Selection.Delete Shift:=xlUp
    ActiveCell.Range("A2:E2").Select
    Selection.Delete Shift:=xlUp
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    ActiveCell.Range("A1").Select
    
    Do While ActiveCell.Range("A1") <> "2.Ind2"
        ActiveCell.Offset(1, 0).Range("A1").Select
    Loop
    
End Sub

第三步,錄製一個連續刪除行的宏,打開VBA窗口,將剛剛生成刪除行的代碼改寫一個循環,修改後的代碼如下。

Sub Stata輸出正式整理()
	Do While ActiveCell.Range("A1") <> "Constant"
	        ActiveCell.Range("A1:E1").Select
	        Selection.Delete Shift:=xlUp
	        ActiveCell.Range("A1").Select
	    Loop
	  ActiveCell.Range("A1:E1").Select
	  Selection.Delete Shift:=xlUp
	  ActiveCell.Range("A1").Select
End Sub

該代碼實現的功能是從給定的初始位置刪除行,直到刪除第一個單元格的內容是“Constant”。(即上圖中第三個高亮處)

第四步,在第三步的基礎上再寫幾行代碼,在“Constant”後面兩行寫上控制行業和年份等內容。新增的代碼如下:

  ActiveCell.Range("A1") = "控制行業"
  ActiveCell.Range("A2") = "控制年份"
  ActiveCell.Range("B1") = "Y"
  ActiveCell.Range("B2") = "Y"
  ActiveCell.Range("C1") = "Y"
  ActiveCell.Range("C2") = "Y"
  ActiveCell.Range("D1") = "Y"
  ActiveCell.Range("D2") = "Y"
  ActiveCell.Range("E1") = "Y"
  ActiveCell.Range("E2") = "Y"

第五步,最後將第二、三、四步中的代碼拼接起來,即實現整個功能。可以點擊開發工具裏面的宏運行,也可以設置快捷鍵運行,還可以設置控件按鈕通過按鈕進行。
最終整理後代碼如下:

Sub Stata輸出正式整理()
'
' 宏2 宏
'
    ActiveCell.Range("A1:E1").Select
    Selection.Delete Shift:=xlUp
    ActiveCell.Range("A2:E2").Select
    Selection.Delete Shift:=xlUp
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    ActiveCell.Range("A1").Select
    
    Do While ActiveCell.Range("A1") <> "2.Ind2"
        ActiveCell.Offset(1, 0).Range("A1").Select
    Loop

    Do While ActiveCell.Range("A1") <> "Constant"
        ActiveCell.Range("A1:E1").Select
        Selection.Delete Shift:=xlUp
        ActiveCell.Range("A1").Select
    Loop
    ActiveCell.Range("A1:E1").Select
    Selection.Delete Shift:=xlUp
    ActiveCell.Range("A1").Select
    
    ActiveCell.Range("A1") = "控制行業"
    ActiveCell.Range("A2") = "控制年份"
    ActiveCell.Range("B1") = "Y"
    ActiveCell.Range("B2") = "Y"
    ActiveCell.Range("C1") = "Y"
    ActiveCell.Range("C2") = "Y"
    ActiveCell.Range("D1") = "Y"
    ActiveCell.Range("D2") = "Y"
    ActiveCell.Range("E1") = "Y"
    ActiveCell.Range("E2") = "Y"
    
End Sub
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章