2015-10-16 194 views
0

如何才能使此工作成功?如果目標單元格不是空白,則如何複製同一行中的特定單元格

命名爲 「1」 的工作簿:
對於範圍B2:R90,
如果B2是不是空白的,然後複製C2,E2,G2,L2 & M2,
自動打開的工作簿命名爲 「2」,
如果B3不爲空,則粘貼到B2,
,然後複製C3,E3,G3,L3,&M3,粘貼到工作簿「2」的B3,然後繼續。
完成後,關閉並保存工作簿「2」,但保留工作簿「1」,打開。

我只知道用下面的方法來寫代碼,但是我相信這不能工作...> <

For Each cell In Sheets("01OCT") 
    If Not IsEmpty(Range("B5:R90").Value) Then 
     Copy 
     Else 
     Nothing 
    End If 
Next 
+0

看看這個教程:http://www.excel-easy.com/vba/examples/close-open.html(打開和關閉工作簿) –

+0

所以要覆蓋工作簿的內容「2」單元格「B2」每行不是空白? – Kyle

+0

不,我不想每次覆蓋 –

回答

0

假設你的意思是增加細胞在其中粘貼值(B2,B3 ...)每一次不覆蓋B2,假設你不需要任何東西,除了單元格內容,下面應該爲你工作:

Sub copyCells() 
    Dim mainWb As Workbook, mainWs As Worksheet 
    Dim someWb As Workbook 

    Set mainWb = ThisWorkbook 
    Set mainWs = mainWb.Worksheets("01OCT") 

    Application.ScreenUpdating = False 

    Workbooks.Open fileName:="C:\path\2.xlsx", ReadOnly:=False 
    Set someWb = Workbooks("2.xlsx") 
    mainWs.Activate 

    For i = 2 To mainWs.Range("B5:R90").Rows.count 
     If Not IsEmpty(Range("B" & i).Value) Then 
      someWb.Worksheets(1).Range("B" & i).Value = mainWs.Range("C" & i).Value 
      someWb.Worksheets(1).Range("C" & i).Value = mainWs.Range("E" & i).Value 
      someWb.Worksheets(1).Range("D" & i).Value = mainWs.Range("G" & i).Value 
      someWb.Worksheets(1).Range("E" & i).Value = mainWs.Range("L" & i).Value 
      someWb.Worksheets(1).Range("F" & i).Value = mainWs.Range("M" & i).Value 
     End If 
    Next i 

    Workbooks("2.xlsx").Close SaveChanges:=True 

    Application.ScreenUpdating = True 
End Sub 
+0

在循環之前設置ScreenUpdating = True' **的要點是什麼?然後,用戶必須看到將發生的大量屏幕閃爍,以及代碼將變慢的事實。 –

+0

這段代碼更像是函數「concatenate」,但我需要的是在單獨的單元格中的內容,而不是一個單元格中的所有內容。但是,非常感謝您的幫助和熱情,也許我可以在其他時間使用此代碼! –

+0

@ScottHoltzman:我的錯誤,寫作時我有點反覆。我會盡快解決。 – Vegard

0

更改文件夾名稱&工作簿名稱&表名稱適合

Sub GetDataTo2() 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim r As Long 

    Dim bk As Workbook 
    Dim sh As Worksheet 
    Dim rws As Long 

    Set wb = Workbooks("1.xlsm") 
    Set ws = wb.Sheets("Sheet1") 
    Application.ScreenUpdating = 0 

    With ws 
     r = .Cells(.Rows.Count, "B").End(xlUp).Row 
     .Columns("B:B").AutoFilter Field:=1, Criteria1:="<>" 

     Set bk = Workbooks.Open("C:\Users\Dave\Downloads\2.xlsx") 
     Set sh = bk.Sheets("Sheet1") 

     With sh 
      rws = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 
      ws.Range("C2:C" & r & ",E2:E" & r & ",G2:G" & r & ",L2:M" & r).Copy 
      .Range("A" & rws).PasteSpecial xlPasteValues 
     End With 

     bk.Save 
     bk.Close True 
     .AutoFilterMode = 0 
    End With 

End Sub 
+0

偉大的想法,以用戶'自動過濾器'而不是一個循環!兩個問題雖然:1)你不要'ScreenUpdating'回來。 2)'ws.Range('C2 ...')行在')'和'.Copy'之間需要有'SpecialCells(xlCellTypeVisible)',否則它將複製每個單元格,而不僅僅是過濾的單元格。 –

+0

@ScottHoltzman 1.你不必重新打開ScreenUpdating 2.只有可見的單元格纔會被複制 – Davesexcel

+0

謝謝戴夫,我還認爲你必須重新打開它,但現在我確定它不是必須的(或許這在更新的XL版本中有所改變)雖然我知道當你手動複製/粘貼過濾的單元格時,它只會拾取被過濾的內容,但我覺得在編碼之前我遇到了這種方法的麻煩。擊鍵! –

相關問題