先日、マクロについて質問をさせていただきました。
常に右側の列と左側の列のデータを比較して、右側の列のデータが多ければ「↑」マークを、同じなら「―」マークを、少なければ「↓」マークを表示させたいのです。
最初にデータを入れる列は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
No.4
- 回答日時:
一例です。
イベントプロシージャを利用して、データ入力都度、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
プライベートマクロをご教授いただきありがとうございます。大変便利ですね
いちいちマクロボタンを押さなくても、データ入力すれば矢印が表示されていくのでとてもわかりやすいです。
本当にありがとうございました。
No.3
- 回答日時:
考え方を整理するところから始めます。
比較するのは?
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
変数やプロシージャ名は日本語の方が分かり
易い。キーが打ち難いかも知れないが、後々を
考えると、日本語を使うべきと思います。
最後のステートメントはオブジェクトを解放する
ものです。このあと処理が続くような場合は
早めにメモリを解放して処理効率を向上させる
働きがあります。サンプルでは「このあと」が
ないので、省略してもかまいません。
日本語でのマクロを見るのは初めてでした。驚きです。
確かに入力がやっかいですが、私のようにマクロの素人にはすごくわかりやすくてありがたいです。
何度も見直しながら勉強させていただきます。
また、マクロ自体も、私の思っているとおりに働いてくれました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) A列B列C列 3 2023/04/26 18:11
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) VBA 罫線について B列3行目から21行毎にデータがはいります。 データがはいったらデータが入った 6 2022/11/15 17:22
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) なぜか正常にマクロが動いていない? 1 2022/11/03 07:56
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
B列の最終行までA列をオート...
-
VBAでのリスト不一致抽出について
-
Worksheets メソッドは失敗しま...
-
VBAを使って検索したセルをコピ...
-
Excelで、あるセルの値に応じて...
-
マクロ
-
指定月分の顧客データファイル...
-
VBA 何かしら文字が入っていたら
-
リストビューのコンボボックス
-
エクセルVBAで複数の条件を満た...
-
VBAで範囲を有するセルの記載位...
-
Excel vbaでアクティブなシート...
-
VBAの初心者なのですが、「並び...
-
繰り返しマクロについて
-
VBA勉強中です。教えて下さい。...
-
Excel(M365) Vlookup/セル反転(...
-
VBAで特定の範囲の入力が出来な...
-
Excel 複数列から語句を含む行...
-
VBA指定行削除
-
Worksheet_Change(ByVal Target...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
マクロ 最終列をコピーして最終...
-
VBAを使って検索したセルをコピ...
-
データグリッドビューの一番最...
-
URLのリンク切れをマクロを使っ...
-
VBAのFind関数で結合セルを検索...
-
【VBA】2つのシートの値を比較...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
Excel(M365) Vlookup/セル反転(...
-
VBA指定行削除
-
VBAでのリスト不一致抽出について
-
C# dataGridViewの値だけクリア
-
Changeイベントでの複数セルの...
-
VBAで、特定の文字より後を削除...
-
rowsとcolsの意味
おすすめ情報