dポイントプレゼントキャンペーン実施中!

先日、マクロについて質問をさせていただきました。
常に右側の列と左側の列のデータを比較して、右側の列のデータが多ければ「↑」マークを、同じなら「―」マークを、少なければ「↓」マークを表示させたいのです。
最初にデータを入れる列はD列7行目から30行目まで。次はE列に同じようににデータ入力した後ににマクロを実行します。これをM列7行目から30行目まで、列に新しいデータを入れるたびに毎回繰り返したいのです。 矢印マークは 常にN列に表示。
 で、以下のようなマクロを教えていただきましたが、このマクロだと 比較がされる列が、絶えずD列と、新しく入力した列になってしまいます。
先ほども書きましたが、比較する列は、D列とE列 それが終わったらE列とF列 次はF列とG列 というように常に右側とその直ぐ左側の列の比較をしたいのです。
もう一度 お教えいただきたいのですが、よろしくお願いいたします。
回答いただいたマクロを下に入れておきます。

Sub test()
Dim i, j, k As Long
Dim vl1, vl2 As Variant
For i = 4 To 30
If WorksheetFunction.Count(Range(Cells(i, 4), Cells(i, 13))) > 1 Then
j = 4
Do Until Cells(i, j) <> ""
j = j + 1
Loop
vl1 = Cells(i, j)
For k = 4 To 13
If Cells(i, k) <> "" Then
vl2 = Cells(i, k)
End If
Next k
If vl1 > vl2 Then
Cells(i, 14) = "↓"
ElseIf vl1 = vl2 Then
Cells(i, 14) = "→"
Else
Cells(i, 14) = "↑"
End If
Else
Cells(i, 14) = ""
End If
Next i
End Sub

A 回答 (4件)

Do Until Cells(i, j) <> ""を


Do While Cells(i, j) <> ""に
vl1 = Cells(i, j)を
vl1 = Cells(i, j - 2)に修正してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました。

N列の項目まで矢印に変わってしまうで、ちょっと困っていましたが、それも解決しました。

本当にありがとうございました。

お礼日時:2012/02/08 17:58

一例です。


イベントプロシージャを利用して、データ入力都度、N列に反映させる様に
しては如何でしょうか。
対象シートタブ上で右クリック→コードの表示→サンプルコードの貼り付けてお試しください。

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("E7:M30")) Is Nothing Then Exit Sub
For Each a In Target
wk = ""
If a <> "" Then
If a.Offset(0, -1).Value <> "" Then
Select Case a.Offset(0, -1)
Case Is = a: wk = "-"
Case Is < a: wk = "↑"
Case Is > a: wk = "↓"
End Select
End If
End If
Cells(a.Row, "N") = wk
Next
End Sub
    • good
    • 0
この回答へのお礼

プライベートマクロをご教授いただきありがとうございます。大変便利ですね
いちいちマクロボタンを押さなくても、データ入力すれば矢印が表示されていくのでとてもわかりやすいです。
本当にありがとうございました。

お礼日時:2012/02/08 17:51

考え方を整理するところから始めます。


比較するのは?
D~M列までの最も右側とその1列前のセル
ということで、以下のようになるでしょう。

Sub サンプル()
Dim シート As Worksheet
Dim 行 As Long
Dim 列 As Long
Dim 今週, 先週
Dim 記号 As String
'★必ずターゲットを明示的にする
Set シート = ThisWorkbook.Worksheets("売上記録")
'★7行目から30行目まで処理する
For 行 = 7 To 30
    '★最も右側の列を求める
    For 列 = 13 To 4 Step -1
        If シート.Cells(行, 列) <> "" Then Exit For
    Next
    '★記号を初期化する
    記号 = ""
    '★最も右側の列が5以上の場合のみ処理する
    If 列 > 4 Then
        '★値を求める
        今週 = シート.Cells(行, 列)
        先週 = シート.Cells(行, 列 - 1)
        '★記号を設定する
        If 今週 > 先週 Then 記号 = "↑"
        If 今週 = 先週 Then 記号 = "→"
        If 今週 < 先週 Then 記号 = "↓"
    End If
    '★記号をN列に記録する
    シート.Cells(行, 14) = 記号
Next
'★オマジナイ(やらなくてもよい)
Set シート = Nothing
End Sub

変数やプロシージャ名は日本語の方が分かり
易い。キーが打ち難いかも知れないが、後々を
考えると、日本語を使うべきと思います。

最後のステートメントはオブジェクトを解放する
ものです。このあと処理が続くような場合は
早めにメモリを解放して処理効率を向上させる
働きがあります。サンプルでは「このあと」が
ないので、省略してもかまいません。
    • good
    • 0
この回答へのお礼

日本語でのマクロを見るのは初めてでした。驚きです。
確かに入力がやっかいですが、私のようにマクロの素人にはすごくわかりやすくてありがたいです。

何度も見直しながら勉強させていただきます。
また、マクロ自体も、私の思っているとおりに働いてくれました。

ありがとうございました。

お礼日時:2012/02/08 17:54

ANo.1です。


For i = 4 To 30のところは
7行目から30行目までということなので
For i = 7 To 30
だと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。思い通りに働いてくれました。

これからもご指導よろしくお願いします。

お礼日時:2012/02/08 17:56

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