• ベストアンサー

VBA Excel 背景色の最終行取得~

Excelのシート上に背景色が変更になった箇所のH3から 背景色の最終行を取得し その最終行のB列の値を取得したいのですが宜しくお願いします。 取得した値をMsgBoxで表示できる様に作成したいのですが、 背景色の最終行って、どの様に作成したら良いのでしょうか? UserForm上で操作ができたら良いのですが。 画像の様な事をしたいです。 お手数おかけしますが教えて頂けますでしょうか?

この投稿のマルチメディアは削除されているためご覧いただけません。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1614/2452)
回答No.2

Sub Example() Dim c As Range For Each c In Range("H3:H1000") If c.Interior.Pattern = xlNone Then MsgBox Cells(c.Row - 1, "B").Value Exit For End If Next End Sub みたいな感じでいかがでしょう。

awmori
質問者

補足

回答ありがとうございます。 UserForm上で実行して見ましたが、シート名が無かったのを気づいて付け足してみたんですが、こんな感じでも大丈夫でしょうか? Dim c As Range With Worksheets("Sheet1") .Activate For Each c In Range("H3:H1000") If c.Interior.Pattern = xlNone Then MsgBox = Cells(c.Row - 1, "B").Value Exit For End If Next End With 一応、動作はするんですが・・・

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率65% (1614/2452)
回答No.4

> With~End Withに限って、ドットを入れといた方が良いんですよね? はい、普通の時にドットを入れるとエラーになります。 With Worksheets("Sheet1") というのは、その記述以降End Withまでは たとえば通常 Worksheets("Sheet1").Range("A1").Value と書く部分の Worksheets("Sheet1"). を省略してドットから以降だけ書けばいいですよという意味と考えてください。 With Worksheets("Sheet1").Range("A1") と書くこともできます。セルA1の書式設定なんかを一括処理したい場合は便利だと思います。 ただ、ドットがなくてもエラーにはならず別のセルを参照してしまいますから、不思議な結果が出たりするので利用には注意が必要です。 先の回答の誤動作のテストといて 元のコードの .Activate のあとに Sheets("Sheet2").Activate を入力してみてください、するとRangeなどにドットを入れていない場合正しく動作しないと思います。 ただし、今回のようなフォーム内のモジュールではなくSheetモジュールの場合は、単にRangeと指定した場合はそのモジュールの存在するSheetのセルを参照するのでSheet1のモジュールでしたら正しく動作します。

awmori
質問者

お礼

返事ありがとうございます。 詳しく説明して頂きまして本当に助かりました。 おかげで充分理解する事ができました。 また、何かありました時には宜しくお願いします。

  • kkkkkm
  • ベストアンサー率65% (1614/2452)
回答No.3

> UserForm上で実行して見ましたが、シート名が無かったのを気づいて付け足してみたんですが、こんな感じでも大丈夫でしょうか? すみません、シート名に関しての説明を忘れてました。 With Worksheets("Sheet1") .Activate とされてますので、不要かもしれませんが、後に機能追加でコードに手を加えた時に.Activateのあとで他のシートをアクティブにするコードを入れてしまった場合、誤動作の原因になりますので、念のためにRangとCells前にドットを入れておく方が安全かもしれません。 .Range("H3:H1000") .Cells(c.Row - 1, "B").Value ところで MsgBox = Cells(c.Row - 1, "B").Value これ、タイプミスですよね。

awmori
質問者

補足

回答ありがとうございます。 MsgBox Cells(c.Row - 1, "B").Value すいませんタイプミスでした。 RangeやCellsの前にドットを入れると、その様な効果があるんですか?知りませんでした。 With~End Withに限って、ドットを入れといた方が良いんですよね?

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

>H3から背景色の最終行を取得 Sub Test()   Dim myRng As Range   Application.FindFormat.Interior.ColorIndex = Range("H3").Interior.ColorIndex   Set myRng = Columns("H:H").Find(What:="", After:=Range("H1"), SearchFormat:=True, SearchDirection:=xlPrevious)   MsgBox Cells(myRng.Row, "B").Value End Sub Sub Test2()   Dim i As Long   i = 4   Do     If Range("H3").Interior.ColorIndex <> Cells(i, "H").Interior.ColorIndex Then Exit Do     i = i + 1   Loop   MsgBox Cells(i - 1, "B").Value End Sub

awmori
質問者

お礼

回答ありがとうございます。 希望通りの動作ができました。 UserFormからの操作だとSheet名を指定したら動作ができました。 一応、希望通りの動作できましたし しかも、2つのコードを記載して頂き、とっても参考になりました。

awmori
質問者

補足

今、気が付きました! Test1の方がCtrl+↑見たいな感じで背景色を見ているんですね。 そして・・・ Test2の方がCtrl+↓見たいな感じで背景色を見ていることがわかりました。 上手く説明できませんが、参考になります。 本当にありがとうございます。

関連するQ&A

  • VBAで最終行の取得について

    UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A      B 1 ○○   ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A      B 1 ○○   ×× 2 あいう  アイウ 3 :    : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize()  Dim lasClm As Integer, i As Integer  lasClm = Sheet1.Range("A1").End(xlToRight).Column   For i = 1 To lasClm   ComboBox1.AddItem Sheet1.Cells(1, i).Value   Next i End Sub ********************************************* Private Sub CommandButton1_Click()  Select Case ComboBox1.Text  Case Sheet1.Cells(1, 1).Value '「○○」が選択  Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1)  Case Sheet1.Cells(1, 2).Value '「××」が選択  Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2)  End Select  UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例)    A     B 1 ○○   ×× 2 あいう  アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。

  • vbaで最終行に張り付け

    Excelマクロについて教えてください。 sheet2にsheet1から選択した範囲を貼り付けております sheet2のC列が連続した値になっておりそれを軸に貼り付けをしたいのです。 sheet1のA1:g40の範囲をcutしたものを sheet2のC列の最終入力行の一段下の行に A列から貼り付けしたいのです。 よろしくお願いします

  • Excel2007 VBA 最終行の特定セルの取得

    ●質問の主旨 A列の入力を欠いた最終行の特定セルの取得及び転記について ご教示ください。 ●質問の詳細 下記の要領で現金出納帳を作成しています。 1. 項目は以下の通りです。  A     B     C      D   E        F 日付 摘要1 摘要2 収入金額  支出金額 残高金額 2. 下の行に向かって1.の具体的内容を入力していきます。 3. 同じ日に複数の項目がある場合、その日の先頭項目のみA列に 日付を入力し、2番目の項目には、日付を入力しない。 4. 当月の一番最後に入力されている項目のF列の残高金額をもって、 次月の残高(繰越残高)とする 5. 当月の残高(繰越残高)は、雛型シートを用意し、 そのシートのF3セルに入力する。 ※ 一日に必ず複数の項目を入力するため、最終行には 日付の入力を欠いていることがほとんどです。私案のコードでは 「最終日」の1番目の残高は拾えても、「最終日」の最終行を 拾うことができません。コードをどのように書き換えたらよろしい でしょうか? ●私案のコード Sub 繰越_Click() Dim i As Integer '既存のシート数を取得 i = ThisWorkbook.Worksheets.Count '最終シートをコピーして後ろに挿入 Worksheets(i).Copy after:=Worksheets(i) '月リストからシート名を取得してシート名変更 Worksheets(i + 1).Name = Sheets("月リスト").Cells(i + 1, 1).Value '新しく作成したワークシートについて以下の処理を行う With ActiveWorksheets '当月の残高を次月に繰り越す (残高が記入されている最終行,F列の値を次月シートのF3セルに代入する) Range("F3") = Worksheets(i).Range("A1045876").End(xlUp).Offset(0, 5).Value End With End Sub 使用機種はWindouws Vista Excel2007です。当方はVBA初心者です。   

  • エクセルVBAで最終行取得ができない

    エクセルVBAでたとえばC列にどこまでデータが入力されているかを調べるとき、通常は r = Cells(Rows.Count, "C").End(xlUp).Row などでできます。 しかし添付画像のような入力フォームが出来上がっており、かつC列に最初から何らか(画像では〒マーク)の入力がされているので、そこに回答者が途中まで入力された場合、これでは最終行は取得できません。 逆に上からEnd(xlDown)でやろうとしても、途中に空白セルがあってお手上げです。 余分な〒マークを元データから削除してしまいたいのですがそれでは入力されているところのマークまで消えてしまいます。 このようなファイルが何百もあり、それを1枚のシートにまとめようとしているのですが、この最終行取得でつまずいてしまいました。 どのような方法があるでしょうか? 画像はエクセル2013ですが、実際にマクロを動かすのは2010です。

  • エクセルの関数で最終行の文字を取得したい

    エクセルの関数で、シート2のA1に、シート1のA列の最終行に入力されてる文字を取得したいのですが、どのような関数になるでしょうか?

  • VBA最終行取得

    Sub 最終セル取得() Dim gyou As Integer gyou = 1 Do Until Cells(gyou, 1).Value = "" gyou = gyou + 1 Loop Range("C1").Value = gyou End Sub 上記のプログラムのどこを変えれば 文字が入力されている最終行の取得ができますでしょうか。 A列に入っている文字の最終行(セル)がC1に表示される というようにしたいのですが…; このまま実行すると1つ多いセル行が表示されてしまいます 同じような質問をしてしまって申し訳ありません; どなたかわかる方回答お願い致します Excelは2000です;

  • 【Excel VBA】データの最終行について

    Excel2003を使用しています。 ある一覧表形式のデータSheet1をSheet2に値のみコピーして、このSheet2を“印刷用”として、ページ設定等をして、印刷のみに使用しようと思っています。 Sheet2のI列、J列、K列には数値が入力されていて、I列、J列、K列のデータの最終行の1行下に、それぞれ6行目からデータ最終行までの合計の数式が入力されるよう、コードを追加したのですが、数式は入力されるものの、入力したい行に数式が入力されません。 マクロを実行して、数式が入力された行を見てみると、301行目に入力されていました。 Sheet1は別のシートのデータを数式により表示していて、数式が300行まで入力されているので、Sheet2の元になっているSheet1の影響(?)なのかな~?と…。こういう場合、どうすればいいでしょうか? コードは下記のようになっています。 よろしくお願いします。 ---------------------------------------- Sub 印刷用作成() Dim i As Integer Dim j As Long Sheets("Sheet1").Activate Range("B6:L6", Range("L6").End(xlDown)).Select Selection.Copy Sheets("Sheet2").Select Range("B6").PasteSpecial xlPasteValues Application.CutCopyMode = False For i = 9 To 11 j = Application.Max(j, Cells(65536, i).End(xlUp).Row + 1) Next For i = 9 To 11 Cells(j, i).FormulaR1C1 = "=SUM(R2C[0]:R[-1]C[0])" Next i End Sub

  • 何列の何行目が最終行なのか取得するコードはありますでしょうか?

      A列  B列  C列 1  ○   ○ 2        ○ 3               ○ これは最終行が3行目と言うのがぱっと見でわかりますが もっと列も行も多い場合、 シート内の何列の何行目が最終行なのか取得するコードはありますでしょうか? Cells(65536, ?).End(xlUp).Row を行ないたいのですが 毎回何列の行が一番下かを取得する方法があれば教えてください。 よろしくお願い致します。

  • VBScript エクセル 最終行と最終列取得

    今、たくさんのシートがある、エクセルのファイルがあり、「C6」以降が縦の項目行、「D5」以降が横の項目列です。 項目行と項目列には、間に空白のセルは存在しません。 この状態で、項目行、項目列の最終の場所を取得しなければなりません。 そこで、「r = Range("C6").End(-4121).Row」(「-4121」は「xlDown」)、「c = Range("D5").End(-4161).Column」(「-4161」は「xlToRight」)で次々に求めていったのですが、「C6」に縦の項目が1つだけ、「D5」に横の項目が1つだけ、というシートがありました。 すると、そのシートでは、「r」と「c」の値は、エクセルそのものの最大の行数と最大の列数が返ってきてしまいました。 そこで、「D6」にのみ、文字があるサンプルファイルを作り、そのサンプルファイルに対して、「r = Range("D5").End(-4121).Row」と「c = Range("C6").End(-4161).Column)」で求めると、ちゃんと、「r = 6」、「c = 4」という値が返ってきたので、「r」の場合は、1つ上から、「c」については、1つ左から「Range」を設定すればいい、と思って、実際のデータで試すと、他のシートでは、全然うまくゆきません。 結果的に、問題は、「If」文で、ムリヤリ解決させたのですが、「If」文の場合ですと、前もって全シートを確認して、調べておかなければなりません。 何とか、汎用的に項目が1つしかない場合も、その項目のある「行」と「列」が最終行、最終列として取得できる方法はないでしょうか? ただし、項目が「0個」ということはありませんので、そこまで考えて頂く必要はありません。 「VBA」でも結構ですので、よろしくお願いいたします。

  • EXCEL-VBAでワークシートのデータがはいっている最終の行番号の取得

    ExcelVBAは不得意のものです。 ワークシートのA列にデータが入っているのですが、10行目までの時もあれば20行目までデータが入っている場合もあります。データが入っている最終行の行番号を取得したいのですがどうしたら良いのでしょう。 何をするかというと、その番号を取得してループ処理をしたいのです。For i=1 To 最終行の行番号みたいに 多分EOFなんて指定じゃないですよね

専門家に質問してみよう