【问题标题】:create loop to copy entire colums from three sheets and sort them in a new sheet创建循环以从三个工作表中复制整个列并将它们排序到新工作表中
【发布时间】:2019-04-08 14:26:54
【问题描述】:

我是 VBA 新手,在编写某个宏时遇到了问题。我从数据库中检索了大约 150 只债券的每日收益率、要价和买入价的数据。所有收益率、要价和买入价在不同的表格中按顺序排序。我想为每只债券获得一张带有相应收益率、买入价和卖出价的新表。我的收益率在表 2 中,要价在表 3 中,买入价在表 4 中。它应该始终复制两个完整的列,因此例如对于第一个债券,它应该复制前两列(两列,因为一个是产量和一个带有日期)的第 2 页,第 3 页的前 2 和第 4 的前两列,并将它们彼此相邻放在新的表单中,对于下一个债券,它应该复制每个的接下来的两列工作表并将其复制到新工作表中,依此类推。有没有可能写一个宏来做到这一点?

以下是我为前两个键手动做的宏的记录

ActiveCell.Offset(0, -6).Columns("A:B").EntireColumn.Select
ActiveCell.Offset(0, -6).Range("A1").Activate
Selection.Copy
Sheets.Add After:=ActiveSheet
ActiveSheet.Paste
Sheets("Sheet3").Select
ActiveCell.Columns("A:B").EntireColumn.Select
ActiveCell.Offset(1, 0).Range("A1").Activate
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet7").Select
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveSheet.Paste
Sheets("Sheet4").Select
ActiveCell.Columns("A:B").EntireColumn.Select
ActiveCell.Offset(1, 0).Range("A1").Activate
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet7").Select
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveSheet.Paste
Sheets.Add After:=ActiveSheet
Sheets("Sheet2").Select
ActiveCell.Offset(0, 2).Columns("A:B").EntireColumn.Select
ActiveCell.Offset(0, 2).Range("A1").Activate
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet8").Select
ActiveSheet.Paste
Sheets("Sheet3").Select
ActiveCell.Offset(0, 2).Range("A1:B1").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "Ask Close"
ActiveCell.Columns("A:B").EntireColumn.Select
ActiveCell.Activate
Selection.Copy
Sheets("Sheet8").Select
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveSheet.Paste
Sheets("Sheet4").Select
ActiveCell.Offset(0, 2).Columns("A:B").EntireColumn.Select
ActiveCell.Offset(0, 2).Range("A1").Activate
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet8").Select
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveSheet.Paste

【问题讨论】:

标签: excel vba


【解决方案1】:

只要您的工作表都具有默认名称,这应该可以满足您的需求。

Option Explicit

Sub copyColtoSheet()
Dim pasteSheet As Worksheet
Dim copySheet As Worksheet
Dim i As Integer

'Create new sheet to paste column data to
With ThisWorkbook
    .Sheets.Add After:=.Sheets(.Sheets.Count)
    Set pasteSheet = .Worksheets("Sheet" & .Sheets.Count)
End With

'Copy Sheet columns to new sheet
Dim pasteColumn As Integer
pasteColumn = 1
For i = 2 To 4
    With pasteSheet
        Dim allRows As Integer
        Set copySheet = ThisWorkbook.Worksheets("Sheet" & i)
        allRows = copySheet.Cells(Rows.Count, 1).End(xlUp).Row
        .Range(.Range(.Cells(1, pasteColumn), .Cells(allRows, pasteColumn)), .Range(.Cells(1, pasteColumn + 1), .Cells(allRows, pasteColumn + 1))).Value = copySheet.Range("A:B").Value
        pasteColumn = pasteColumn + 2
    End With
Next i
End Sub

我已经测试了这段代码,它可以工作。

【讨论】:

  • 我认为这不是 OP 想要的,但很难确切地说出来,因为不幸的是这个问题的措辞非常糟糕:(
  • 嘿史蒂夫,谢谢你帮助我!我明白了!虽然它在以下行给了我一个错误代码 9:“Set pasteSheet = .Worksheets("Sheet" & .Sheets.Count)"
  • 您的工作表名称是否具有默认值(Sheet1、Sheet2 等)或者您是否将它们命名为其他名称?
  • 我不小心删除了所有内容,需要重建它。不过,我想我已经为您找到了解决方案。
  • 谢谢!是的,我的所有工作表都有默认值。但是它适用于第一个键,但我认为错误出现在您创建的循环中。表 2,3 和 4 中的列应该有一个循环。因此,对于第一个键,它确实应该采用范围“A:B”,但对于下一个键,因此下一个表,这应该是“C: D”和以下用于“E:F”。对于应该获取下一列并将其粘贴到另一个工作表的工作表,它们应该保持不变(所以总是工作表 2、3、4)。现在,它只创建第一个键,而不是所有键。
猜你喜欢
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多