用vba读取html文件

用vba读取html文件,vba,Vba,在我的项目中,我正在读取一个带有vba代码的html文件,我正在用一些子字符串扫描它,然后我正在用这些子字符串创建一个json文件子任务是我的子字符串之一。当我扫描html文件时,它会找到9个子任务,但在我的html文件中有9个以上。我的密码是这样的 For i = 1 To lastrow txt = Cells(i, 1) I

在我的项目中,我正在读取一个带有vba代码的html文件,我正在用一些子字符串扫描它,然后我正在用这些子字符串创建一个json文件子任务是我的子字符串之一。当我扫描html文件时,它会找到9个子任务,但在我的html文件中有9个以上。我的密码是这样的

            For i = 1 To lastrow                    
                txt = Cells(i, 1)                    
                If txt = "All" Or txt = "ALL" Or txt = "V2500-A5" Then   'Or txt = "V2500-A1"
                    engType = txt
                End If

                If txt = "About" Then GoTo skipNextRow

                If Left(txt, 1) <> "0" And Left(txt, 5) <> "TASK " And Left(txt, 4) <> "DMC:" And Right(Left(txt, 11), 8) <> "SUBTASK " Then GoTo skipNextRow                                                            

                If Left(txt, 5) = "TASK " Then
                    locationTASK = InStr(1, txt, "TASK ")

                ElseIf Left(txt, 4) = "DMC:" Then
                    locationDMC = InStr(1, txt, "DMC:")
                    locationIssueNo = InStr(1, txt, "Issue No:")
                    locationIssueDate = InStr(1, txt, "Issue Date:")

                ElseIf Right(Left(txt, 11), 8) = "SUBTASK " Then

                    Debug.Print "Subtask: " & txt
                    locationSUBTASK = InStr(1, txt, "SUBTASK ")

                End If                    

skipNextRow:

           Next i

           ReDim Preserve arrApplicability(w): arrApplicability(w) = engType
           ReDim Preserve arrPartNo(w): arrPartNo(w) = myTemp
           w = w + 1
i=1至最后一行的

txt=单元(i,1)
如果txt=“全部”或txt=“全部”或txt=“V2500-A5”,则“或txt=“V2500-A1”
engType=txt
如果结束
如果txt=“About”,则转到skipNextRow
如果左(txt,1)“0”和左(txt,5)“任务”和左(txt,4)“DMC:”和右(左(txt,11),8)“子任务”,则转到skipNextRow
如果左(txt,5)=“任务”,则
locationTASK=InStr(1,txt,“任务”)
ElseIf Left(txt,4)=“DMC:”然后
位置DMC=InStr(1,txt,“DMC:”)
位置ISSUENO=InStr(1,txt,“发行号:”)
locationIssueDate=InStr(1,txt,“发布日期:”)
ElseIf Right(Left(txt,11),8)=“子任务”然后
调试。打印“子任务:&txt”
locationSUBTASK=InStr(1,txt,“子任务”)
如果结束
SkipnProw:
接下来我
ReDim保留阵列适用性(w):阵列适用性(w)=engType
ReDim保存arrPartNo(w):arrPartNo(w)=myTemp
w=w+1

我的问题在子任务中,其他部分没有问题。

您查找文本的方式有点不稳定。在预期的格式中没有太大的更改空间。在看不到您的实际输入的情况下,这将是一个很大的猜测,但这是事实。
我怀疑单词subtask放在不同的列中,而您只得到从第4列开始的那些。下面是一些可能使调试更容易的提示

  • 这将帮助您找到丢失的行及其所在位置。如果结束,则将其替换为
  • Mid
    是一个对您有所帮助的函数。将
    Right(Left(txt,11),8)
    替换为
    Mid(txt,4,8)
    。这对你当前的问题没有帮助,但仍然是
  • 了解正则表达式。以下是一个可以帮助您入门的片段:

  • 模式
    “*SUBTASK(.*)”
    的意思是“在一行中的任何地方找到单词'SUBTASK',并跟踪它后面的内容。”。
    (.*)
    部件将被识别为子匹配。

    代码太多了。你能把范围缩小到一个更容易处理的问题吗?@braX我编辑了我的代码。只有读取和扫描代码。是的。使用正则表达式。我宁愿使用Dim regex作为RegExp,matches作为MatchCollection,sm作为SubMatches@TomRobinson,我同意。在本例中,我选择了通用对象来降低入口阈值。不确定这是好是坏。
        Else
            locationSUBTASK = InStr(1, txt, "SUBTASK")
            Debug.Print "SUBTASK found in position " & locationSUBTASK 
        End If
    
        Dim RegExp As Object
        Dim Matches As Object
    
        Dim txt As String
        txt = "something SUBTASK yada yada"
    
        Set RegExp = CreateObject("VBScript.RegExp")
    
        RegExp.Pattern = ".*SUBTASK (.*)"
        Set Matches = RegExp.Execute(txt)
        Debug.Print Matches(0).SubMatches(0)