『コンパイルエラー、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
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.