【问题标题】:EXCEL - VBA . Getting the cell values as Key Value PairsEXCEL-VBA。获取单元格值作为键值对
【发布时间】:2016-03-07 17:53:38
【问题描述】:

我正在尝试从“I”列的 excel 单元格中获取地址值,并将其作为查询字符串传递给使用 VBA 的 URL。已在 excel 中嵌入“Microsoft 对象浏览器”以加载页面。

这甚至可能吗?因为我担心作为查询字符串传递的数据量太高(大约 1000 行)。

虽然代码不起作用,有什么方法可以通过将查询字符串作为数组传递来做同样的事情吗?

我还需要 VBA 语法来解析字典值。

我是 VBA 新手。请帮忙。

    Dim Arr() As Variant ' declare an unallocated array.
Arr = Range("I:I") ' Arr is now an allocated array
Set dict = CreateObject("Scripting.Dictionary")
Dim iRow As Integer
iRow = 1
 Dim parms As Variant
   Dim rg As Range
    For Each rg In Sheet1.Range("I:I")
        ' Print address of cells that are negative
        'MsgBox (rg.Value)
         'result = result & rg.Value
          dict.Add rg.Value
          iRow = (iRow + 1)        
    Next
MsgBox (dict.Item(1))
Set dict = Nothing
'WebBrowser1.Navigate2 "http://localhost/excelmaps/maps.php?adr=" & parms
End Sub

【问题讨论】:

    标签: excel vba dictionary


    【解决方案1】:

    发生了很多事情,所以我将尝试解决字典部分,因为那是您标记的内容。

    首先用字典,你可以添加一个项目如下:

    dict(“your key”) = “your value”
    

    我看到您已正确设置字典,并且始终确保在运行代码之前在 VBA 编辑器中添加字典引用(转到工具->引用-> Microsoft 脚本运行时)

    在这种情况下,您的键值似乎是增量整数。那么为什么不直接使用数组呢,如下面的代码呢?

    另一个问题是循环整个列(所有 > 100 万行)会产生溢出错误。也许开始手动指定要在 for 循环中循环的行(参见“rowsToLoop”变量):

    Sub der()
    
    Dim rowsToLoop As Integer
    rowsToLoop = 1000
    
    Dim Arr() As Variant 'define empty array
    ReDim Arr(rowsToLoop) 'redefine with variable length
    
    Dim dict As Dictionary
    Set dict = CreateObject("Scripting.Dictionary")
    
    Dim x As Integer
    
    For x = 1 To rowsToLoop
    
        'With an array
        Arr(x - 1) = Sheet1.Range("I1").Cells(x, 1).Value 'note array index starts at 0
    
        'With a dictionary
        dict(x - 1) = Sheet1.Range("I1").Cells(x, 1).Value
    Next x
    
    MsgBox "This is from array: " & Arr(1)
    MsgBox "This is from dictionary: " & dict(1)
    
    End Sub
    

    【讨论】:

    • 很好的帮助感谢 oortCloud!
    【解决方案2】:

    好像 IE 的最大 URL 长度是 2083 个字符:

    https://support.microsoft.com/en-us/kb/208427

    要构建查询,我将使用字符串构建器(“System.Text.StringBuilder”)。 您还需要对所有参数进行 URL 编码。

    这是一个使用范围 [A1:B10] 中的名称/值构建 url 的示例:

    Sub BuildURL
      ' Read the names/values from a sheet
      Dim names_values()
      names_values = [A1:B10].Value2
    
      ' Create a string builder
      Dim sb As Object
      Set sb = CreateObject("System.Text.StringBuilder")
      sb.Append_3 "http://localhost/excelmaps/maps.php"
    
      ' Build the query
      Dim i&, name$, value$
      For i = 1 To UBound(names_values)
        name = names_values(i, 1)
        value = names_values(i, 2)
    
        If i = 1 Then sb.Append_3 ("?") Else sb.Append_3 ("&")
        sb.Append_3 URLEncode(name) ' Adds the name
        sb.Append_3 "="
        sb.Append_3 URLEncode(value) ' Adds the value
      Next
    
      ' Print the result
      Debug.Print sb.ToString()
    End Sub
    
    
    Public Function URLEncode(url As String, Optional space_to_plus As Boolean) As String
      Static ToHex(15), IsLiteral%(127), buffer() As Byte, bufferCapacity&
      Dim urlBytes() As Byte, bufferLength&, i&, u&, b&, space&
    
      If space_to_plus Then space = 32 Else space = -1
      If bufferCapacity = 0 Then GoSub InitializeOnce
      urlBytes = url
    
      For i = 0 To UBound(urlBytes) Step 2
        If bufferLength >= bufferCapacity Then GoSub IncreaseBuffer
    
        u = urlBytes(i) + urlBytes(i + 1) * 256&
        If u And -128 Then    ' U+0080 to U+1FFFFF '
          If u And -2048 Then ' U+0800 to U+1FFFFF '
            If (u And 64512) - 55296 Then ' U+0800 to U+FFFF '
              b = 224 + (u \ 4096):       GoSub WriteByte
              b = 128 + (u \ 64 And 63&): GoSub WriteByte
              b = 128 + (u And 63&):      GoSub WriteByte
            Else  ' surrogate  U+10000 to U+1FFFFF '
              i = i + 2
              u = ((urlBytes(i) + urlBytes(i + 1) * 256&) And 1023&) _
                + &H10000 + (u And 1023&) * 1024&
              b = 240 + (u \ 262144):       GoSub WriteByte
              b = 128 + (u \ 4096 And 63&): GoSub WriteByte
              b = 128 + (u \ 64 And 63&):   GoSub WriteByte
              b = 128 + (u And 63&):        GoSub WriteByte
            End If
          Else ' U+0080 to U+07FF '
            b = 192 + (u \ 64):    GoSub WriteByte
            b = 128 + (u And 63&): GoSub WriteByte
          End If
        ElseIf IsLiteral(u) Then  ' unreserved ascii character '
          buffer(bufferLength) = u
          bufferLength = bufferLength + 2
        ElseIf u - space Then  ' reserved ascii character '
          b = u: GoSub WriteByte
        Else  ' space character '
          buffer(bufferLength) = 43   ' convert space to +  '
          bufferLength = bufferLength + 2
        End If
      Next
    
      URLEncode = LeftB$(buffer, bufferLength)
      Exit Function
    
    WriteByte:
      buffer(bufferLength) = 37  '%
      buffer(bufferLength + 2) = ToHex(b \ 16)
      buffer(bufferLength + 4) = ToHex(b And 15&)
      bufferLength = bufferLength + 6
      Return
    IncreaseBuffer:
      bufferCapacity = UBound(buffer) * 2
      ReDim Preserve buffer(bufferCapacity + 25)
      Return
    InitializeOnce:
      bufferCapacity = 2048
      ReDim buffer(bufferCapacity + 25)
      For i = 0 To 9:    ToHex(i) = CByte(48 + i): Next  '[0-9]'
      For i = 10 To 15:  ToHex(i) = CByte(55 + i): Next '[A-F]'
      For i = 48 To 57:  IsLiteral(i) = True:  Next '[0-9]'
      For i = 65 To 90:  IsLiteral(i) = True:  Next '[A-Z]'
      For i = 97 To 122: IsLiteral(i) = True:  Next '[a-z]'
      IsLiteral(45) = True  ' - '
      IsLiteral(46) = True  ' . '
      IsLiteral(95) = True  ' _ '
      IsLiteral(126) = True ' ~ '
      Return
    End Function
    

    【讨论】:

    • 感谢您的宝贵时间!试试你的代码吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2020-11-21
    • 2016-03-16
    相关资源
    最近更新 更多