【问题标题】:Copy rows starting from certain row till the end using macro使用宏从某行开始复制行直到结束
【发布时间】:2015-09-11 16:01:09
【问题描述】:

我需要复制一个 excel 的值并创建一个具有所需格式的新值。假设我需要将列从 B11 复制到 BG11,行将一直到最后。(我不知道如何找到行的结尾)。我在 b7 到 bg7 中有列标题。中间有不需要的行,我不需要它。所以在新的 excel 中,我希望列标题(从 b7 到 bg7)作为第一行,从 b11 到 bg11 的值直到最后。

这是我的第一个 excel 宏。我不知道该怎么做。因此,通过一些 stackoverflow 问题和其他站点的引用,我尝试了以下代码。但它没有提供所需的输出。

Sub newFormat()

Dim LastRow As Integer, i As Integer, erow As Integer

LastRow = ActiveSheet.Range(“B” & Rows.Count).End(xlUp).Row

For i = 2 To LastRow

Sheets("MySheetName").Range("B7:BG7").Copy
Sheets("MySheetName").Range("B11:BG11").Copy


Workbooks.Open Filename:=”C:\Users\abcd\Documents\Newformat.xlsx”
Worksheets(“Sheet1”).Select
erow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

ActiveSheet.Cells(erow, 1).Select
ActiveSheet.Paste
ActiveWorkbook.Save
ActiveWorkbook.Close
Application.CutCopyMode = False
End If

Next i
End Sub

这可能很简单。任何帮助将不胜感激。

【问题讨论】:

  • 我不确定您到底想做什么? 1 为什么要循环打开文件? 2 为什么要在循环中一个接一个地复制两个范围?哪个是您要复制的? 3嗯,你到底想做什么?
  • @SiddharthRout:请忽略我的代码。它不工作。我刚刚尝试了一些东西。因为我对macros 没有任何想法,所以我不知道如何使用它。如果你没有得到我的问题(第 1 段),请告诉我。我会更新
  • 我有一个不错的想法,但想在发布答案之前确定一下。那么新的标题和那一行B11:BG11 你想粘贴到Sheet1 吗?如果是,那么一个快速的问题。新文件的 sheet1 中是否已有数据?
  • 否,新工作表中没有任何数据。它将第一行作为B7:BG7 作为标题,从第二行开始,它应该从B11:BG11 获取值,直到可用行结束。
  • 查看我发布的答案。这就是你想要达到的目标吗?

标签: vba excel


【解决方案1】:

几件事...

  1. 不要将Integer 用于行。发布xl2007,行数增加了,Integer 无法容纳。使用Long

  2. 您无需选择要粘贴的范围。您可以直接执行该操作。

  3. 您不需要使用循环。您可以复制两个块中的范围

  4. 使用对象,以免 Excel 被您的对象弄糊涂。

  5. 由于Sheet1 为空,您无需在此处查找最后一行。只需从1 开始。

  6. 要将数据输出到新工作簿,您必须使用Workbooks.Add

查看此示例(未经测试

Sub newFormat()
    Dim wbO As Workbook
    Dim wsI As Worksheet, wsO As Worksheet
    Dim LastRow As Long, erow As Long

    '~~> Set this to the relevant worksheet
    Set wsI = ThisWorkbook.Sheets("HW SI Upload")
    '~~> Find the last row in Col B
    LastRow = wsI.Range("B" & wsI.Rows.Count).End(xlUp).Row

    '~~> Open a new workbook
    Set wbO = Workbooks.Add
    '~~> Set this to the relevant worksheet
    Set wsO = wbO.Sheets(1)

    '~~> The first row in Col A for writing
    erow = 1
    '~~> Copy Header
    wsI.Range("B7:BG7").Copy wsO.Range("A" & erow)

    '~~> Increment output row by 1
    erow = erow + 1

    '~~> Copy all rows from 11 to last row
    wsI.Range("B11:BG" & LastRow).Copy wsO.Range("A" & erow)

    '~~> Clear Clipboard
    Application.CutCopyMode = False

    '
    '~~> Code here to do a Save As
    '
End Sub

【讨论】:

  • 新工作表即将到来,没有任何数据。MysheetName 应该是我要复制的工作表名称吗?我应该改变sheet1吗?
  • 您要复制的工作表的名称是什么?
  • 所以用那个名字替换 sheet1 :)
  • 很好 :) 但现在它没有生成任何工作表 :( 我想我遗漏了一些东西..它将在同一个工作簿或不同的工作簿中创建?
  • “HW SI Upload”表在哪里?在“Newformat.xlsx”中?
【解决方案2】:

不同但相同

重命名工作表

Sub Button1_Click()
    Dim wb As Workbook, ws As Worksheet, sh As Worksheet
    Dim LstRw As Long, Rng As Range, Hrng As Range

    Set sh = Sheets("MySheetName")

    With sh
        Set Hrng = .Range("B7:BG7")
        LstRw = .Cells(.Rows.Count, "B").End(xlUp).Row
        Set Rng = .Range("B11:BG" & LstRw)
    End With

    Application.ScreenUpdating = 0

    Workbooks.Open Filename:="C:\Users\abcd\Documents\Newformat.xlsx"

    Set wb = Workbooks("Newformat.xlsx")
    Set ws = wb.Sheets(1)

    Hrng.Copy ws.Cells(Rows.Count, "A").End(xlUp).Offset(1)
    Rng.Copy ws.Cells(Rows.Count, "A").End(xlUp).Offset(1)
    ws.Name = sh.Name    'renames sheet
    wb.Save
    wb.Close

End Sub

【讨论】:

  • 谢谢你...我应该在哪里给mysheetname
猜你喜欢
  • 2022-01-21
  • 2015-03-26
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多