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-10-30 17:32:14 )