• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:結合されたセルの一覧出力 VBA)

VBAで結合されたセルの一覧出力方法とは?

このQ&Aのポイント
  • VBAを使用して、結合されたファイルの一覧を出力する方法について説明します。セルの結合範囲を検索し、内容が日付であるかどうかを確認し、日付の場合は行数を取得することができます。
  • 具体的には、B列とH列で結合セル範囲が異なる場合でも、結合セル以外の行数を取得する方法を説明します。また、フォームの変更にも対応できるように、日付の確認を行い、行数を使用する方法を紹介します。
  • この方法を使用することで、VBAで結合されたセルの一覧を取得し、日付を含む行数を検索することができます。フォームの変更にも対応しているため、柔軟に利用することができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.4

通常,結合したセル(しかも不定数)がばらばら混じってるとコピーとかできない(するとコピー元がずれる)ので,生データで日付を所定の(結合された/されてない)セルに記入してるという前提で回答してました。 回答の前提をイチイチ説明してなかったのは申し訳なかったですね。 生データの日付に加えて+1の数式をチマチマ手で記入してたという事でしたら,たとえば次のように。 sub macro1r2()  dim Target as range  dim h as range  dim flg as boolean  on error resume next  set target = range("B1")  set target = union(target, range("B:B,H:H").specialcells(xlcelltypeconstants, xlnumbers))  set target = union(target, range("B:B,H:H").specialcells(xlcelltypeformulas, xlnumbers))  for each h in target   if isdate(h.value) and h.mergecells then    msgbox "変数hに次のアドレスのセルを格納しました" & vblf & h.mergearea.address(false,false)    flg = true   end if  next  if not flg then   msgbox "NOT FOUND"  end if end sub #「見つからなかったときはそのようにメッセージを出したい」とコダワルご相談が多いので,ご質問には書かれてませんがその旨追加しています。「行数を使う」の具体的な内容がないので,多分無駄な事を回答してるとは思いますが。

satoron666
質問者

お礼

回答ありがとうございました! 完璧です! 色々説明不足で大変申し訳ありませんでした。 教えて頂いたプログラムを利用させて頂きたいと思います! ありがとうございました!

その他の回答 (3)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.3

ん???? >H6:H13 と表示されて欲しいのです。(変数格納も) sub macro1r1()  dim h as range  dim res as range  on error resume next  for each h in range("B:B,H:H").specialcells(xlcelltypeconstants, xlnumbers)   if isdate(h.value) and h.mergecells then    msgbox "変数hに次のアドレスのセルを格納しました" & vblf & h.mergearea.address(false,false)   end if  next  if res is nothing then   msgbox "NOT FOUND"  end if end sub >.Addressで表示されますでしょうか? と思ったのでしたら,そのとおりやってみては?と思いましたが,やってみて出来なかった何か問題があったのでしょうか? それとも手を動かすのがめんどーで,こっちに押しつけたのでしょうか。

satoron666
質問者

お礼

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

satoron666
質問者

補足

回答ありがとうございます! 申し訳ありません。実行いました。 補足のところに書いている最中で、「補足する」を押してしまい 途中で送ってしまいまして… .Addressで試してみたところ、目的のデータが返ってきました。 しかし、つい先ほど気づいたのですが、 結合セルが一つしか見つからない状態です。 たぶん、他のセルには関数が入っているため 上手く認識してもらえないのかと思います。 関数は、その日付+1 などになっています。

回答No.2

こんにちは。 本来、こういう質問内容の解答は、経験値だけです。ご質問者さんは、VBAを実践で書いているでしょうから、遅かれ早かれ、分かるような気がしますが……。私自身は、こうしたマクロを書いたのは、5年ぶりぐらいなので、変なところがあったら、ご容赦ください。 '// Sub FindMeargeCells()  Dim Rng As Range  Dim c As Range  Dim a As String  Dim b As String  Dim Ar() As Variant  Dim i As Long  Dim msg As String  ReDim Ar(2, 0)  Ar(0, 0) = "範囲": Ar(1, 0) = "日付": Ar(2, 0) = "行数"  i = 1  Set Rng = Intersect(ActiveSheet.UsedRange, Columns("H"))  Set Rng = Union(Intersect(ActiveSheet.UsedRange, Columns("B")), Rng)  b = Rng.Address  For Each c In Rng   If c.MergeCells Then    a = c.MergeArea.Address(0, 0)    If a <> b Then     ReDim Preserve Ar(2, i)     Ar(0, i) = a 'セルの結合範囲     Ar(1, i) = IsDate(c) '日付か     If IsDate(c) Then      Ar(2, i) = Range(a).Rows.Count '日付なら行数     Else      Ar(2, i) = " - "     End If     i = i + 1     b = a    End If   End If  Next c  'ワークシートに出力  'Worksheets("Sheet2").Range("A1").Resize(3, UBound(Ar(), 2) + 1).Value = Ar()  'MsgBox に出力  For i = 0 To UBound(Ar, 2)   msg = msg & vbCrLf & Ar(0, i) & vbTab & Ar(1, i) & vbTab & Ar(2, i)  Next i  MsgBox msg End Sub

satoron666
質問者

お礼

回答ありがとうございます! おぉお、なんだかすごいプログラムですね! 解読までに時間がかかりそうな予感… 頑張って1文ずつ読んでいきたいと思います。 ありがとうございました!

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

sub macro1()  dim h as range  dim res as range  on error resume next  for each h in range("B:B,H:H").specialcells(xlcelltypeconstants, xlnumbers)   if isdate(h.value) and h.mergecells then  ’msgbox h.mergearea.rows.count '★    if res is nothing then     set res = h.mergearea    else     set res = union(res, h.mergearea)    end if   end if  next  if res is nothing then   msgbox "NOT FOUND"  else   res.select  end if end sub ご相談でヤリタイことがイマイチあいまいですが、「日付が入ってて結合されているセルがあったらその行数を利用したい」だけなら、★の一文だけでおしまいです。 「変数に確保したい」とかが入ってるので、余計なマクロで長くなってます。

satoron666
質問者

お礼

回答ありがとうございます! .addressで思ったとおりの結果が出ました! しかし、他の日付セルでは上手く行きませんでした。 なんでも、B5:B13、B18:B25、B30:37 と結合してある場合、B5:B13=日付   B18:B25=B5:B13+1   B30:37=B18:B25+1 のような書き方をしています。 そのせいか、上手く行きません…

satoron666
質問者

補足

回答ありがとうございます! そうです、大体こんな感じなのです! ですが、できれば… H6:H13 を結合していて日付が入っていた場合に、 H6:H13 と表示されて欲しいのです。(変数格納も) .Addressで表示されますでしょうか?

関連するQ&A