首页 > 解决方案 > For循环中的VBA查找和替换未按预期替换

问题描述

我正在使用 Excel 工作表并将它们转换为 XML 格式,然后导入 SQL。我有一个文件链接列表的工作表,称为“文件列表”。该代码在文件链接中打开了必要的表格,并将数据放入名为“XML 格式”的表格中,该表格适合随后导入 SQL。问题是传输数据循环中的查找和替换确实运行,但似乎没有通过第一个“文件列表”引用。

Sub LinkFile()
Application.ScreenUpdating = False


ThisWorkbook.Sheets("Files List").Activate

oldfile = Sheets("Files List").Range("oldFile")

Debug.Print oldfile
strfnd = oldfile
Set db1 = connect_sql_server()

strfnd = Format_link(oldfile)
Debug.Print strfnd

For i = 3 To 50

Sheets("Files List").Range("FIleIndex").value = i

filelink = Sheets("Files List").Range("fileindex2")

curfile = ThisWorkbook.Sheets("Files List").Range("curfile")

Set wkbkNew = Workbooks.Open(filelink)
ThisWorkbook.Sheets("XML Format").Range("B3") = ActiveWorkbook.Name
Debug.Print (ThisWorkbook.Sheets("XML Format").Range("B3"))

Set wbsheet = wkbkNew.Sheets("Calculations")

    filelink = ThisWorkbook.Sheets("Files List").Range("E3")


    strRplc = filelink
    Debug.Print (strRplc)
    Set sht = ThisWorkbook.Sheets("XML Format")
    Application.Volatile

    ActiveWorkbook.Close SaveChanges:=False

    Application.Volatile

     sht.Cells.Replace What:=strfnd, Replacement:=strRplc, _
         LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
         SearchFormat:=False, ReplaceFormat:=False

        strfnd = strRplc
        Debug.Print (strfnd)

    ThisWorkbook.Sheets("XML Format").Activate
    strxml = concatenate_xml()
    Debug.Print (strxml)
     'this imports data into sql server
     WriteDB strxml, db1

strfnd = strRplc
continue:
Next i

db1.Close
End Sub

假设循环设置为 i=2 到 2。预期结果是在“XML 格式”表中,数据应该来自“文件列表”中的第二个文件链接。实际输出是数据始终来自第一个文件链接,即原始“旧文件”。唯一能按预期工作的是文件名“ActiveWorkbook.Name”。

标签: excelvba

解决方案


抱歉,如果我不能花很多时间详细回答您的问题。尝试通过各种工作簿中 Excel 中的大量单元格来工作通常会给我带来很多问题。特别是如果您在工作表事件上运行宏。我能给出的最好建议是,您从旧工作表中获取全部内容,使用 VBA 对其进行处理,然后将其放回新工作表中。它还将使您的宏加速几个数量级。

这个过程看起来有点像这样:

XML_table = thisWorkbook.range()

for i = 1 to nr_rows
   for j = 1 to nr_columns
      XML_table(i,j) = replace_str(XML_table(i,j))
    next j
next i

thatWorkbook.range() = XML_table

祝你好运,希望快速的建议能有所帮助


推荐阅读