【问题标题】:VBA Excel How to insert a predetermined row of headersVBA Excel如何插入预定的标题行
【发布时间】:2019-06-28 01:37:02
【问题描述】:

我很难查找我正在尝试做的事情,因为我很难将我想做的事情用语言表达出来。

基本上,我要做的是获取一组标题(可能是 10-12 列长),并且在宏中,我想将这些标题粘贴到(替换)工作表第 1 行中的当前标题 1 .我目前设置的方式是,当生成该工作表时,我的数据从每张工作表的第 2 行开始插入。我编写了一个宏,可以将工作表 1 的第 1 行复制到每个现有工作表中,但是,我不必手动插入第一个工作表的标题(它应该是宏的一部分)。

所以我想我需要帮助来了解如何在工作表 1 的第 1 行上插入一行预定的标题(我想将实际的标题名称写入宏代码中)。

编辑:

Application.CutCopyMode = True

Dim Counter As Long

Counter = Sheets.Count
For i = 1 To Counter
    Sheets("Sheet1").Cells(1, 1).EntireRow.Copy
    Sheets(i).Cells(1, 1).PasteSpecial

Next i

Application.CutCopyMode = False

这就是我用来复制代码的东西,而且效果很好。我想要的是能够在第一行表 1 的相应列中放入基本上说“粘贴“标题 1”“标题 2”“标题 3”等的代码行。所以我已经有了我的标题名称挑选出来,但我想把它们直接放入宏代码中。因此,如果我的标题是 Apply Banana Lettuce Tomato,我想将这些词放入宏代码中,并将它们粘贴到上面列出的复制粘贴代码之前的表 1 第 1 行中。

【问题讨论】:

  • 请添加您当前的代码(或至少是相关部分) - 您尝试创建什么标头?你目前的尝试失败了怎么办?另外,您在某种程度上混合了术语-您是要“插入”标题[意味着我将单元格向下移动]还是将它们“粘贴”在当前标题上[对我来说意味着第 1 行中的任何内容都将被删除]。
  • @Grade'Eh'Bacon 哈哈。我们是一支优秀的团队,不是吗!
  • 粘贴它们是我想要做的。我的复制粘贴宏有效,我只想能够放入一个宏“将这些标题粘贴到表 1 的第 1 行中的任何内容上”,其中“这些标题”在宏中定义。

标签: vba excel header


【解决方案1】:

由于您提前知道标题,因此您可以在下面使用我的标题来切换它们。这应该采用您输入的标题,并将它们粘贴到所有工作表中。注意:这也将删除任何工作表上第 1 行中的任何信息,因此如果您不希望发生这种情况,请评论/删除该行。

Sub AddHeaders()
Dim headers() As Variant
Dim ws As Worksheet
Dim wb As Workbook

Application.ScreenUpdating = False 'turn this off for the macro to run a little faster

Set wb = ActiveWorkbook

headers() = Array("Superhero", "City", "State", "Country", "Publisher", "Demographics", _
    "Planet", "Flying Abilities", "Vehicle", "Sidekick", "Powers")
For Each ws In wb.Sheets
    With ws
    .Rows(1).Value = "" 'This will clear out row 1
    For i = LBound(headers()) To UBound(headers())
        .Cells(1, 1 + i).Value = headers(i)
    Next i
    .Rows(1).Font.Bold = True
    End With
Next ws

Application.ScreenUpdating = True 'turn it back on

MsgBox ("Done!")

End Sub

您也可以将它用作通用宏 - 它可以防止需要复制/粘贴(这是在 VBA 中学习的好东西,以避免复制/粘贴),并且您还可以创建一个动态标题数组,如果您的标题经常改变。让我知道这是否符合您的要求!

编辑:关于数组的注意事项。默认情况下,包含 5 个项目的数组的索引从 0 到 4。即如果你这样做循环(伪代码):

myArray() = Array("Batman","Superman","Catwoman","Rorschach")
for i = 1 to uBound(myArray())
  debug.print myArray(i)
Next i

它只会打印“超人”、“猫女”、“罗夏”。这是因为“蝙蝠侠”作为第一个条目,是 0 索引。只需将 for 行替换为 for i = lBound(myArray()) to uBound(myArray()) 即可从第一个条目到最后一个条目。或者,您可以使用for i = 0 to uBound(...

但你会注意到,在那个循环中,我有.Cells(1, 1+i)...。这是因为我的循环从 0 开始,所以我必须将 1 添加到 i 以便它从第二列开始。

不喜欢从零开始的数组(从 0 开始)?你可以从1开始!如何?只需执行Dim myArray(1 to 10)。这将创建一个数组,但从 1 开始。然后,此示例将打印所有四个人:

for i = 1 to uBound(myArray())
    debug.print myArray(i)
next i

对于循环整个数组的一个提示是只使用lBound(array())uBound(array()),它们分别是第一个值和最后一个值。 这也将允许您执行.Cells(1,i).Value ...,因为 i 从 1 开始。这有意义吗?

【讨论】:

  • 是的,这更符合我的要求,谢谢!我只是使用记录宏函数将“单击此处然后键入此”宏散列在一起,但是您提供的内容似乎对于确定我可以对未来项目使用数组和 i 值做什么非常有帮助。只是为了确保,如果我尝试直接调用数组中的第一个值(即:Superhero),那将对应于“0”值,对吗?这意味着该城市将成为数组中的“1”值?
  • @ScottT,正确!我将在我的 OP 中为您添加关于数组的注释。是否值得向您展示如何创建动态数组? IE。你的 Sheet1 有你想放在所有其他工作表中的标题?
  • 这确实有道理,感谢您与我一起讨论!我相信,现在我在没有动态数组的情况下非常可靠,但再次感谢您了解所有这些!
  • @ScottT,乐于助人!!
  • 虽然是一个老问题,但我发布了您的有效且精细的解决方案的精简版 +1 :-) 您可能感兴趣并且为了完成这个主题 - @BruceWayne
【解决方案2】:

假设您的标题位于Sheet1 上的A1:J1 列中,您可以使用以下命令将它们复制到Sheet2 上的B1:K1

Sheets("Sheet1").Range("A1:J1").Copy Sheets("Sheet2").Range("B1:K1")

【讨论】:

  • 对不起,我本来应该没有把这个打得很清楚。我的复制宏运行良好,我只是想将我想粘贴到第 1 行的标题直接放入代码中(H1、H2、H3、H4 将在代码中定义并放入第 1 列,第 2 列,第 3 列等第 1 行表 1)
【解决方案3】:

如何仅用一行代码编写表格标题

不用循环通过headers数组中的每个标题,可以通过

将整个数组写入给定的单元格开头(例如A1
    ws.Range("A1").Resize(1, UBound(headers) + 1) = headers 

目标范围将通过UBound 函数resized 到 1 行和正确的列数;由于headers 是一个零边界 数组,只需添加+1 即可获取所有标题。

Sub WriteHeaders()
Dim headers(), ws As Worksheet
headers() = Array("Superhero", "City", "State", "Country", "Publisher", "Demographics", _
                  "Planet", "Flying Abilities", "Vehicle", "Sidekick", "Powers")
For Each ws In ThisWorkbook.Worksheets
    .Rows(1) = vbNullString                                 ' clear header row
    .Range("A1").Resize(1, UBound(headers) + 1) = headers   ' write headers into row 1
Next ws
End Sub

一些编码变化(因评论中的问题而编辑,谢谢 Bruce)

注意:出于系统原因,我更改了您的问题,但尝试包括所有问题。

如果说 headers() 是五个项目,你会得到一个错误,而我做了.Range("A1:B1") = headers

  • ,你不需要,它只是将headers 中的前两项填充到指定的单元格中。因此,您可以使用这种结构将预定义的完整元素集减少到给定数量的单元格,而无需重新调整 (1-dim) 数组。就我个人而言,我更喜欢调整大小,例如通过.Range("A1").Resize(1,2) = headers

填充垂直目标范围

  • 另一方面,如果您对 .Range("A1:A2") = headers 进行编码,则必须记住,这是一个 flat(一维)数组,您希望将其强制放入列范围 - 您只会在 both 单元格中获得第一个相同的标题项。
  • 要使此功能适用于此处的可用标头,您必须将平面数组转置为垂直数组,如下所示:.Range("A1:A2") = Application.Transpose(headers),您将至少获得五个数组项中的两个。

同样,如果我这样做了.Range("A1:AA1") = headers,是否会 a) 只填写前五项,然后 b) 将其余项留空?

  • a) ,如上例所示,任何可用项目都会被填写,
  • b) ,完成标题输入后的单元格由错误#N/A(不可用)条目填充。

  • 填充垂直范围也需要转置,因为Range"A1:A100") = Application.Transpose(headers) 在五个标题项之后获得相同的#N/A 条目。

【讨论】:

  • 哦,酷。我不知道我是否知道您可以像这样为数组设置范围,聪明!如果说headers() 是五个项目,而我做了.Range("A1:A2") = headers,你会得到错误吗?还是只填写headers 的前两个值? (同样,如果我做了Range("A1:A100") = headers,它会只填写前五个而将其余部分留空吗?(......我当然可以测试这个,但只是好奇你是否知道)
  • 已经编辑了我的帖子来回答你有趣的问题 - @BruceWayne:-)
  • 很棒的答案,非常感谢您的编辑,今天学到了很多:D
【解决方案4】:

要将标题从Sheet1 自动复制到所有其他工作表,请使用:

srcSheet = "Sheet1"
For dst = 1 To Sheets.Count
    If Sheets(dst).Name <> srcSheet Then
    Sheets(srcSheet).Rows("1:1").Copy
    Sheets(dst).Range("A1").Select
    ActiveSheet.Paste
    End If
Next

此代码遍历所有工作表,srcSheet 除外,并将第一行从srcSheet 复制到它们

【讨论】:

  • 对不起,我本来应该没有把这个打得很清楚。我的复制宏运行良好,我只是想将我想粘贴到第 1 行的标题直接放入代码中(H1、H2、H3、H4 将在代码中定义并放入第 1 列,第 2 列,第 3 列等第 1 行表 1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多