簡體   English   中英

VBA根據單元格中的值迭代行

[英]VBA iterating rows depending on value in cells

我想讓我的VBA腳本按照另一個工作表中實例值的順序編寫一段文本。 我有一段代碼可以將大量文本寫到工作表A中。

Dim selectedTest As String
Dim activeCell As Range
Dim outputCell As Range
Dim currentValue As String
Dim activePage As String
Dim row As String
Dim instancecol As String

selectedTest = template.Range("I6, I6").value
Set activeCell = template.Cells.Find(selectedTest + " Data")
Set activeCell = activeCell.Offset(0, 1)
instancecol = Split(activeCell(1).Address(1, 0), "$")(0)
Set activeCell = activeCell.Offset(2, -1)
currentValue = activeCell.value
row = activeCell.row
activePage = template.Range("B" + row)

Set outputCell = json.Range("D26")

outputCell.Activate
outputCell.value = Chr(34) + "name" + Chr(34) + ": " + Chr(34) + activePage + Chr(34) + ","
Set outputCell = outputCell.Offset(1, 0)
outputCell.value = Chr(34) + "instance" + Chr(34) + ": " + Chr(34) + "1" + Chr(34) + ","
Set outputCell = outputCell.Offset(1, 0)
outputCell.value = Chr(34) + "Input" + Chr(34) + ": ["
Set outputCell = outputCell.Offset(0, 1)

While Not currentValue = "ENDPARSE"

If Not (activeCell.Offset(0, 1).value = "") Then

    Dim currentPage As String
    Dim referenceType As String
    Dim reference As String
    Dim action As String
    Dim wait As String
    Dim screenshot As String
    Dim instance As String

    Set outputCell = outputCell.Offset(1, 0)
    outputCell.value = "{"
    Set outputCell = outputCell.Offset(1, 1)


    row = activeCell.row
    currentPage = template.Range("B" + row)

    If Not (activePage = currentPage) Then
        activePage = currentPage
        Set outputCell = outputCell.Offset(-1, -1)
        outputCell.value = ""
        Set outputCell = outputCell.Offset(-1, 0)
        outputCell.value = "}"
        Set outputCell = outputCell.Offset(1, -1)
        outputCell.value = "]"
        Set outputCell = outputCell.Offset(1, -1)
        outputCell.value = "},"
        Set outputCell = outputCell.Offset(1, 0)
        outputCell.value = "{"
        Set outputCell = outputCell.Offset(1, 1)
        outputCell.value = Chr(34) + "name" + Chr(34) + ": " + Chr(34) + activePage + Chr(34) + ","
        Set outputCell = outputCell.Offset(1, 0)
        outputCell.value = Chr(34) + "instance" + Chr(34) + ": " + Chr(34) + "1" + Chr(34) + ","
        Set outputCell = outputCell.Offset(1, 0)
        outputCell.value = Chr(34) + "Input" + Chr(34) + ": ["
        Set outputCell = outputCell.Offset(1, 1)
        outputCell.value = "{"
        Set outputCell = outputCell.Offset(1, 1)
    End If

    referenceType = template.Range("C" + row)
    reference = template.Range("A" + row)
    action = template.Range("F" + row)
    wait = template.Range("H" + row)
    screenshot = template.Range("I" + row)
    instance = template.Range(instancecol + row)
    currentValue = activeCell.value

    outputCell.value = Chr(34) + "type" + Chr(34) + ": " + Chr(34) + referenceType + Chr(34) + ","
    Set outputCell = outputCell.Offset(1, 0)
    outputCell.value = Chr(34) + "reference" + Chr(34) + ": " + Chr(34) + reference + Chr(34) + ","
    Set outputCell = outputCell.Offset(1, 0)
    outputCell.value = Chr(34) + "action" + Chr(34) + ": " + Chr(34) + action + Chr(34) + ","
    Set outputCell = outputCell.Offset(1, 0)
    outputCell.value = Chr(34) + "instance" + Chr(34) + ": " + Chr(34) + instance + Chr(34) + ","
    Set outputCell = outputCell.Offset(1, 0)
    outputCell.value = Chr(34) + "wait" + Chr(34) + ": " + Chr(34) + wait + Chr(34) + ","

    If Not (currentValue = "") Then
        Set outputCell = outputCell.Offset(1, 0)
        outputCell.value = Chr(34) + "value" + Chr(34) + ": " + Chr(34) + currentValue + Chr(34) + ","
    End If

    Set outputCell = outputCell.Offset(1, 0)
    outputCell.value = Chr(34) + "screenshot" + Chr(34) + ": " + Chr(34) + screenshot + Chr(34)

    Set outputCell = outputCell.Offset(1, -1)
    outputCell.value = "},"

End If

Set activeCell = activeCell.Offset(1, 0)
currentValue = activeCell.value
Wend

outputCell.value = "}"
Set outputCell = outputCell.Offset(1, -1)
outputCell.value = "]"
Set outputCell = outputCell.Offset(1, -1)
outputCell.value = "}"
Set outputCell = outputCell.Offset(1, -1)
outputCell.value = "]"
Set outputCell = outputCell.Offset(1, -1)
outputCell.value = "}"

Dim dataRange As Range
Set dataRange = json.UsedRange
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(template.Range("I2,I2") + "\\" + template.Range("I3,I3") + ".json", True)
For Each C In dataRange
a.WriteLine (C.value)
Next C
a.Close

template.Activate

End Sub

這將使用工作表B中的值將信息寫入工作表A中。此刻,我的輸出如下所示:

{           
"name": "Search",       
"instance": "1",        
"Input": [      
    {   
        "type": "button",
        "reference": "Search",
        "action": "Click",
        "instance": "1",
        "wait": "10",
        "screenshot": "true"
    },  
    {   
        "type": "dropdown",
        "reference": "PostcodeLogic",
        "action": "SelectByText",
        "instance": "2",
        "wait": "10",
        "value": "Is",
        "screenshot": "true"
    },  
    {   
        "type": "text",
        "reference": "PostCodeInput",
        "action": "SendKeys",
        "instance": "3",
        "wait": "10",
        "value": "AL2 4ED",
        "screenshot": "true"
    },  
    {   
        "type": "button",
        "reference": "Search",
        "action": "Click",
        "instance": "5",
        "wait": "10",
        "screenshot": "true"
    },  
    {   
        "type": "link",
        "reference": "ClientName ",
        "action": "Click",
        "instance": "4",
        "wait": "10",
        "screenshot": "true"
    }   
]       
}           

如您所見,我想要的所有信息都在那里並且可以正常工作。 我現在需要使它按instance順序寫出測試塊。 我有一個稱為sequence的字段,它先讀取編號,然后將其放入instance字段。

如果不能很好地解釋這一點,對VBA還是很新的。

像這樣的東西,不是發布作為答案,只是為了使用代碼格式。 我的數據在A中,序列號在B中

Sub testing()

Dim OutputCollection As New Collection                  '   For ease
Dim intMaxSeq As Integer
Dim intSeq As Integer
Dim intRow As Integer

intMaxSeq = WorksheetFunction.Max(Range("N:N"))

For intSeq = 1 To intMaxSeq

    For intRow = 1 To Range("A1").End(xlDown).Row

        If Range("N" & intRow) = intSeq Then
            '   Your code will sit here to build the o/p

            '   Like this example only!!!!!!!!
            sheet("Output").range("a1").value=range("A" & introw).value
            sheet("Output").range("b1").value=range("C" & introw).value
            sheet("Output").range("c1").value=range("J" & introw).value
            '



        End If

    Next intRow

Next intSeq

End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM