VBA помещает переменную в вызов API и перебирает несколько строк - PullRequest
0 голосов
/ 18 декабря 2018

Я использую Excel Power Query и VBA, чтобы попытаться автоматизировать вызов API.Я почти не знаю VBA, и у меня это работает только путем записи макроса и его настройки.

В настоящее время у меня есть это - поэтому он вызывает API, с указанными targetId и ScanId и моим ключом аутентификации:

ActiveWorkbook.Queries.Add Name:="scan-result", Formula:= _
"let" & Chr(10) & "    Source = Json.Document(Web.Contents(""https://api.mcafeesecure.com/api/v1/scan-result.json?**targetId**=12345&**scanId**=aasdhgfdhgfaksdfgdhajsdfgdha"", [Headers=[#""x-apikey""=""mykeyhere""]]))," & Chr(10) & "    scan = Source[scan]," & Chr(10) & "    #""Converted to Table"" = Record.ToTable(scan)," 

[etc]

В настоящее время это работает, если я указываю цель и идентификаторы сканирования вручную в каждом вызове. НО Мне нужно, чтобы targetId и ScanId были переменными, которые находятся на моей вкладке «Сводка сканирования» в столбцах A и D соответственно.Мне нужен VBA для циклического перебора всех строк в таблице «Сводка сканирования» - запрос A2 и D2 и вывод в таблицу, затем A3 и D3 и т. Д.

Любая помощь будет принята с благодарностью!

Заранее спасибо !!

ОБНОВЛЕНИЕ: у меня работает цикл, но значения TargetID и ScanID не анализируются в вызове API ...

Ошибка, которую я получаю от запроса Power: = Json.Document (Web.Contents ("https://api.mcafeesecure.com/api/v1/scan-result.json?targetId=" & TargetID &" & scanId = "& ScanID, [Headers = [#" x-apikey "="mykeygoeshere"]])) Expression.Error: Имя 'TargetID' не распознано. Убедитесь, что оно написано правильно. Когда я посмотрел на запрос, я подумал, что у меня там будет нужный targetID / ScanId, но вместо этого япросто есть слова ...?

VBA код:

Dim TargetID As String
Dim ScanID As String
Dim i As Long

For i = 1 To 2

    TargetID = Sheets("Scan Summary").Cells(i, 1).Value
    ScanID = Sheets("Scan Summary").Cells(i, 4).Value

    ActiveWorkbook.Queries.Add Name:="scan-result", Formula:= _
    "let" & Chr(10) & "    Source = Json.Document(Web.Contents(""https://api.mcafeesecure.com/api/v1/scan-result.json?targetId="" & TargetID & ""&scanId="" & ScanID, [Headers=[#""x-apikey""=""mykeygoeshere""]]))," & Chr(10) & "    scan = Source[scan]," & Chr(10) & "    #""Converted to Table"" = Record.ToTable(scan)," & Chr(10) & "    #""Transposed Table"" = Table.Transpose(#""Converted to Tabl" & _
    "e"")," & Chr(10) & "    #""Promoted Headers"" = Table.PromoteHeaders(#""Transposed Table"", [PromoteAllScalars=true])," & Chr(10) & "    #""Changed Type"" = Table.TransformColumnTypes(#""Promoted Headers"",{{""dateTime"", type datetime}, {""targetId"", Int64.Type}, {""scanId"", type text}, {""vulns"", type any}, {""sevCountInfo"", type any}, {""sevCountVuln"", type any}, {""ports"", type any}}" & _
    ")," & Chr(10) & "    #""Expanded vulns"" = Table.ExpandListColumn(#""Changed Type"", ""vulns"")," & Chr(10) & "    #""Expanded vulns1"" = Table.ExpandRecordColumn(#""Expanded vulns"", ""vulns"", {""severity"", ""protocol"", ""vulnId"", ""first_found_date"", ""port"", ""pci""}, {""vulns.severity"", ""vulns.protocol"", ""vulns.vulnId"", ""vulns.first_found_date"", ""vulns.port"", ""vulns.pci""})" & _
    "," & Chr(10) & "    #""Reordered Columns"" = Table.ReorderColumns(#""Expanded vulns1"",{""dateTime"", ""targetId"", ""scanId"", ""vulns.vulnId"", ""vulns.severity"", ""vulns.protocol"", ""vulns.first_found_date"", ""vulns.port"", ""vulns.pci"", ""sevCountInfo"", ""sevCountVuln"", ""ports""})," & Chr(10) & "    #""Removed Columns"" = Table.RemoveColumns(#""Reordered Columns"",{""sevCountInfo""," & _
    " ""sevCountVuln"", ""ports""})" & Chr(10) & "in" & Chr(10) & "    #""Removed Columns"""

    ActiveWorkbook.Worksheets.Add

    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=scan-result;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [scan-result]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

FWIW: я обнаружил, что намного легче кодировать Excel VBA, как только я начал определять правильные объекты, чем работать с «активными» объектами.

Например:

У вас естьсписок вещей, которые вы хотели бы сделать с переменными.

Dim wb as excel.workbook
Dim wsScanList as excel.worksheet
Let's say that you have your variable list in columns A and B, - no empty rows.
dim CurRow as long
dim Var1 as string (call it what you like)
dim Var2 as long


 and so on defining all your variables and object.
set wb = ThisWorkBook
set ws= wb.worksheets("Scan Summary")
CurRow = 2 (assuming that you have headers in row 1)
do until isempty(ws.Range("A" & CurRow))
    Var1 = ws.Range("A & CurRow)
    Var2 = ws.range("B" & Currow)
   now do whatever it is you need to do with the two variables
CurRow = CurRow + 1
Loop.

Это должно заставить вас работать с объектами и выполнять цикл.Проблема с Active что-либо в том, что то, что Excel считает активным, может не совпадать с тем, что вы думаете

Использование этой структуры позволяет добавлять дополнительные репликации без изменения кода.

Ваша проблема спеременные МОГУТ быть связаны с & и ""

Код подобный этому

"do something with Var1 and Var2" won't work

"do something with '" & Var1 & "' and " & Var2    May well do.

Обратите внимание на использование апострофа вокруг Var1 (строка), но не Var2 (число), а такжепробелы после с, и вокруг, и.

Это должно работать, если у Var1 нет апострофа (как имя O'Grady.)

Надеюсь, этого достаточно, чтобы помочь

Если вы работаете с несколькими листами в одной рабочей книге, присвойте объект каждому листу.

Например, у вас может быть список на одном листе, и вы хотите поместить результат на другом.

Set wsDriver as wb.worksheets("Scan List")
Set wsSrc = wb.worksheets("SourceData")
Set wsDest = anotherworkbook.worksheets("December Output") 

wsDriver идентифицирует что-то общее, возможно, список данных клиентов.

wsSrc будет содержать данные, с которыми вам нужно что-то делать,

wsData может быть выводом вполностью отличаетсяарендовать файл Excel.

Но как только вы определили этот объект, вы можете УВИДЕТЬ, с каким листом вы работаете, когда вы кодируете, и становится намного проще вкладывать циклы и следовать коду ((IMO)

В большинстве случаев не имеет значения, что Excel считает «активным», что означает, что при отладке вы можете приостановить код и выглядеть как листы без беспокойства.

0 голосов
/ 18 декабря 2018

@ SiddharthRout Обновили его (спасибо за ссылки) - у меня есть рабочий цикл, установлены переменные и т. Д., Но значения не анализируются в вызове API - только имя переменной

При создании строки переменная в конечном итоге ведет себя как строка, а не как переменная.

Это то, что вы пытаетесь?( НЕПРОВЕРЕНО )

ActiveWorkbook.Queries.Add Name:="scan-result", Formula:= _
"let" & Chr(10) & _
"    Source = Json.Document(Web.Contents(""https://api.mcafeesecure.com/api/v1/scan-result.json?targetId=" & _
TargetID & _
"scanId=" & _
ScanID & Chr(34) & _
", [Headers=[#""x-apikey""=""mykeyhere""]]))," & _
Chr(10) & _
"    scan = Source[scan]," & Chr(10) & _
"    #""Converted to Table"" = Record.ToTable(scan),"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...