繁体   English   中英

VBA仅将某些值的单元格从一张纸粘贴到另一张纸

[英]VBA to paste only certain values of cell from one sheet to another

有人可以帮我下面的代码,我正在寻找的是,从表“ Form”中获取2组Array中提到的某些单元格值。 第一组数组应向前复制到“ Tracker”工作表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

我看了你的档案。 我做的第一件事就是通过VBA翻转和尝试编译它-这顺便说一下,我会推荐给任何人与下载的第一步 XLSM (我还没有看到恶意的宏,所以我想保持这种状态!)

我可以看到该文件是一个“进行中的工作”,因为在这里和那里有一些代码无法正确编译,例如Me语句指向丢失的用户Form (View) ,以及对诸如Form (View)等错误命名的工作表的引用Form (View)而不是View_Form

理想情况下,应将该项目从Excel移至Access。 Excel 可以用于填写表格和存储数据,但是如果这可能会变得相当大,那么最好使用“正确的工具”。 将您的表单复制到Access表单中可立即消除将某些单元格复制到某些工作表的需要,更不用说易于验证,报告,安全性和无限的扩展空间,以及在Excel,Access,Outlook等之间移动数据的便捷性。

(您甚至曾经将电子表格称为数据库!)如果您担心自己不熟悉Access,那么如果您设计了此工作簿,那么一旦弄清表和表单设计的基础知识,便可以轻而易举地迁移到Access。

甚至Outlook也具有一些漂亮的表单功能,当收到电子邮件表单时,这些功能可以自动填充数据表。

如果您需要保留在Excel中,那么使用用户表单而不是基于工作表的表单呢? 我经常看到人们忘记Office的内置功能,而从头开始。 话虽如此,我已经成为MS Office的用户25年了, 从未使用过Excel用户表单。 当我认为“形式”时,我认为是MS Access

另一个选择是,如果您希望保留基于工作表的表单,而不是列出数组中的所有单元格等,则进行较小的重新设计可以使其更简单。 一种方法是在“表单”选项卡上有一个隐藏行,这样您就可以在所有需要存储的数据中保留一行。 例如,您可以隐藏第1行和第2行,将第1行的标题设为“ Sourced Processed Year Address等,然后将第2行作为存储数据的“临时”位置,因此A2公式为=C2 ,B2为=C3', B3 is = C5`等。

最后,另一个偷偷摸摸的选择可能是在每个需要保存数据的单元格中添加隐藏的注释 ,然后在表单完成后,遍历所有查找注释的单元格,每个注释将包含一个标题或单元格引用,指示该单元的数据需要存放的位置。

目标应该是一个非常简单的 ,可以根据需要使用任意多的列,但它不是格式化或公式的地方。 (请考虑数据库!)例如, C2 (由“来源”提供)可能具有诸如“ Tracker:C”之类的隐藏注释,然后在填写表单时,您可以解析注释并动态移动数据(而不是对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(或Office的一般情况)中的任何内容一样,您可以通过多种方法来完成相同的任务。 选择那些不涉及一遍又一遍地重复相同代码,也不涉及硬编码数据的代码。 计划未来(意外)的增长非常重要,您可以随时调试,这是我的最后建议:

Option Explicit

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

底线,最好的选择:Access,Excel,Outlook都内置了表单功能。将表单用于表单,您现在以后都会为自己省去麻烦。

希望这会给您一些想法。

祝好运!

假设您想在右侧的表格“ 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM