プロが教えるわが家の防犯対策術!

前回 質問させていただいた ものの追加質問になるんですが

このようなCSVデータがありまして
A列の重複したデータをひとつにまとめて 1から順に並び替えて
行ごとに
別のワークブックのテンプレートに表示させるところまでは前回の質問で
解決したんですが

その際、CSVデータの中の
C列は最も小さい値を選択して 0~1は 小、1~3 は 大
というように別の文字変換させて表示させる。
D列は最も大きい値を表示させる というようなマクロが組みたいんですが

どのようなマクロを組めばいいのでしょうか?

「CSVのデータから条件を指定して別のワー」の質問画像

A 回答 (5件)

こんばんは!



https://oshiete.goo.ne.jp/qa/10124231.html

 ↑のサイトの関連質問ですね。

>C列は最も小さい値を選択して 0~1は 小、1~3 は 大

ピッタリ「1」の場合はどちらになるのでしょうか?
とりあえず、「1以下」が「小」、「1より大きい場合」が「大」としてみました。

尚、前回同様でSheet1にはすでに画像のような配置でデータがあり、Sheet2の6行目以降に表示するとします。

Sub Sample4()
Dim myDic As Object
Dim myKey, myItem, myR, myAry
Dim i As Long, lastRow As Long, myN As String, wS As Worksheet

Set myDic = CreateObject("Scripting.Dictionary")
Set wS = Worksheets("Sheet2")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 5 Then
Range(wS.Cells(6, "A"), wS.Cells(lastRow, "Q")).ClearContents
End If
With Worksheets("Sheet1")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(.Cells(1, "A"), .Cells(lastRow, "E"))
For i = 1 To UBound(myR, 1)
myN = myR(i, 1)
If Not myDic.exists(myN) Then
myDic.Add myN, myR(i, 2) & "_" & myR(i, 3) & "_" & myR(i, 4) & "_" & myR(i, 5)
Else
myAry = Split(myDic(myN), "_")
myDic(myN) = myAry(0) & "_" & WorksheetFunction.Min(myR(i, 3), myAry(1)) & "_" & _
WorksheetFunction.Max(myR(i, 4), myAry(2)) & "_" & myAry(3)
End If
Next i
End With
myKey = myDic.keys
myItem = myDic.items
myR = Range(wS.Cells(6, "A"), wS.Cells(UBound(myKey) + 6, "Q"))
For i = 0 To UBound(myKey)
myAry = Split(myItem(i), "_")
myR(i + 1, 1) = myKey(i)
myR(i + 1, 4) = myAry(0)
If myAry(1) <= 1 Then '//★等号は不要か?//
myR(i + 1, 10) = "小"
Else
myR(i + 1, 10) = "大"
End If
myR(i + 1, 14) = myAry(2)
myR(i + 1, 17) = myAry(3)
Next i
Range(wS.Cells(6, "A"), wS.Cells(UBound(myKey) + 6, "Q")) = myR
Set myDic = Nothing
wS.Activate
MsgBox "完了"
End Sub

※ 「1未満」が「小」の場合はコード内の「★」の行の等号を消してください。

尚、前回最後に並び替えのコードを記載していましたが、
Sheet2の方はセル結合があるのですかね?
セル結合があるとソートできないはずなので、
今回は並び替えは考慮していません。m(_ _)m
    • good
    • 0
この回答へのお礼

回答ありがとうございます

私が考えてたととおりにうまくできました 完璧です

tom04さんの言ったように、私も思って セル結合はずしました
並び替えもそ後ろにくっつけたら うまくいきました

ほんとに助かりました

お礼日時:2017/12/14 11:52

No.4です。



書き忘れたコトが・・・
画像のC列はおそらく文字列になっていると思います。
その場合、大小の区別が難しいのでC列のセルの表示形式をユーザー定義から
0.0"mm"
としておき、小数点以下第一位まで表示させるようにしてください。

※ 入力は 1 とか 2 のように数値のみの入力にします。m(_ _)m
    • good
    • 0

#2です。



提示したマクロは、#1にも書きましたが、単に、セルに関数式を設定しているだけのものです。
(右辺が関数式にあたります。関数式そのものは文字列として設定します。)
それなので、別シートを参照したい場合は、通常の関数で別シートを参照する時と同じように式の内容を修正すれば可能です。
例えば「C:C」となっている部分を「シート名!C:C」のように修正すれば良いです。

とは言え、
>別ワークブックの別シートの中の例えば 6行目のJ列から
>順に結果を表示したいとすると
複数セルに表示するという意味でしょうか?
私の理解では「C列は最も小さい値を選択して0~1は小、1~3は大」なので、結果はひとつしかないはずですから、複数セルに記述しても同じ値が並ぶだけだと思いますが・・・

どこかで、勘違いしているのかなぁ??
    • good
    • 0
この回答へのお礼

回答ありがとうございます

すいません 言葉足らずです
A列の同番号のなかから選択して、A列の番号毎に表示させたかったんです

お礼日時:2017/12/14 11:44

こんんちは



処理の内容が不明なのでなんとも言えませんが・・・


C列の単位表示は書式で行っていて、実際の値は数値と仮定します。
マクロで計算してもできますが、関数式を設定してしまうのが簡単かと思います。

C列の結果を表示をしたいセルに対して
対象セル.FormulaLocal = "=IF(MIN(C:C)<0,""他"",IF(MIN(C:C)<1,""小"",IF(MIN(C:C)<3,""大"",""他"")))"

同様に、D列の結果を表示したいセルに対して
対象セル.FormulaLocal = "=MAX(D:D)"

を実行しておけばよろしいかと。

※ 上記の関数式は、それぞれC列、D列全体が対象になっていますので、表示したいセルがC列やD列にある場合には、そのセルを外した範囲設定にしないと、循環参照になりますのでご注意。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

すいません 質問です
C列の結果を表示をしたいセルが
別ワークブックの別シートの中の例えば 6行目のJ列から
順に結果を表示したいとすると
それぞれ どういうマクロにかえればいいのでしょうか

お礼日時:2017/12/13 15:53

必ず数字が入っている上で単位が付与されているならば、以下のようにすれば数字で処理できます。



Public Sub test()
Dim a As String

a = "0.2mm"

Dim b As Currency
b = Val(a)

MsgBox CStr(b) ' 0.2

If b >= 0 And b < 1 Then
MsgBox "小"
End If

If b >= 1 And b < 3 Then
MsgBox "大"
End If

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます

お礼日時:2017/12/14 11:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!