2015-10-16 43 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版本中有所改变)虽然我知道当你手动复制/粘贴过滤的单元格时,它只会拾取被过滤的内容,但我觉得在编码之前我遇到了这种方法的麻烦。击键! –

相关问题