Excel XML数据馈送使行数据不在行

我有一个XML Feed,它将按照字母顺序sorting的电子邮件地址列表绘制到Sheet 1中

在工作表2中,我有列1中的电子邮件地址列表,然后列出其他几列包含用户信息的列。

当我刷新数据,并且一个新的电子邮件被添加到列表中时,列1中的电子邮件地址列表向下移动,因此其他列中的数据不在同一行中。 是否有反正我可以插入一个新的行,并将所有的列中的所有数据向下移动,如果当一个新的地址被添加到列1中。同样,如果电子邮件从饲料中删除,删除一行数据。

我知道这实际上是在数据库中,但我没有这个选项。

提前致谢!

首先,由于缺乏信息,我将假设一个场景来努力实现你所需要的。 您可能需要稍微更改一下代码以适合您的需求,但是这会为您提供一个工作的基础。

由于您的XML Feed不包含其他数据,因此包含电子邮件地址的表格将不会将行添加到表格的其余部分。 我的build议是你使用vba代码为你做这个工作。

假设你有下面的xml文件:

<?xml version="1.0" encoding="UTF-8"?> <Email> <address>teste@teste.com</address> <address>teste1@teste.com</address> <address>teste2@teste.com</address> <address>teste3@teste.com</address> <address>teste4@teste.com</address> <address>teste6@teste.com</address> </Email> 

使用下面的代码将在工作表上生成一个表格:

 Const xmlFileUrl As String = "c:\filePath\note.xml" Sub ClearXmlMaps() Dim existingXmlMap As XmlMap For Each existingXmlMap In ActiveWorkbook.XmlMaps existingXmlMap.Delete Next existingXmlMap End Sub Sub CreateMailList() Dim xmlTable As XmlMap ClearXmlMaps Application.WindowState = xlNormal ActiveWorkbook.XmlImport URL:=xmlFileUrl, ImportMap:=Nothing, Overwrite:=True, Destination:=Range("$A$1") Set xmlTable = ActiveWorkbook.XmlMaps(1) xmlTable.Name = "EmailList" End Sub 

该代码生成下表中的红色方形部分:

XMLTable的

我添加了一个名为“名称”的新列。 现在假设我想刷新我的XML提要而不清除列名的所有信息。 为此,我将使用辅助工作表(我的主表格是“数据”,辅助工具是“辅助”工作表)复制所有数据,刷新进给,最后使用最后一个状态VLOOKUP命令,如下所示:

 Sub RefreshEmailList() Dim existingXmlMap As XmlMap Dim dataSheet As Worksheet Dim auxSheet As Worksheet Set dataSheet = ThisWorkbook.Worksheets("Data") Set auxSheet = ThisWorkbook.Worksheets("Aux") dataSheet.Cells.Copy auxSheet.Cells(1, 1) auxSheet.Range(auxSheet.Cells(1, 1), auxSheet.Cells(auxSheet.Cells(auxSheet.Rows.Count, 1).End(xlUp).Row, auxSheet.Cells(1, auxSheet.Columns.Count).End(xlToLeft).Column)).Value = auxSheet.Range(auxSheet.Cells(1, 1), auxSheet.Cells(auxSheet.Cells(auxSheet.Rows.Count, 1).End(xlUp).Row, auxSheet.Cells(1, auxSheet.Columns.Count).End(xlToLeft).Column)).Value dataSheet.Range(dataSheet.Cells(2, 2), dataSheet.Cells(dataSheet.Cells(dataSheet.Rows.Count, 1).End(xlUp).Row, dataSheet.Cells(1, dataSheet.Columns.Count).End(xlToLeft).Column)).Clear For Each existingXmlMap In ThisWorkbook.XmlMaps If existingXmlMap.Name = "EmailList" Then ActiveWorkbook.XmlMaps("EmailList").DataBinding.Refresh End If Next existingXmlMap dataSheet.Range(dataSheet.Cells(2, 2), dataSheet.Cells(dataSheet.Cells(dataSheet.Rows.Count, 1).End(xlUp).Row, dataSheet.Cells(1, dataSheet.Columns.Count).End(xlToLeft).Column)).FormulaR1C1 = "=IFERROR(IF(VLOOKUP([@address],Aux!C1:C,COLUMN(),FALSE) = 0 , """", VLOOKUP([@address],Aux!C1:C,COLUMN(),FALSE)), """")" dataSheet.Range(dataSheet.Cells(2, 2), dataSheet.Cells(dataSheet.Cells(dataSheet.Rows.Count, 1).End(xlUp).Row, dataSheet.Cells(1, dataSheet.Columns.Count).End(xlToLeft).Column)).Value = dataSheet.Range(dataSheet.Cells(2, 2), dataSheet.Cells(dataSheet.Cells(dataSheet.Rows.Count, 1).End(xlUp).Row, dataSheet.Cells(1, dataSheet.Columns.Count).End(xlToLeft).Column)).Value End Sub 

如果您将xml文件更改为以下内容:

 <?xml version="1.0" encoding="UTF-8"?> <Email> <address>teste@teste.com</address> <address>teste1@teste.com</address> <address>teste2@teste.com</address> <address>teste3@teste.com</address> <address>teste4@teste.com</address> <address>teste5@teste.com</address> <address>teste6@teste.com</address> </Email> 

然后运行RefreshEmailList()子程序,你会得到如下结果:

FinalXmlFeedResult

上面的解决scheme适用于添加或删除行,但您应该知道两件事情:

  • 使用刷新button刷新XML Feed将不会触发事件
  • 此解决scheme不保留旧状态,这意味着,如果一个电子邮件被删除,然后重新添加,有关该用户的信息可能会丢失。

您可以将传入的数据放入“保存区域”(可以是单独的工作表或数组,取决于您更喜欢哪一个),而不是自动刷新列。

然后,您可以比较两个列表以检查新的电子邮件地址(将其添加到现有数据的末尾)或传入数据中不再存在的电子邮件地址(从现有数据中删除行)。

插入一个新行(并将每列向下移动),可以使用这个VBA代码:

 ActiveCell.EntireRow.Insert xlShiftDown 

与ActiveCell是一个单元格(范围)在新的一个应该出现的行:如果你需要添加第5空行ActiveCell.Row应该是= 5。

删除整行代码将是:

 ActiveCell.EntireRow.Delete xlShiftUp 

ActiveCell是要删除的行中的单元格(范围)