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

时间:2017-12-16 07:24:39

标签: arrays excel vba excel-vba cells

有人可以帮我处理下面的代码,我正在寻找的是,从表格" Form" 2组Array中提到的某些细胞值。 应将第一组数据复制到工作表" Tracker"在阵列结束的1组之后的C3向前和来自下一个单元的第二组阵列说EF3向前。

然而,现在第一次解决的是它从A3的粘贴和从A4的第二次粘贴。如有任何问题,请通知我。

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

class MonitorInterceptor {
@RuntimeType
public static Object intercept(@Origin Method method,@SuperCall Callable<?> callable) throws Exception {
    long start = System.currentTimeMillis();
    try {
        return callable.call();
    } finally {  System.out.println(method + " took " +(System.currentTimeMillis()-start));
    }}}

2 个答案:

答案 0 :(得分:1)

我看了你的档案;我做的第一件事是翻阅VBA&amp; 尝试进行编译 - 顺便提一下,我建议任何人使用下载的XLSM作为第一步。 (我还没有看到恶意宏,我想保持这种状态!)

我可以看到这个文件已经过了正在进行的工作&#34;因为这里和那里有一些代码不能正确编译,例如指向缺少用户形式的Me语句,以及对错误命名的工作表的引用,例如Form (View)而不是{{ 1}}。

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

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

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

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

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

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

目标应该是一个非常简单的根据需要使用尽可能多的列,但它不是格式化或公式的地方。 (想想数据库!) 例如,=C3', B3 is(来源)可以有一个隐藏的评论,例如&#34;跟踪器:C&#34;然后当表单填满时,您可以解析注释并动态移动数据(而不是硬编码250个单元格地址!),如下所示:

C2

与Excel中的任何内容(或一般的Office)一样,有十几种方法可以完成相同的任务。选择那些不要反复重复相同代码的代码,也不要选择硬编码数据。规划未来(意外)增长是非常重要的,调试即将开始,这是我的最后一个建议:

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

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

底线,最好的选择:Access,Excel,Outlook都具有内置的表单功能。使用表单形式,您现在可以节省自己的头痛

希望这会给你一些想法。

祝你好运!

答案 1 :(得分: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。