VBA将一个单元格的特定值粘贴到另一个单元格上

有人可以帮我用下面的代码,我正在寻找的是从表单“表格”中提到的两组数组中提到的某些值。 第一组数组应该被复制到表格“跟踪器”C3之后,第二组数组从下一个单元格开始,一组数组结束之后从EF3开始。

而现在第一个设置是从A3粘贴到A4的第二个。 如有任何问题,请让我知道。

以下是我现在使用的代码:

Sub AddEntry() Dim LR As Long, i As Long, cls Dim LR2 As Long, j As Long, cls2 cls = Array("C2", "C3", "G2", "G3", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", "A17", "C17", "D17", "F17", "G17", "H17", "A18", "C18", "D18", "F18", "G18", "H18", "A19", "C19", "D19", "F19", "G19", "H19", "A20", "C20", "D20", "F20", "G20", "H20", "A21", "C21", "D21", "F21", "G21", "H21", "A25", "B25", "C25", "D25", "E25", "F25", "G25", "H25", "A26", "B26", "C26", "D26", "E26", "F26", "G26", "H26", "A27", "B27", "C27", "D27", "E27", "F27", "G27", "H27", "A28", "B28", "C28", "D28", "E28", "F28", "G28", "H28", "A32", "C32", "E32", "G32", "H32", "A33", "C33", "E33", "G33", "H33", "A34", "C34", "E34", "G34", "H34", "A35", "C35", "E35", "G35", "H35", "A39", "D39", "F39", "A40", "D40", "F40", "A41", "D41", "F41", "A45", "C45", "E45", "G45", "A46", "C46", "E46", "G46", "A47", "C47", "E47", "G47", "D51", "D52", "D53", "D54", "D55", "D56", "D57", "D58", "D59", "D60", "D61", "D62", "D63", "D64", "D65", "D66", "D67") With Sheets("Tracker") LR = WorksheetFunction.Max(3, .Range("C" & Rows.Count).End(xlUp).Row + 1) For i = LBound(cls) To UBound(cls) .Cells(LR, i + 1).Value = Sheets("Form").Range(cls(i)).Value Next i End With cls2 = Array("E51", "E52", "E53", "E54", "E55", "E56", "E57", "E58", "G59", "E60", "E61", "E62", "G63", "E64", "E65", "E66", "E67", "C70", "D70", "E70", "F70", "G70", "H70", "C71", "E71", "G71", "C72", "E72", "G72", "C73", "E73", "G73", "C74", "E74", "G74", "C75", "E75", "G75", "C76", "E76", "G76", "C77", "E77", "G77", "C78", "E78", "G78", "C79", "E79", "G79", "C82", "D82", "E82", "F82", "G82", "H82", "C83", "E83", "G83", "C84", "E84", "G84", "B88", "B89", "B90", "B91", "C88", "C89", "C90", "C91", "D88", "D89", "D90", "D91", "E88", "E89", "E90", "E91", "F88", "F89", "F90", "F91", "G88", "G89", "G90", "G91", "H88", "H89", "H90", "H91") With Sheets("Tracker") LR2 = WorksheetFunction.Max(3, .Range("EW" & Rows.Count).End(xlUp).Row + 1) For j = LBound(cls2) To UBound(cls2) .Cells(LR, j + 1).Value = Sheets("Form").Range(cls2(j)).Value Next j End With End Sub 

假设你想在表单“Tracker”中的单元格条目右侧开始,可以添加列号而不是+1(=列A),并按如下所示写入:

数组1:从列C开始分配单元格值

  .Cells(LR, i + [C1].Column).Value = Sheets("Form").Range(cls(i)).Value 

数组2:从列EF开始分配单元格值

  ' should be LR2 instead of LR :-) .Cells(LR2, j + [EF1].Column).Value = Sheets("Form").Range(cls2(j)).Value 

注意

[C1].column返回列号(在任何工作表中),例如列C Counts 3。

我看了一下你的档案。 我做的第一件事就是翻阅VBA并尝试编译它 – 顺便说一下,我build议任何人都可以下载XLSM作为第一步 。 (我还没有看到一个恶意macros,我想保持这种方式!)

我可以看到这个文件是一个“正在进行的工作”,因为在这里和那里有一些代码不能正确编译,如Me语句指向一个缺less的用户Form (View) ,以及引用错误的工作表,如Form (View)而不是View_Form

理想情况下,这个项目应该从Excel移到Access。 Excel 用于填写表格和存储数据,但如果这可能会相当大,那么最好使用“适合工作的工具”。 将表单复制到Access表单中可立即删除将某些单元格复制到某些表单的需求,更不用说易于validation,报告,安全性和无限扩展空间,并且易于在Excel,Access,Outlook等之间移动数据。

(甚至可以在一个地方将电子表格称为数据库!)如果您担心的是您对Access不熟悉,那么如果您devise了此工作簿,一旦找出表格和表单devise的基础知识,迁移到Access将变得轻而易举。

即使Outlook有一些漂亮的表单function,可以在收到电子邮件表单时自动填充数据表。

如果您需要留在Excel中,用户表单而不是基于表单的表单呢? 我经常看到人们忘记Office的内置function,并从头开始。 这就是说,我已经25年的微软Office的用户,并从未使用Excel用户表单。 当我认为“forms”,我想MS Access

另一个select,如果你想留在基于工作表的表单中,而不是列出数组中的所有单元格等,一个小的重新devise可以使它更简单。 一种方法是在表单选项卡上有一个隐藏的行,这样你就可以有一个不间断的所有你需要存储的数据。 例如,您可以隐藏第一行和第二行,将第一行标为“ Sourced Year Address等,然后第二行可能是存储数据的“临时”地方,因此A2公式为=C2 ,B2 =C3', B3 is = C5 =C3', B3 is

最后另外一个偷偷摸摸的选项可能是在每个需要保存数据的单元格中添加隐藏注释 ,然后当表单完成时,遍历所有单元格寻找注释,每个注释将包含标题或单元格引用该单元的数据需要去哪里。

目标应该是一个非常简单的表格根据需要使用尽可能多的列,但这不是格式化或公式的地方。 (Think数据库!)例如, C2 (Sourced By)可以有一个像“Tracker:C”这样的隐藏注释,当表单被填充时,可以parsing注释并dynamic地移动数据(而不是硬编码250个单元格地址!像这样的东西:

 Option Explicit Sub moveData() 'untested; example only Dim cell As Variant, nextBlankRow As Integer Dim comm As String, sht As String, col As String nextBlankRow = 5 'calculate this somehow 'loop through cells with comments For Each cell In ActiveSheet.Cells.SpecialCells(xlCellTypeComments) If cell.Comment.Text <> "" Then 'get comment comm = cell.Comment.Text 'extract location for data like "Sheetname:Columnletter" sht = Left(comm, InStr(comm, ":") - 1) col = Right(comm, Len(comm) - InStr(comm, ":")) 'populate correct location with data Sheets(sht).Range(col & nextBlankRow).Value = cell.Value End If Next cell End Sub 

与Excel(或常规办公室)中的任何内容一样,有十几种方法可以完成相同的任务。 select那些不需要一遍又一遍地重复相同的代码,也不要硬编码的数据。 规划未来(意外的)增长是非常重要的,debugging随时可以,这是我的最后一个build议:

 Option Explicit 

在每个模块的顶部, Alt + D L经常编译,删除或注释掉未使用的代码。

底线,最好的select:Access,Excel,Outlook都具有内置的表单function。使用表单来表单,您现在可以节省自己的头痛。

希望这给你一些想法。

祝你好运!