VBA只将某些单元格的值从一个工作表粘贴到另一个工作表

问题描述 投票:1回答:2

有人可以帮助我使用下面的代码,我正在寻找的是,从表格“表格”中提到的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
arrays excel vba excel-vba cells
2个回答
1
投票

假设您想要在右侧更多的工作表“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栏计数3。


1
投票

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

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

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

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

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

如果您需要保留Excel,那么用户表单而不是基于表单的表单怎么样?我经常看到人们忘记了Office的内置功能并从头开始。话虽这么说,我25年来一直是MS Office的用户,从未使用过Excel用户表。当我想到“形式”时,我认为是MS Access。

另一个选择,如果你想继续使用基于工作表的表单,而不是列出数组中的所有单元格,那么重新设计一个小的设计可以使它更简单。一种方法是在表单选项卡上有一个隐藏的行,这样您就可以存储一条不间断的所有数据。例如,你可以隐藏第1行和第2行,使第1行像Sourced Processed Year Address等标题,然后第2行可以是存储数据的“临时”位置,因此A2公式是=C2,B2是=C3', B3 is = C5 `等

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

目标应该是一个非常简单的表使用尽可能多的列,但它不是格式化或公式的地方。 (想想数据库!)例如,C2(Sourced By)可能有一个隐藏的注释,如“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 + DLcompile,删除或注释掉未使用的代码。

最重要的是,Access,Excel,Outlook都具有内置的表单功能。使用表单进行表单,您现在和以后都可以省去头疼。

希望这会给你一些想法。

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.