天天看點

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

預期效果

Stata控制行業、年份回歸,導出到Excel後,會生成很多很多行年份、行業的虛拟變量,需要手動調整格式,删除很多很多行才能複制粘貼到論文中,對于經常跑回歸的人來說,一次一次重複很浪費時間,于是我利用Excel宏功能設定了條自動整理格式的宏。

【宏運作前】

Stata回歸結果導出到Excel的一鍵後續處理——基于Excel宏功能
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
           

繼續閱讀