Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如果新值可用,则更新单元格值_Arrays_Excel_Vba_Dictionary_Collections - Fatal编程技术网

Arrays 如果新值可用,则更新单元格值

Arrays 如果新值可用,则更新单元格值,arrays,excel,vba,dictionary,collections,Arrays,Excel,Vba,Dictionary,Collections,所以我正在头脑风暴几种不同的方法来完成这项任务。。。但我的思维方式都不干净。我正在寻找一个干净的方法来实现这一点 我有两本练习册(练习册A、练习册B) 工作簿A如下所示: A B C D E Tom Bob Sam Ted Meg 1 4 9 3 2 A B Sam 5 Meg 1 A B C D E Tom Bob Sam Ted Meg 1 4 5

所以我正在头脑风暴几种不同的方法来完成这项任务。。。但我的思维方式都不干净。我正在寻找一个干净的方法来实现这一点

我有两本练习册(练习册A、练习册B)

工作簿A如下所示:

 A    B    C    D    E
Tom  Bob  Sam  Ted  Meg
 1    4    9    3    2
  A    B
 Sam   5   
 Meg   1
 A    B    C    D    E
Tom  Bob  Sam  Ted  Meg
 1    4    5    3    1
A,B,C。。。是列(实际上不在工作表上),1,4,9,3,2是最后一行的数据(可以是第10行或第1000行,等等)

工作簿B如下所示:

 A    B    C    D    E
Tom  Bob  Sam  Ted  Meg
 1    4    9    3    2
  A    B
 Sam   5   
 Meg   1
 A    B    C    D    E
Tom  Bob  Sam  Ted  Meg
 1    4    5    3    1
我想用工作簿B上的任何值更新工作簿A。因此。。。在这个例子中。。。山姆和梅格有了新的价值观。。。因此,我想将工作簿A更新为如下所示:

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

我觉得做这件事最简单的方法可能是制作字典之类的东西,但我从未使用过字典,也不知道其他方法是否更简单

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

我将它嵌套在一个if语句中,该语句检查是否有错误,如果有错误,它只从上面的行中获取值。也就是说,如果你的第二张纸上没有这个名字,那么就会有一个错误,它会从上面的一行抓取

=IF(ISERROR(VLOOKUP(A1,[Book2]Sheet1!$A$2:$B$5,2,FALSE)),A11,VLOOKUP(A1,[Book2]Sheet1!$A$2:$B$5,2,FALSE))
从表面上看,这就是你要问的,但你表达问题的方式意味着还有一些其他功能和其他事情需要你去做,这可能会成为这个解决方案的障碍。这就是为什么我试图澄清你真正想要实现的目标


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

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


样本数据:

表1:

第2张:


示例代码:


结果:


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

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

下面是我解决问题的方法

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

如前所述,实际应用程序要复杂得多。这个例程实际上是一个循环。例如,我实际上使用了“WKBCompiledDataable(I)”而不是“WKBCompiledDataable(1)”,但对我来说,这是最简单的解决方案。wkbTemp.Sheets(1)“J”列有数据。“K”列为空。列“L”、列“M”和列“N”有数据(这3列是我关心的数据更改列)。

我忘记了可以使用集合实现键值对。。。类似于字典。。。我也从来没有这样做过。。。我不知道这是否是一个优雅的解决方案…嗨,XCELLGUY,你能给我们一点更多的信息吗?第一个工作簿只是从第二个工作簿更新的吗?或者是否有其他来源将改变数据?我想你说的不仅仅是相同数据的转置?当第二个工作簿中的数据发生更改时,您希望发生什么?您是想更改最后一行的值,还是想在下面添加一个更新值的新行?当然,这是一个简化的示例。。。但这个例子的关键是我只有sam和meg的新数据。。。所以只有sam和meg会得到更新的值。。。其他值将保持不变…等等。。。我可以使用“.PasteSpecial”和“SkipBlanks:=True”和“Transpose:=True”吗。。。我从未使用过或知道“SkipBlanks”选项。。。我想我能做到。是的。。。我认为这是我最简单的选择。我可以使用一个查找函数,然后使用“.PasteSpecial”和“SkipBlanks:=True”和“Transpose:=True”…因此我不需要加1。但看起来这会起作用。谢谢你。如果这已经回答了您的问题,请点击左侧的复选标记,向上投票/接受答案。这样做会以exp积分的形式回报你,再加上它会结束这段对话。另外,我看到你有很多悬而未决的问题。如果他们帮助了你,你可能也想重新审视这些问题,并接受他们给出的答案。单击复选标记将接受答案(关闭线程),箭头(也在答案左侧)将向上投票认为答案有帮助。这只是一件体面的事@xcellguy@XCELLGUY,如果需要关闭此线程,则需要开始将答案标记为正确。另见我最后的评论。