[[20250511095825]] 『コンパイルエラー、ByRef引数の型が一致しない』(ごろはす) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『コンパイルエラー、ByRef引数の型が一致しない』(ごろはす)

Sub 並び替え_プルダウン優先_3数字昇順()

    Dim wsForm As Worksheet, wsList As Worksheet
    Dim dropList As Variant
    Dim lastRow As Long, i As Long, j As Long, k As Long
    Dim rawData As Variant
    Dim sortedList As New Collection
    Dim entry As Variant, temp As Variant

    Set wsForm = Worksheets("Sheet1")
    Set wsList = Worksheets("Sheet2")

    ' プルダウン取得
    On Error Resume Next
    dropList = Evaluate(wsForm.Range("B4").Validation.Formula1)
    On Error GoTo 0

    If IsEmpty(dropList) Then
        MsgBox "B4に有効なプルダウンが設定されていません", vbExclamation
        Exit Sub
    End If

    ' Sheet2 データ取得
    lastRow = wsList.Cells(wsList.Rows.Count, 1).End(xlUp).Row
    If lastRow < 2 Then
        MsgBox "Sheet2 にデータがありません", vbExclamation
        Exit Sub
    End If

    ' 1行だけのときも2次元配列として扱えるようにする
    If lastRow - 1 = 1 Then
        rawData = Application.Transpose(Application.Transpose(wsList.Range("A2:C2").Value))
    Else
        rawData = wsList.Range("A2:C" & lastRow).Value
    End If

    ' プルダウン順に一致する住所をグループごとに取得・ソート
    For i = LBound(dropList) To UBound(dropList)
        Dim groupItems As New Collection
        For j = 1 To UBound(rawData, 1)
            If Left(rawData(j, 1), Len(dropList(i))) = dropList(i) Then
                Dim nums As Variant
                nums = ExtractThreeNumbers(rawData(j, 1))       ☆左のrawDataに青線がひかれます
                groupItems.Add Array(nums(0), nums(1), nums(2), rawData(j, 1), rawData(j, 2), rawData(j, 3))
            End If
        Next j

        ' 3つの数字でソート
        If groupItems.Count > 1 Then
            For j = 1 To groupItems.Count - 1
                For k = j + 1 To groupItems.Count
                    Dim cmpA As Variant, cmpB As Variant
                    cmpA = groupItems(j)
                    cmpB = groupItems(k)
                    If CompareTriple(cmpA, cmpB) > 0 Then
                        temp = groupItems(j)
                        groupItems.Remove j
                        groupItems.Add groupItems(k - 1), , j
                        groupItems.Remove k
                        groupItems.Add temp, , k
                    End If
                Next k
            Next j
        End If

        ' ソート結果をまとめて追加
        For Each entry In groupItems
            sortedList.Add Array(entry(3), entry(4), entry(5))
        Next entry
    Next i

    ' 結果出力
    wsList.Range("A2:C" & lastRow).ClearContents
    If sortedList.Count > 0 Then
        ReDim outputArr(1 To sortedList.Count, 1 To 3)
        For i = 1 To sortedList.Count
            For j = 1 To 3
                outputArr(i, j) = sortedList(i)(j - 1)
            Next j
        Next i
        wsList.Range("A2").Resize(sortedList.Count, 3).Value = outputArr
        MsgBox "並び替え完了しました!", vbInformation
    End If

End Sub

' 住所から最大3つの数字を抽出(例:"4-2-3" → Array(4, 2, 3))
Function ExtractThreeNumbers(text As String) As Variant

    Dim reg As Object
    Dim matches As Object
    Set reg = CreateObject("VBScript.RegExp")
    reg.Pattern = "\d+"
    reg.Global = True

    Dim result(0 To 2) As Long
    result(0) = 99999: result(1) = 99999: result(2) = 99999

    If reg.test(text) Then
        Set matches = reg.Execute(text)
        Dim i As Long
        For i = 0 To Application.Min(2, matches.Count - 1)
            result(i) = CLng(matches(i))
        Next i
    End If

    ExtractThreeNumbers = result
End Function

' 3つの数字の比較(昇順)
Function CompareTriple(a As Variant, b As Variant) As Long

    Dim i As Long
    For i = 0 To 2
        If a(i) <> b(i) Then
            CompareTriple = a(i) - b(i)
            Exit Function
        End If
    Next i
    CompareTriple = 0
End Function

右も左も全く分からない素人です人工知能に要望するマクロを組んで貰ったのですが上手く行きません💦
有識者の方 どうかご教授願います。

< 使用 Excel:unknown、使用 OS:unknown >


 > nums = ExtractThreeNumbers(rawData(j, 1)) 
 ここで、rawDataを渡していますが、rawDataはVariant型ですよね?

 一方、渡される方は、String型を期待しているので、型不一致と言われたんじゃないですか?
 >Function ExtractThreeNumbers(text As String) As Variant
                     ↑

                     ↓としてみたらどうですか?
 Function ExtractThreeNumbers(text As Variant) As Variant

(半平太) 2025/05/11(日) 10:20:19


コメントありがとうございます!
そのように変更しましたが次は
For i = LBound(dropList) To UBound(dropList)
ここが実行時エラー13、型が一致しませんで黄色く表示されます💦
(ごろはす) 2025/05/11(日) 10:40:15

 droplist 変数の中身を確認してみてください。

 なお、先ほど提示されたコードですが、・・・・と LLMに再度質問したらいいですよ。
 結構、マメに答えを返してきます。(正しいかどうかは保証されませんが)
 トライしてみて下さい。

(xyz) 2025/05/11(日) 11:18:29


 ByRef ではなく ByVal渡しにしてください。

 Function ExtractThreeNumbers(ByVal text As String) As Variant
(jindon) 2025/05/11(日) 12:19:52

 途中でやめてしまうとは思っていませんでした。メモしておいたものを書いておきます。

 (1)
 > droplist 変数の中身を確認してみてください。
 というのは、入力規則(ドロップダウンリスト)の設定の方法で結果が変わるからです。

 ・セル範囲を指定した場合
   この場合、dropListには二次元配列が返ります。
   そのFor文ではエラーになりませんが、dropList(i)とindex指定したときにエラーになると思います。

 ・"東京,埼玉,神奈川"のようなカンマ区切りの文字列を指定した場合は、
   dropListにはエラー値が返り(文字列を評価するような仕組みをVBAは持ち合わせていないため)、
   エラー値にはUBOUNDもLBOUNDもないのでエラーが発生します。多分こちらのケースでしょう。
   Split(wsForm.Range("B4").Validation.Formula1,",")のようにして1次元配列にする必要があります。

 (2)
 また、提示されたコードでは、Collectionを使っていますが、
 Collectionは、「格納済みのデータをindexを保持したまま更新できない」という特徴があり、
 このケースでは、Collectionを使うのは不適当、悪手です。
 配列か、dictionaryを使うべきです。
 そのようにLLMに伝えて、改善したコードを要望して下さい。

 # たぶん、chatGPTとかCopilotは、他の言語の構文を内部的にVBAに変換していると思いますが
 # Collectionの性質が十分に学習できていないように思います。
(xyz) 2025/05/17(土) 08:35:57

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.