【问题标题】:Creating a new workbook for each row in an existing workbook为现有工作簿中的每一行创建一个新工作簿
【发布时间】:2014-10-25 17:30:21
【问题描述】:

我正在尝试使用一个包含多行数据的 Excel 工作表,并使用该行中的一个值作为新工作簿名称为每一行创建单独的工作簿。这些工作簿将保存为逗号分隔的工作簿,以便可以将它们上传到一台机器的控制器中。我可以手动打开一个新工作簿并从基本工作簿中获取外部引用单元格,但对如何编写循环以使其自动在行中移动并创建一个新工作簿以及如何使用其中一个值作为新工作簿的名称。

基本工作簿的结构从 A 到 J 行,其中 A 列包含我要将新工作簿另存为的值。新工作簿需要转置值并将行分成两列(这是由于机器上控制程序的结构,我无法更改)。新工作簿中的第一列将包含从 B 到 H 的值,第二列将包含从 I 和 J 的值。

为了澄清: 基本工作簿行 - x xx xxx xxxx xxxxx ... X XX

新的工作簿格式 - 小 x 将是 A 中的列条目,大写 X 将是 B 中的列条目。

我能够执行上述操作并将行转换为新工作簿中的两个单独的列。我也尝试查看类似的问题和回复,但无法拼凑出一种方法来完成上述工作。

谁能就如何为工作簿编写循环提供一些想法?我不介意玩它并尝试让它工作,但承认在开始自动单步执行并通过引用基本工作簿中的单元格值来保存新工作簿时,我有点不知所措。

感谢任何人能够提供的任何帮助。

宏的代码如下:

Sub Macro6()
'
' Macro6 Macro
'
' Keyboard Shortcut: Ctrl+q
'
    Workbooks.Add
    Application.Left = 721
    Application.Top = 1
    Application.Width = 720
    Application.Height = 780
    Windows("TEST.xlsx").Activate
    Range("B2:H2").Select
    Selection.Copy
    Windows("Book10").Activate
    Range("A1:A7").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Range("B1").Select
    Windows("B9 for Import TEST.xlsx").Activate
    Range("I2:J2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Book10").Activate
    Range("B1:B2").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Windows("TEST.xlsx").Activate
End Sub

它会复制一次数据,但随后告诉我下标超出了突出显示 ~Windows("Book10").Activate~ 行的范围。

【问题讨论】:

  • 上传你目前尝试过的代码。而且您的 xxxxx 澄清似乎令人困惑。
  • 是的,我在列中写了 X,但是当我发布它时,只是将它们放在一行中,所以我对其进行了编辑。
  • 关于您当前的代码:我会避免在 VBA 中使用 .copy 和 .pastespecial ,尤其是在执行更复杂的事情时,比如您需要的。正如您在下面的回答中看到的那样,将直接单元格引用与 For 循环结合使用会更好。

标签: vba excel


【解决方案1】:

这就是我想出的。我使用工作表上的按钮运行此代码,其数据如下所示:

这是附加到按钮 1 的代码:

Sub Button1_Click()

Application.DisplayAlerts = False
Application.ScreenUpdating = False

On Error GoTo PROC_ERROR

Dim ThisWorkbook As Workbook, NewBook As Workbook
Dim ThisWorksheet As Worksheet, NewWs As Worksheet
Dim i As Integer, j As Integer, k As Integer, ExportCount As Integer

Set ThisWorkbook = ActiveWorkbook
Set ThisWorksheet = ThisWorkbook.Sheets("Sheet1")
ExportCount = 0

For i = 1 To 10
    If ThisWorksheet.Cells(i, 1) <> "" Then
        Set NewBook = Workbooks.Add
        Set NewWs = NewBook.Sheets("Sheet1")
        For j = 2 To 8
            If ThisWorksheet.Cells(i, j) <> "" Then
                NewWs.Cells(j - 1, 1) = ThisWorksheet.Cells(i, j)
            End If
        Next j
        For k = 9 To 10
            If ThisWorksheet.Cells(i, k) <> "" Then
                NewWs.Cells(k - 8, 2) = ThisWorksheet.Cells(i, k)
            End If
        Next k
        With NewBook
            .Sheets("Sheet2").Delete
            .Sheets("Sheet3").Delete
            .Title = ThisWorksheet.Cells(i, 1)
            .SaveAs Filename:=ThisWorksheet.Cells(i, 1) & ".csv", FileFormat:=xlCSV, CreateBackup:=False
        End With
        ExportCount = ExportCount + 1
    End If
Next i

PROC_ERROR:
If Err.Number <> 0 Then
    MsgBox "This macro has encountered an error and needs to exit. However, some or all of your exported workbooks may still have been saved. Please try again." _
    & vbNewLine & vbNewLine & "Error Number: " & Err.Number & vbNewLine & "Error Description: " & Err.Description, vbInformation
    ExportCount = 0
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    Exit Sub
Else
    MsgBox "Successfully exported " & ExportCount & " workbooks!", vbInformation
    ExportCount = 0
End If

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

输出如下:

如果您希望我详细解释代码,请告诉我!

编辑:更新的代码:添加了Application.ScreenUpdating 处理和正确的错误处理。

【讨论】:

  • 如果你能解释对我前进非常有帮助的代码。如果您不介意,我宁愿确保我了解它在做什么,而不仅仅是复制和粘贴它。
  • 完全!它只是使用一系列“For”循环来实现你想要的。在代码中,“i”将代表主工作表中的行号。所以当它说For i =1 To 10 时,它基本上是在说“运行这个循环十次”。但是“i”也是一个变量,所以每次运行 For 循环时,“i”都会比以前多一个。所以第一次运行时,“i”是1,下次运行时“i”是2,等等。所以ThisWorksheet.Cells(i, 1)是单元格A1,如果i=1,A2如果i=2,等等。(用完字符;见下一条评论)
  • 我正在做的是让代码的主要部分为每一行重复,从 1 到 10,如果它不是空白的(这就是 If ThisWorksheet.Cells(i, 1) &lt;&gt; "" Then 正在检查的)。然后告诉新工作簿中的某些单元格与主工作簿中的某些单元格相等(使用较小的“For”循环)。
  • 首先,我确实尝试了代码,它完全符合我的要求,非常感谢!其次,您上面解释的内容是有道理的,我可以通读该部分代码并继续进行操作,因此感谢您抽出宝贵时间来回答和解释。如果你不介意的话,我还有几个问题。 “Dim ThisWorkbook As Workbook, NewBook As Workbook”行是否类似于其他代码中的变量声明行?您是否只是定义它们以供以后在循环中使用?新评论中的下一个问题。
  • 您只是使用我上面提到的行来切换您引用的工作簿吗?这是我不确定我在代码中遵循的最后一件事是如何定义新旧工作表以及在引用旧工作表和新工作表之间切换。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-24
相关资源
最近更新 更多