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
该代码生成下表中的红色方形部分:
我添加了一个名为“名称”的新列。 现在假设我想刷新我的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()子程序,你会得到如下结果:
上面的解决scheme适用于添加或删除行,但您应该知道两件事情:
- 使用刷新button刷新XML Feed将不会触发事件
- 此解决scheme不保留旧状态,这意味着,如果一个电子邮件被删除,然后重新添加,有关该用户的信息可能会丢失。
您可以将传入的数据放入“保存区域”(可以是单独的工作表或数组,取决于您更喜欢哪一个),而不是自动刷新列。
然后,您可以比较两个列表以检查新的电子邮件地址(将其添加到现有数据的末尾)或传入数据中不再存在的电子邮件地址(从现有数据中删除行)。
要插入一个新行(并将每列向下移动),可以使用这个VBA代码:
ActiveCell.EntireRow.Insert xlShiftDown
与ActiveCell是一个单元格(范围)在新的一个应该出现的行:如果你需要添加第5空行ActiveCell.Row应该是= 5。
要删除整行代码将是:
ActiveCell.EntireRow.Delete xlShiftUp
ActiveCell是要删除的行中的单元格(范围)