判定列と入力されている列からに入力された値の列を取得し、取得した配列をJoin(judge_element, ", ")にて区切って文字列として変数に代入して、RemoveDuplicatesメソッドが動作するように認識させたいです。。。
現状:.Range("A3:G" & LastRow).RemoveDuplicates (Array(arry_num))ここの行で(型が一致しませんとエラーがでてしまいます。)
どのようにしたら型が一致するのですしょうか?
Dim
1 Dim judge_result() As Variant 2 Dim j_k As Integer 3 Dim arry_num As String 4 5 6 judge_element = judge_elements 7 8 arry_num = Join(judge_element, ", ") 9 10 "arry_numの中身は”2, 4, 6”です" 11 12 13 14 '重複を削除 15 .Range("A3:G" & LastRow).RemoveDuplicates (Array("arry_num")) 16 17Function judge_elements() 18 Dim rngTable As Range '表のセル範囲 19 Dim flg As Boolean 'フラグが1個も立ってないかのチェック 20 Dim vntIndex() As Variant 'フラグが立っている列番号の配列 21 22 Set rngTable = Worksheets("Sheet2").Range("A1").CurrentRegion 23 flg = GetArrayOfNumbers2(rngTable, vntIndex) 24 If flg = False Then Exit Function 25 26 judge_elements = vntIndex 27 'rngTable.RemoveDuplicates vntIndex 28End Function 29 30Function GetArrayOfNumbers2(ByRef Rng As Range, _ 31 ByRef ixResult() As Variant) As Boolean 32 Dim rngFlag As Range 33 Dim c As Range 34 Dim i As Long 35 36 i = Rng.Columns.Count 37 ReDim ixResult(0 To i - 1) 38 On Error Resume Next 39 Set rngFlag = Rng.Rows(1).SpecialCells(xlCellTypeConstants) 40 On Error GoTo 0 41 If rngFlag Is Nothing Then Exit Function 42 43 i = 0 44 For Each c In rngFlag.Columns 45 ixResult(i) = c.Column 46 i = i + 1 47 Next 48 49 ReDim Preserve ixResult(0 To i - 1) 50 GetArrayOfNumbers2 = True 51End Function 52 53
| | 判定 | 判定 | 判定 | | 判定 | | |---|------|----------|--------|----------|------|--------| | | A | B | C | D | E | F | | 1 | 1111 | りんご | 国産 | 青森 | 100 | A商店 | | 2 | 1111 | りんご | 国産 | 青森 | 100 | B商店 | | 3 | 1111 | りんご | 外国産 | 和歌山 | 100 | C商店 | | 4 | 2222 | みかん | 国産 | 愛媛 | 500 | A商店 | | 5 | 3333 | マンゴー | 国産 | 沖縄 | 50 | C商店 | | 6 | 3333 | マンゴー | 国産 | 宮崎 | 50 | FG商店 | | 7 | 3333 | マンゴー | 外国産 | メキシコ | 800 | D商店 ||列2|列3| | ||||
判定という文字が列番号の上に来てますけど、
コードを動かす前にどうやって、それを指定するのですか?
単に列を選択するか、
セルにフラグを立てるか、
がいいかとは思いますが。。。
それから、そもそも、タイトル行は無いのですか?
エクセル的にはタイトル行があった方がなにかと便利かとは思います。
ぱっとみて気になったので
> 'Sheet2のA列の値をクリア
> For d_i = 3 To LastRow
> Worksheets("sheet2").Cells(d_i, 1) = ""
> Next d_i
↑そもそも値のクリアになってません。
長さ0の文字列を入れて見た目空白にしているだけです。
Worksheets(1).UsedRange.Columns(1).ClearContents
これで,
「左から1番目のシートの使っているセル範囲の1列目の値(数式も含む)のクリア」
という意味になります。(英語が苦手なので誤字があるかもしれません。)
ご丁寧にご指摘ありがとうございます。
うまく説明できなくて申し訳ありません。
判定という文字を ABCDEGの任意の場所に打ち込み、ケースバイケースで処理をするのに、
63パターンの処理をちまちま書かないで条件処理でうまくスマートに処理を行えないかということです。
今現状のボキャブラリーと引き出しではそのようにしか説明できません。
エクセルタイトルに関しましては、このような実装するにはどうすればいいかという案件をいただいているので本人がつけるかと思います。
力技で
If Buf(i, 2) = Result(j, 2) _
And Buf(i, 3) = Result(j, 3) _
And Buf(i, 4) = Result(j, 4) _
And Buf(i, 6) = Result(j, 6) Then
63 パターン書いてそれに紐づくSub put_together(j, k, i, Result, Buf, Flag, d_Flag, Store_Array() As String)
'=============G列=======
Store_Array = Split(Result(j, 7), "/") '現在取得済みの商店を/区切りで配列に分割
'フラグを立てておき、
'現在取得済みの商店と一致していたらフラグを外す
Flag = True
For k = 0 To UBound(Store_Array)
If Store_Array(k) = Buf(i, 7) Then
Flag = False
End If
Next
If Flag Then 'フラグが立っていたら
Result(j, 7) = Result(j, 7) & "/" & Buf(i, 7)
End If
'=============D列=======
Store_Array = Split(Result(j, 5), "/") '現在取得済みの商店を/区切りで配列に分割
'フラグを立てておき、
'現在取得済みの商店と一致していたらフラグを外す
d_Flag = True
For k = 0 To UBound(Store_Array)
If Store_Array(k) = Buf(i, 5) Then
d_Flag = False
End If
Next
If d_Flag Then 'フラグが立っていたら
Result(j, 5) = Result(j, 5) & "/" & Buf(i, 5)
End If
を片っ端から書いていくことしかおもいつかないといったところです。。。
回答4件
あなたの回答
tips
プレビュー