从一个Excel复制所有工作表内容,并使用VBscript粘贴到另一个Excel工作表中

时间:2013-03-25 17:20:37

标签: vbscript

Sub Prats
  Set objExcel = CreateObject("Excel.Application") 
  objExcel.Visible = True
  Set objRawData = objExcel.Workbooks.Open("C:\A.xlsx")  'Copy From File
  Set objPasteData= objExcel.Workbooks.Open("C:\B.xlsx") 'Paste To File
  Set obj1 = objPasteData.WorkSheets("Sheet1")           'Worksheet to be cleared
  obj1.Cells.Clear
  countSheet = objRawData.Sheets.Count
  log.Message("Prats    " &countsheet)

  For i = 1 to countSheet
    objRawData.Activate
    name = objRawData.Sheets(i).Name
    objRawData.WorkSheets(name).Select
    objRawData.Worksheets(name).Range("A1").Select
    objExcel.ActiveSheet.UsedRange.Select
    usedRowCount2 = objExcel.Selection.Rows.Count 
    objExcel.Range("A1:B" & usedRowCount2).Copy

    objPasteData.Activate
    objPasteData.WorkSheets("Sheet1").Select
    objExcel.ActiveSheet.UsedRange.Select
    usedRowCount1= objExcel.Selection.Rows.Count
    objExcel.ActiveSheet.UsedRange.Select
    objExcel.Range("A" & usedRowCount1).Select
    objPasteData.Worksheets("Sheet1").Range("A" &(usedRowCount1+1)).PasteSpecial Paste =xlValues

  Next
  objPasteData.Save

End sub

这是我正在使用的代码。

问题是它是否超过了第一张纸的最后一行和第二张纸的第一行。

1 个答案:

答案 0 :(得分:0)

我已经告诉那个你copied代码的人,他应该使用Cells属性而不是使用范围。但是,如果你绝对必须使用范围,至少不要一直激活和选择。以下行应足以复制:

For i = 1 To countSheet
  usedRowCount2 = objRawData.Sheets(i).UsedRange.Rows.Count
  If i = 1 Then
    usedRowCount1 = 0
  Else
    usedRowCount1 = objPasteData.Sheets(1).UsedRange.Rows.Count
  End If

  objRawData.Sheets(i).Range("A1:B" & usedRowCount2).Copy
  objPasteData.Sheets(1).Range("A" & (usedRowCount1+1)).PasteSpecial -4163
Next

编辑 UsedRange行数至少为1,因此从第一张表复制数据时,usedRowCount1+1会产生空的第一行。此行保持未使用状态(即它未包含在UsedRange中),因此使用的行数比最后一次使用的行数小1。因此,您必须区分第一张纸和所有其他纸张。