2016-04-09 18 views
1

問題如下:我有一個包含多個工作表的Excel文件,我需要將每個工作表的G列複製到一個新的工作表中(列應位於彼此之間或具有數據的列之間的空列)。我還想問問是否可以將每個工作表的名稱放在相應的列上方。將多個工作表的列中的值複製到一箇中

到現在爲止,我用這個代碼:

Sub Copy_G_Columns() 
    Dim ws As Worksheet, i As Long 
    Application.ScreenUpdating = False 
    On Error Resume Next 
     Set ws = Sheets("Gee Columns") 
      If Err.Number <> 0 Then 
       ActiveWorkbook.Sheets.Add After:=ActiveWorkbook.Sheets(Sheets.Count): ActiveSheet.Name = "Gee Columns" 
        On Error GoTo 0 
       Else 
       Sheets("Gee Columns").Select 
      End If 

     For i = 1 To ActiveWorkbook.Sheets.Count - 1 
      With Sheets(i) 
        .Range("G1:G" & .Cells(.Rows.Count, 7).End(xlUp).Row).Copy Cells(2, i * 2 - 1) 
       Cells(1, i * 2 - 1) = Sheets(i).Name 
      End With 
     Next i 

    Application.ScreenUpdating = True 
End Sub 

看來幾乎是完美的工作。唯一的問題是,在新創建的工作表中,列中的值具有#DIV/0錯誤。我認爲問題在於代碼是複製格式而不是數值。

+2

給這個解決方案一個嘗試:http://stackoverflow.com/questions/23937262/excel-vba-copy-paste-values-only-xlpastevalues – Ralph

+0

對不起,我是VBA的新手。我真的不知道應該更改哪部分代碼:( –

+0

您的目的地似乎是每隔一列(例如* 1,3,5等)*這是否正確? – Jeeped

回答

0

這是我對你的代碼的解釋。

Option Explicit 

Sub allGEE() 
    Dim w As Long, wsn As String, vGEEs As Variant 

    wsn = "Gee Columns" 

    For w = 1 To Worksheets.Count 
     With Worksheets(w) 
      On Error GoTo bm_NeedWorksheet 
      If .Name <> Worksheets(wsn).Name Then 
       On Error GoTo bm_Safe_Exit 
       vGEEs = .Range(.Cells(1, 7), .Cells(Rows.Count, 7).End(xlUp)).Value 
       vGEEs(1, 1) = .Name 
       With Worksheets(wsn).Cells(1, w * 2 - 1) 
        .Resize(UBound(vGEEs, 1), UBound(vGEEs, 2)) = vGEEs 
       End With 
      End If 
     End With 
    Next w 

    GoTo bm_Safe_Exit 

bm_NeedWorksheet: 
    On Error GoTo 0 
    With Worksheets.Add(after:=Sheets(Sheets.Count)) 
     .Name = wsn 
    End With 
    Resume 
bm_Safe_Exit: 
End Sub 

我保留了目標單元格中​​的錯開。我強烈懷疑你是在複製公式並只需要這些值。使用變體數組傳遞值(不使用剪貼板)更快。直接價值轉移也是可能的,但是你想把原始工作表名稱放入第一個單元格中。

+0

感謝Jeeped!它工作完美!我真的很感激你,我希望我更瞭解VBA,因爲它看起來真的很有用。不是很富有 –

相關問題