【问题标题】:Update cell value if new value is availiable如果新值可用,则更新单元格值
【发布时间】:2020-03-22 08:51:53
【问题描述】:

所以我正在集思广益,想出几种不同的方法来完成这项任务……但我所想的方法都不是很干净。我正在寻找一种干净的方法来实现这一点。

我有 2 个工作簿(工作簿 A、工作簿 B)。

工作簿 A 如下所示:

 A    B    C    D    E
Tom  Bob  Sam  Ted  Meg
 1    4    9    3    2

A,B,C... 是列(实际上不在工作表上),1,4,9,3,2 是最后一行的数据(可能是第 10 行或第 1000 行等)。 ..)

工作簿 B 如下所示:

  A    B
 Sam   5   
 Meg   1

我想用工作簿 B 上的任何值更新工作簿 A。所以......在这个例子中...... Sam 和 Meg 有一个新值......所以我想更新工作簿 A 看起来像这样:

 A    B    C    D    E
Tom  Bob  Sam  Ted  Meg
 1    4    5    3    1

我觉得最简单的方法可能是制作字典或类似的东西,但我从未使用过字典,也不知道其他方法是否会更容易/更简单。

【问题讨论】:

  • 我忘了你可以使用集合来实现键值对......类似于字典......我也从未这样做过......我不知道这是否会是一个优雅的解决方案...
  • 嗨,XCELLGUY,您能否给我们提供更多信息,第一个工作簿是否仅从第二个工作簿更新?还是有其他来源会改变数据?我假设您谈论的不仅仅是相同数据的转置?当第二个工作簿中的数据发生变化时,您希望发生什么?您是要更改最后一行,还是要在其下方添加更新值的新行?
  • 当然这是一个简化的例子……但这个例子的关键是我只有 sam 和 meg 的新数据……所以只有 sam 和 meg 会得到更新的值……其他值将保持不变...
  • 等等...我可以使用“.PasteSpecial”和“SkipBlanks:=True”和“Transpose:=True”...我从来没有使用或知道“SkipBlanks”选项.. . 我想我可以做到。
  • 是的...我认为这是我最简单的选择。我可以使用查找函数,然后使用“.PasteSpecial”、“SkipBlanks:=True”和“Transpose:=True”...

标签: arrays excel vba dictionary collections


【解决方案1】:

因此,如果您想从一本书获取数据到另一本书,那么 vlookup 是最简单的解决方案

https://photos.app.goo.gl/CRjxhJHVKm6xKJ8x7

我将它嵌套在一个 if 语句中,该语句检查是否有错误,如果有错误,那么它只是从上面的行中获取值。 IE。如果名称在您的第二张纸上不存在,则存在错误,它将从上面的行中获取。

=IF(ISERROR(VLOOKUP(A1,[Book2]Sheet1!$A$2:$B$5,2,FALSE)),A11,VLOOKUP(A1,[Book2]Sheet1!$A$2:$B$5,2,FALSE))

从表面上看,这确实符合您的要求,但您提出问题的方式暗示还有一些其他功能和您需要做的其他一些事情,该解决方案可能会妨碍您。这就是为什么我试图澄清你真正想要实现的目标。

无论如何,希望这是朝着正确方向迈出的一步......祝你好运!

【讨论】:

    【解决方案2】:

    这是我的看法。没有字典,但是在数组中遍历内存:


    样本数据:

    表 1:

    表 2:


    示例代码:

    Sub Test()
    
    Dim lr As Long, x As Long, col As Long
    Dim arr As Variant
    
    'Step 1: Get the values to update
    With Sheet1 
        lr = .Cells(.Rows.Count, 1).End(xlUp).Row
        arr = .Range("A1:B" & lr)
    End With
    
    'Step 2: Go through our values to update
    With Sheet2
        For x = LBound(arr) To UBound(arr)
            col = .Rows(1).Find(arr(x, 1), Lookat:=xlWhole).Column
            .Cells(.Cells(.Rows.Count, col).End(xlUp).Row + 1, col) = arr(x, 2)
        Next x
    End With
    
    End Sub
    

    结果:

    删除+1,以防您要重写找到的列中的最后一个条目。我只是假设您想将值粘贴在下面。另外,我指的是工作表,您可以简单地参考其他打开的工作簿。

    【讨论】:

    • 所以我不需要加 1。但看起来这会起作用。谢谢。
    • @xcellguy。如果这已经回答了您的问题,请通过单击左侧的复选标记来投票/接受答案。这样做会以 exp 点的形式回报恩惠,而且会关闭线程
    • 另一方面,我看到您有很多未解决的问题。如果他们帮助了你,你可能也想重新审视这些并接受给出的答案。单击复选标记将接受答案(关闭线程),箭头(也在答案的左侧)将赞成答案为有帮助。这只是一件体面的事情。 @xcellguy
    • @XCELLGUY,如果此线程需要关闭,您需要开始将答案标记为正确。另请参阅我的最后评论。
    【解决方案3】:

    首先,关于我的问题的更多背景知识。我正在打开文本文件,提取数据,在 Excel 工作表 (wkbTemp) 上重新排列数据,然后将重新排列的数据复制到“wkbCompiledDataTable”。

    这是我解决问题的方法。

    wkbTemp.Sheets(1).Activate
    LRow = Cells(Rows.Count, 9).End(xlUp).Offset(0, 0).row 
    
    wkbTemp.Sheets(1).Range("J1:N" & LRow).Copy
    
    wkbCompiledDataTable(1).Activate   
    LRow = Cells(Rows.Count, 1).End(xlUp).Offset(0, 0).row    
    
    wkbCompiledDataTable(1).Sheets(1).Range("D" & LRow).PasteSpecial _
                                                              Paste:=xlPasteValues, _
                                                              SkipBlanks:=True, _
                                                              Transpose:=True
    

    正如我之前所说,实际应用要复杂得多。这个例程实际上是在一个循环中。例如,我实际上有“wkbCompiledDataTable(i)”而不是“wkbCompiledDataTable(1)”。但对我来说,这是最简单的解决方案。 wkbTemp.Sheets(1) 列“J”有数据。 “K”栏为空白。 “L”列、“M”列、“N”列有数据(这3列是我关心的数据变化的列)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多