1. ホーム
  2. excel

Excel VBAで文字列をURLエンコードする方法を教えてください。

2023-07-24 22:38:08

質問

Excel VBA で文字列を URL エンコードする組み込みの方法はありますか、それともこの機能を手作業で行う必要がありますか?

どのように解決するのですか?

いいえ、何も組み込まれていません ( Excel 2013 まで この回答を見る ).

の3つのバージョンがあります。 URLEncode() があります。

  • UTF-8をサポートした関数です。 おそらくこれを使うべきでしょう (または 代替の実装 by Tom)を使用することで、最新の要件と互換性を持たせることができます。
  • 参考と教育目的のために、UTF-8 をサポートしない 2 つの関数があります。
    • サードパーティの Web サイトで見つけたもので、そのまま含まれています。(これは回答の最初のバージョンでした)
    • 私が書いた、最適化されたバージョンの一つ

UTF-8 エンコーディングをサポートするバリアントは ADODB.Stream をサポートします (プロジェクトに "Microsoft ActiveX Data Objects" ライブラリの最新バージョンへの参照を含めてください)。

Public Function URLEncode( _
   ByVal StringVal As String, _
   Optional SpaceAsPlus As Boolean = False _
) As String
  Dim bytes() As Byte, b As Byte, i As Integer, space As String

  If SpaceAsPlus Then space = "+" Else space = "%20"

  If Len(StringVal) > 0 Then
    With New ADODB.Stream
      .Mode = adModeReadWrite
      .Type = adTypeText
      .Charset = "UTF-8"
      .Open
      .WriteText StringVal
      .Position = 0
      .Type = adTypeBinary
      .Position = 3 ' skip BOM
      bytes = .Read
    End With

    ReDim result(UBound(bytes)) As String

    For i = UBound(bytes) To 0 Step -1
      b = bytes(i)
      Select Case b
        Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
          result(i) = Chr(b)
        Case 32
          result(i) = space
        Case 0 To 15
          result(i) = "%0" & Hex(b)
        Case Else
          result(i) = "%" & Hex(b)
      End Select
    Next i

    URLEncode = Join(result, "")
  End If
End Function


この関数は で見つかりました。 :

Public Function URLEncode( _
   StringToEncode As String, _
   Optional UsePlusRatherThanHexForSpace As Boolean = False _
) As String

  Dim TempAns As String
  Dim CurChr As Integer
  CurChr = 1

  Do Until CurChr - 1 = Len(StringToEncode)
    Select Case Asc(Mid(StringToEncode, CurChr, 1))
      Case 48 To 57, 65 To 90, 97 To 122
        TempAns = TempAns & Mid(StringToEncode, CurChr, 1)
      Case 32
        If UsePlusRatherThanHexForSpace = True Then
          TempAns = TempAns & "+"
        Else
          TempAns = TempAns & "%" & Hex(32)
        End If
      Case Else
        TempAns = TempAns & "%" & _
          Right("0" & Hex(Asc(Mid(StringToEncode, _
          CurChr, 1))), 2)
    End Select

    CurChr = CurChr + 1
  Loop

  URLEncode = TempAns
End Function

少し入っていたバグを修正しました。


私なら、上記のより効率的な(~2倍速い)バージョンを使うでしょう。

Public Function URLEncode( _
   StringVal As String, _
   Optional SpaceAsPlus As Boolean = False _
) As String

  Dim StringLen As Long: StringLen = Len(StringVal)

  If StringLen > 0 Then
    ReDim result(StringLen) As String
    Dim i As Long, CharCode As Integer
    Dim Char As String, Space As String

    If SpaceAsPlus Then Space = "+" Else Space = "%20"

    For i = 1 To StringLen
      Char = Mid$(StringVal, i, 1)
      CharCode = Asc(Char)
      Select Case CharCode
        Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
          result(i) = Char
        Case 32
          result(i) = Space
        Case 0 To 15
          result(i) = "%0" & Hex(CharCode)
        Case Else
          result(i) = "%" & Hex(CharCode)
      End Select
    Next i
    URLEncode = Join(result, "")
  End If
End Function

これら二つの関数はどちらもUTF-8エンコーディングに対応していないことに注意してください。