[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コンパイルエラー、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.