Excel 嵌套if/Loop VBA的帮助

Excel 嵌套if/Loop VBA的帮助,excel,vba,nested-loops,Excel,Vba,Nested Loops,我正在通过Excel电子表格循环,并将所有单元格组合成一个字符串,我做到了。现在,我需要先用XML标记格式化字符串,然后再发送它进行上传,而我在正确地将标记放入循环中遇到了一些困难。看起来它几乎可以工作了,但是有几个标签没有放在正确的位置。任何帮助都将不胜感激 代码: 作为字符串的公共文件 子定位_文件() 尺寸为1_95的线状薄板 变暗范围 作为字符串的Dim strVal 将wb设置为工作簿 作为整数的Dim计数器dt 作为整数的Dim计数器 Dim计数器MB为整数 作为字符串的Dim ou

我正在通过Excel电子表格循环,并将所有单元格组合成一个字符串,我做到了。现在,我需要先用XML标记格式化字符串,然后再发送它进行上传,而我在正确地将标记放入循环中遇到了一些困难。看起来它几乎可以工作了,但是有几个标签没有放在正确的位置。任何帮助都将不胜感激

代码:

作为字符串的公共文件
子定位_文件()
尺寸为1_95的线状薄板
变暗范围
作为字符串的Dim strVal
将wb设置为工作簿
作为整数的Dim计数器dt
作为整数的Dim计数器
Dim计数器MB为整数
作为字符串的Dim outputStr
'提示用户输入其他excel工作表的位置'
file=Application.GetOpenFilename(“Excel文件(*.xlsx),*.xlsx”)
设置wb=工作簿。打开(文件)
暗淡单元格作为范围
'初始化xml字符串'
strVal=“”
工作表(“DT”)。激活
计数器dt=1
对于ActiveSheet.UsedRange.Cells中的每个单元格
'此第一个if块只是从数据收集中排除了少数标题单元格'
如果单元格值“SKU”和单元格值“P编号”以及单元格值“月”_
和单元格。值“DP Dmd”和单元格。值“垂直”
如果cell.Column=“1”,则
strVal=strVal&&cell.Value&
ElseIf cell.Column=“2”然后strVal=strVal&&&cell.Value&”
ElseIf cell.Column=“3”则strVal=strVal&&&cell.Value&”
ElseIf cell.Column=“4”则strVal=strVal&&&cell.Value&”
Else:strVal=strVal&&cell.Value&&
如果结束
计数器DT=计数器DT+1
如果是单元格。第1行,则
如果计数器DT Mod 6=0,则
strVal=“&strVal&”“&category.percent(单元格“DT”)&”
否则:如果
否则:如果
如果结束
下一个
strVal=strVal&“
所以基本上问题是,这个循环/嵌套if在字符串的最开始处打印30个“item”标记,我不知道为什么


对于其他一些信息,Excel工作表是6列,并且总是6列。

当我创建xml标记时,我喜欢将实际的标记移动到一个单独的函数中。好处是它可以确保我的标签匹配。缺点是直到最后才“应用”标记。像item和root这样的标记是在完成其中的所有标记之后完成的。下面是一个例子:

Sub locate_file()

    Dim sVal As String
    Dim sRow As String
    Dim wb As Workbook
    Dim sh As Worksheet
    Dim lCntDT As Long
    Dim rCell As Range
    Dim rRow As Range
    Dim vaTags As Variant

    gsFile = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx")

    If gsFile <> "False" Then
        Set wb = Workbooks.Open(gsFile)
        Set sh = wb.Sheets("DT")
        vaTags = Array("sku", "pnum", "month", "forecast", "vertical")

        lCntDT = 1

        For Each rRow In sh.UsedRange.EntireRow
            sRow = ""
            If rRow.Cells(1) <> "SKU" Then
                For Each rCell In Intersect(sh.UsedRange, rRow).Cells
                    If rCell.Column <= 4 Then
                        sRow = sRow & TagValue(rCell.Value, vaTags(rCell.Column - 1))
                    Else
                        sRow = sRow & TagValue(rCell.Value, vaTags(UBound(vaTags)))
                    End If
                Next rCell

                lCntDT = lCntDT + 1
                If rRow.Row <> 1 And lCntDT Mod 6 = 0 Then
                    sVal = sVal & TagValue("CatPct", "percent")
                End If
                sRow = TagValue(sRow, "item")
                sVal = sVal & sRow & vbNewLine
            End If
        Next rRow
        sVal = TagValue(sVal, "root")
    End If

    Debug.Print sVal

End Sub

Function TagValue(ByVal sValue As String, ByVal sTag As String) As String

    TagValue = "<" & sTag & ">" & sValue & "</" & sTag & ">"

End Function
子定位_文件()
作为字符串的Dim sVal
作为字符串的Dim sRow
将wb设置为工作簿
将sh设置为工作表
变暗lCntDT为长
变暗rCell As范围
暗箭头范围
Dim vaTags作为变体
gsFile=Application.GetOpenFilename(“Excel文件(*.xlsx),*.xlsx”)
如果gsFile为“False”,则
设置wb=Workbooks.Open(gsFile)
设置sh=工作分解表(“DT”)
vaTags=数组(“sku”、“pnum”、“月”、“预测”、“垂直”)
lCntDT=1
对于sh.UsedRange.EntireRow中的每个错误
sRow=“”
如果错误单元格(1)“SKU”,则
对于Intersect(sh.UsedRange,rRow)中的每个rCell。单元格

如果rCell.Column Hi@Joe,有两件事:1-如果可能,尝试用适当定义的范围替换“ActiveSheet.UsedRange.Cells”。UsedRange可能很棘手。2-标签是第一个添加的还是第二个添加的?Hi Tiago,我不确定我是否可以更改usedRange,因为这基本上是一个脚本,用于自动处理特定电子表格中的数据,虽然表格中的列和格式始终保持不变,但每次运行的行数都会改变。好吧,我发现是if块在计数器递增行下面添加了“percent”标记。如果我评论说它可以输出,但是没有明显的百分比。更新:我知道了!你关于哪个if block正在添加它的评论让我质疑为什么我让它在第二个if block中添加另一个项目标记,它不应该在那里。很高兴知道,@Joe!我应该发布一个正确的答案来回答这个问题&结束:顺便说一句,我会使用一个精选案例陈述,而不是所有其他的。而且,你不需要空白的ELSE,只要结束就可以了。
Sub locate_file()

    Dim sVal As String
    Dim sRow As String
    Dim wb As Workbook
    Dim sh As Worksheet
    Dim lCntDT As Long
    Dim rCell As Range
    Dim rRow As Range
    Dim vaTags As Variant

    gsFile = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx")

    If gsFile <> "False" Then
        Set wb = Workbooks.Open(gsFile)
        Set sh = wb.Sheets("DT")
        vaTags = Array("sku", "pnum", "month", "forecast", "vertical")

        lCntDT = 1

        For Each rRow In sh.UsedRange.EntireRow
            sRow = ""
            If rRow.Cells(1) <> "SKU" Then
                For Each rCell In Intersect(sh.UsedRange, rRow).Cells
                    If rCell.Column <= 4 Then
                        sRow = sRow & TagValue(rCell.Value, vaTags(rCell.Column - 1))
                    Else
                        sRow = sRow & TagValue(rCell.Value, vaTags(UBound(vaTags)))
                    End If
                Next rCell

                lCntDT = lCntDT + 1
                If rRow.Row <> 1 And lCntDT Mod 6 = 0 Then
                    sVal = sVal & TagValue("CatPct", "percent")
                End If
                sRow = TagValue(sRow, "item")
                sVal = sVal & sRow & vbNewLine
            End If
        Next rRow
        sVal = TagValue(sVal, "root")
    End If

    Debug.Print sVal

End Sub

Function TagValue(ByVal sValue As String, ByVal sTag As String) As String

    TagValue = "<" & sTag & ">" & sValue & "</" & sTag & ">"

End Function