VBA导入/更新工作簿之间的范围(包括结果的不同列)

时间:2017-09-03 04:58:30

标签: excel-vba import vba excel

我正在寻求以下任务的帮助,很乐意提供帮助!

我想要实现的目标:

  1. 从导出表中获取数据(从B8开始直到B中的最后一行)并将其与导入表中的数据进行比较(从C12开始)
  2. 如果在C12线以下不存在数据,请在下面添加(如果有)现有项目;否则,如果数据存在于C12和C列中的最后一项之间,请更新它
  3. 仅从导出工作表添加或更新B到D列。
  4. 从导入工作表的F列中的导出工作表添加或更新D列。
  5. 最后(结束游戏),将更新项目的价格单元格背景颜色更改为绿色,将不在导出工作表中的预先存在的项目更改为红色,将新添加的项目更改为蓝色。
  6. 我开始使用Here找到的代码,但经过大量修改以完成上述任务后,它在我要做的事情列表的中途停止工作。

    下面是代码(还没有错误处理程序等)以及图片的下方(我想要实现的内容应该是这样的;不应该从一个工作表添加或更新到另一个工作表的单元格的红色背景颜色)。 另请注意,我调整了很多变量,因为我想在以后实现不同的选择。

    同样,任何帮助都将受到高度赞赏

    更新:任何人有兴趣的最终代码

    • 为每个新项目添加新行
    • 忽略两张表中的空“中间”行
    • 价格行按上述颜色编码

      Option Explicit  
      Sub Import()
      
      Const IMPORTFILENAME = "export_data.xlsx"
      Dim key As Variant
      Dim cell As Range
      Dim dProducts As Object
      Set dProducts = CreateObject("Scripting.Dictionary")
      
      With Workbooks(IMPORTFILENAME).Sheets(1)
      For Each cell In .Range("B8", .Range("B" & .Rows.Count).End(xlUp))
       If Not IsEmpty(cell) Then
          key = cell.Value
          If dProducts.Exists(key) Then
              'There is a duplicate value
              Debug.Print "Duplicate values", dProducts(key).Address, cell.Address
          Else
              'Add the cell range object to the dictionary
              dProducts.Add key, cell
          End If
        Else
        End If
      Next
      End With
      
      With ThisWorkbook.Sheets(1)
      For Each cell In .Range("C12", .Range("C" & .Rows.Count).End(xlUp))
          key = cell.Value
          If dProducts.Exists(key) Then
              cell.Offset(0, 1).Value = dProducts(key).Offset(0, 1).Value
              cell.Offset(0, 3).Value = dProducts(key).Offset(0, 2).Value
              cell.Offset(0, 3).Interior.Color = vbGreen
              'Remove the Export cell reference
              dProducts.Remove key
          Else
            If Not IsEmpty(cell) Then
              If cell.Value <> 0 Then
                  cell.Offset(0, 3).Interior.Color = vbRed
              Else
              End If
            Else
            End If
          End If
      Next
      
      For Each key In dProducts.Keys
          With .Range("C" & .Rows.Count).End(xlUp).Offset(1, 0)
              .EntireRow.Insert
              .Offset(-1, 0).Value = dProducts(key).Value
              .Offset(-1, 3).Interior.Color = vbBlue
              .Offset(-1, 1).Value = dProducts(key).Offset(0, 1).Value
              .Offset(-1, 3).Value = dProducts(key).Offset(0, 2).Value
          End With
      Next
      End With
      End Sub
      

    PICTURE

1 个答案:

答案 0 :(得分:0)

您的代码似乎有两张纸向后。无论如何,我的代码都基于您的图像。我不确定您想要的某些格式,但您应该能够轻松修改代码以满足您的需求。

我建议在比较两个列表中的唯一项目(或搜索重复项目)时使用词典或集合。你应该看:Excel VBA Introduction Part 39 - Dictionaries

在许多情况下,您可以使用常量来减少代码行。我还建议使用短变量名称和<div id="sample-div" contenteditable="true"> this is a </div> 块来减少代码混乱。理想情况下,您永远不必水平滚动以查看代码行正在做什么。

$(document).ready(function(){
    $('span').keyup(function(){
        if(!this.value)
        {
            alert('this is empty');
        }
    });
});