Excel VBA 質問スレッド №2109 (解決済)
セル結合判定
投稿者 : じょんとらぼるた 投稿日時 : 2025/04/18(Fri) 00:33:45 OS : 未指定 EXCEL : 未指定
すいません教えてください。
例えば下記画像のように、A列とD列の日付が一致したら、B列をループし、セルが結合されている場合のセルの値が2の場合は値を1/2し、転記先(E列)に1/2した値を転記する。
セルが結合されている場合のセルの値が1の場合は値をそのまま、転記先(E列)に転記する。
通常のセルはセルの値をそのまま転記先(E列)に転記する。
画像:https://ibb.co/xt8VyxfB
このようなことを行うvbaで行うことは可能なのでしょうか?
もし可能でしたらコードを教えていただきたいです。
vba詳しい方いらっしゃれば何卒よろしくお願いします。
すいません教えてください。
例えば下記画像のように、A列とD列の日付が一致したら、B列をループし、セルが結合されている場合のセルの値が2の場合は値を1/2し、転記先(E列)に1/2した値を転記する。
セルが結合されている場合のセルの値が1の場合は値をそのまま、転記先(E列)に転記する。
通常のセルはセルの値をそのまま転記先(E列)に転記する。
画像:https://ibb.co/xt8VyxfB
このようなことを行うvbaで行うことは可能なのでしょうか?
もし可能でしたらコードを教えていただきたいです。
vba詳しい方いらっしゃれば何卒よろしくお願いします。
スポンサーリンク
[返信 1] Re : セル結合判定
投稿者 : 例えば 投稿日時 : 2025/04/18(Fri) 07:02:24
とりあえず以下でどうですか?
添付画像の8月13日は、E14は1ですよね?
(セルが結合されている場合のセルの値が1の場合は値をそのまま、転記先(E列)に転記する。)
とりあえず以下でどうですか?
添付画像の8月13日は、E14は1ですよね?
(セルが結合されている場合のセルの値が1の場合は値をそのまま、転記先(E列)に転記する。)
Sub 転記処理() Dim lastRowA As Long, lastRowD As Long Dim i As Long, j As Long Dim matchDate As Date Dim bValue As Variant Dim isMerged As Boolean Dim mergedRows As Long ' 最終行の取得 lastRowA = Cells(Rows.Count, "A").End(xlUp).Row lastRowD = Cells(Rows.Count, "D").End(xlUp).Row ' D列をループ For i = 1 To lastRowD If IsDate(Cells(i, "D").Value) Then matchDate = Cells(i, "D").Value ' A列をループして一致する日付を探す For j = 1 To lastRowA If IsDate(Cells(j, "A").Value) Then If Cells(j, "A").Value = matchDate Then ' B列の値取得 With Cells(j, "B") bValue = .Value isMerged = .MergeCells ' セルが結合されている場合の処理 If isMerged Then mergedRows = .MergeArea.Rows.Count ' 値が2の場合は1/2して転記 If bValue = 2 Then Cells(i, "E").Value = bValue / 2 ' 値が1の場合はそのまま転記 ElseIf bValue = 1 Then Cells(i, "E").Value = bValue ' その他の値はそのまま Else Cells(i, "E").Value = bValue End If ' 結合されていない場合はそのまま Else Cells(i, "E").Value = bValue End If End With Exit For ' 一致が見つかれば次のD行へ End If End If Next j End If Next i MsgBox "転記が完了しました!" End Sub
[返信 2] Re : セル結合判定
投稿者 : てらてら 投稿日時 : 2025/04/18(Fri) 07:13:09
こんにちは。
結合セルは、Cells(***, ***).MergeCells で判断できます。
参考にしてみてください。
(ちょっ時間がないので見直してないです。間違ってたらごめんなさい。)
こんにちは。
結合セルは、Cells(***, ***).MergeCells で判断できます。
参考にしてみてください。
(ちょっ時間がないので見直してないです。間違ってたらごめんなさい。)
Sub macro() Dim i As Long, j As Long, v As Long Dim myDay Dim b As Boolean b = False For i = 2 To ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row myDay = Cells(i, "A") If Cells(i, "B").MergeCells = True Then If b = False Then b = True v = Cells(i, "B") If v = 2 Then v = 1 'セルの値が2の場合は値を1/2 (セルの値が1の場合は値をそのまま) For j = 2 To ActiveSheet.Cells(Rows.Count, "D").End(xlUp).Row If Cells(j, "D") = myDay Then Cells(j, "E") = v Exit For End If Next j Else b = False End If Else b = False For j = 2 To ActiveSheet.Cells(Rows.Count, "D").End(xlUp).Row If Cells(j, "D") = myDay Then Cells(j, "E") = Cells(i, "B") Exit For End If Next j End If Next i End Sub
[返信 3] Re : セル結合判定
投稿者 : ピロリ 投稿日時 : 2025/04/18(Fri) 23:06:59
一案です。 参考になれば・・・
一案です。 参考になれば・・・
Sub Sample() Dim i As Long, r As Range For i = 2 To Cells(Rows.Count, "D").End(xlUp).Row Set r = Columns("A").Find(What:=Cells(i, "D"), LookAt:=xlWhole) '日付の検索 If Not r Is Nothing Then '一致する日付が存在した場合 If r.Offset(0, 1).MergeCells = True Then 'その右側(B列)がセル結合なら Select Case r.Offset(0, 1) Case 1 Cells(i, "E") = r.Offset(0, 1) 'その値をE列へ転記 Case 2 Cells(i, "E") = r.Offset(0, 1) / 2 'その値の1/2をE列へ転記 Case Else End Select Else 'セル結合されてないなら Cells(i, "E") = r.Offset(0, 1) 'そのままE列へ転記 End If End If Next i End Sub
[返信 4] Re : セル結合判定
投稿者 : jindon 投稿日時 : 2025/04/19(Sat) 13:16:18
もしB列の同じ日付の行のC列が必ず結合されているなら
もしB列の同じ日付の行のC列が必ず結合されているなら
Sub test() Dim r As Range, c As Range, x Set r = [b2].CurrentRegion For Each c In [e2].CurrentRegion.Columns(1).Cells x = Application.VLookup(c, r, 2, False) If IsError(x) Then c(, 2) = "" ElseIf (x = Empty) + (x < 2) Then c(, 2) = x Else c(, 2) = x / WorksheetFunction.CountIf(r.Columns(1), c) End If Next End Sub
[返信 5] Re : セル結合判定
投稿者 : じょんとらぼるた 投稿日時 : 2025/04/19(Sat) 19:39:35
教えてくださった皆さんありがとうございます。
様々なやり方があるんだなと勉強になりました。
ありがとうございます。
教えてくださった皆さんありがとうございます。
様々なやり方があるんだなと勉強になりました。
ありがとうございます。
当掲示板について
- Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
- 記事内ではHTMLのタグは使用できません。
- 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
- Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
- Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
( 処理日時 : 2025-07-03 18:26:26 )