VBAで最後に編集したデータにジャンプする方法

このQ&Aのポイント
  • VBAを使用して、特定のワークシートで最後に編集したデータに簡単にジャンプする方法を紹介します。
  • すべてのワークシートではなく、特定のワークシートだけを開いた場合に有効な方法です。
  • B列には必ずデータがあり、1行目も日付固定で、2行目からデータを入力しています。ただし、B列以外のセルには不定のデータがあります。右端のセルも揃っているわけではありません。データは文字列形式です。
回答を見る
  • ベストアンサー

VBA 最後に編集したデータにジャンプ2

前回(http://okwave.jp/qa/q8795572.html)では質問の仕方が不十分で申し訳ありませんでしたので、 再度もっと細かい仕様も含めて質問いたします。 B列には必ずデータがあり、1行目も日付固定で、2行目からずっとデータを入れていきます。 ただし、B列と1行目以外どのセルにどんなデータがあるかは常に不定です。空白もあります。 右端のセルは揃っているとは限りません。 データは文字列です。 ブックではなくある特定のワークシートだけを開いた時に限り、最後にデータを入れた右隣のセルにポインタを合わせるようにしたいです。 A B C D E F ……….以下続く 1 10/1 10/2 10/3 10/4 10/5 ……….以下続く 2 Z 空白 空白 空白 あ ……….以下続く 3 Z あ あ あ 空白 ……….以下続く 4 Z 空白 あ 空白 空白 ……….以下続く 5 Z 空白 空白 あ 空白 ……….以下続く 6 Z あ あ あ あ ……….以下続く . . . 以下続く 以上です。よろしくお願いします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.7

No6の補足です。同じコードを2か所に書くと後々メンテナンスが面倒になるので通常は 標準モジュールに以下のコードを Public Function セル選択() 'Public Sub セル選択()にするとマクロ一覧に出てくるようになる。 Dim BRow As Long Dim LColumn As Long With ActiveSheet BRow = .UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row LColumn = .Cells(BRow, Columns.Count).End(xlToLeft).Column .Cells(BRow, LColumn + 1).Select End With End Function ThisWorkbookモジュールに以下のコードを Private Sub Workbook_Open() If ActiveSheet.Name = "該当シートの名前" Then セル選択 End If End Sub 該当するシートモジュールに以下のコードを記載します。 Private Sub Worksheet_Activate() セル選択 End Sub

KAIJI-000
質問者

お礼

3つともおっしゃる通りの場所にコピーペーストしてみましたが、ブックを開いても何も起こりませんでした。ただし、デバッグのステップインではちゃんと最後の行のデータの右にカーソルが合わさります。

KAIJI-000
質問者

補足

後々の事まで考慮して頂いて有難うございます。

その他の回答 (7)

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.8

> 3つともおっしゃる通りの場所にコピーペーストしてみましたが、ブックを開いても何も起こりませんでした。ただし、デバッグのステップインではちゃんと最後の行のデータの右にカーソルが合わさります。 セルが最後の行とは限らないわけですから、No7のコードで開いたときに動いたとしても最終行にカーソルが移動しますから、これ以上No7にこだわる必要はありませんが、とりあえず If ActiveSheet.Name = "該当シートの名前" Then この該当シートの名前の部分を本来のあなたのファイルのシート名に書き換えていますか? 実際にあなたが希望している動作としては、セルは最後の行とは限らないということですからNo2のコードが選択肢としてあげられます。No2のコードをNo7のパターンで作成してください。

KAIJI-000
質問者

お礼

本当に何度もすいませんでした。初歩的な事でレスしてもらってすみません。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.6

> No.1のコードではステップイン時では上手くいきますが、ブックを開いた場合はこのマクロが機能せず、最後に編集した箇所にカーソルがいってしまってます。 前回の回答No13と今回のNo1を両方適用してください。 Workbook_Open()とWorksheet_Activate()と同じ内容のものをそれぞれのシートモジュールとして適用です。 > もし最後に編集した箇所が一度値を入れたが、やはり不必要になったので空白にした場合は除きたいです。 式が入っていなければ希望の動作をすると思います。 NO4に書いた「書式設定など利用したセルが現在の最終行より下にあれば云々」は勘違いでしたので忘れてください。数式がない限りデータのある最終行を選択します。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

> 1度データを入れたものの、もう1度値を消しブランクセルにしたものは除外としたいです。 値を消してブランクセルにって……どうやってブランクセルにしていますか? もしかしてDeleteやBackSpaceで消しているのではなく、スペースを入力しているのでしょうか?

KAIJI-000
質問者

補足

右クリック→数式と値のクリア です。

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

> >もしかして、最後にデータを入れたセルというのが最終行とは限らないということでしょうか。 > > おっしゃる通り、最後にテータを入れたセルが常に最終行となります。 私の言う通りなら「最後にデータを入れたセルが最終行でないこともある 」になるのですが… 後半に書かれているように常に最終行ということでしたら、No1のコードで実現できるはずですが試してみましたか?  ただし、前回書いたように、一度でも書式設定など利用したセルが現在の最終行より下にあれば、その行まで認識してしまうというエクセルの仕様があるので、その部分に関しては注意が必要です。

KAIJI-000
質問者

補足

>私の言う通りなら「最後にデータを入れたセルが最終行でないこともある 」になるのですが… 錯誤させてしまい申し訳ありません。セルが最終行「でないこともある 」が正しいです。 本当にすいません。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

シートを選択した時で良いのでしたらSheetモジュールに↓でどうでしょう? Private Sub Worksheet_Activate()   nRow = Cells(Rows.Count, 2).End(xlUp).Row 'B列の一番下の行   nCol = Cells(nRow, Columns.Count).End(xlToLeft).Column 'B列の一番下の行の一番右の列   Cells(nRow, nCol + 1).Select '一つ隣りを選択 End Sub

KAIJI-000
質問者

補足

回答有難うございます。 大変申し訳ないですが、前回にもある通り、 1度データを入れたものの、もう1度値を消しブランクセルにしたものは除外としたいです。

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

No1です もし、最後にデータを入れるのが最後の行ではなくてどの行に入力するかが不定で、どの行であろうと最後にデータを入力したセルの右隣を選択したいということでしたら、とりあえず別シートに最後に入力したセル番地を記載しておき、該当シートをアクティブにしたときにその記載しているセル番地の右を選択状態にするという手もあります。ただし、最後に必ず保存しなくてはいけませんが。 以下のコードはSheet2に記載するようにしてます。一番最初に何も入力しないままに該当シートをアクティブにした場合エラーになるので、Sheet2のA1にデータがない場合、セルの選択実行はしません。 Private Sub Worksheet_Activate() If Sheets("Sheet2").Range("A1").Value <> "" Then Range(Sheets("Sheet2").Range("A1")).Offset(0, 1).Select End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) Sheets("Sheet2").Range("A1").Value = Target.Address End Sub

KAIJI-000
質問者

お礼

補足ですが、No.1のコードではステップイン時では上手くいきますが、ブックを開いた場合はこのマクロが機能せず、最後に編集した箇所にカーソルがいってしまってます。もし最後に編集した箇所が一度値を入れたが、やはり不必要になったので空白にした場合は除きたいです。

KAIJI-000
質問者

補足

補足への返事が遅くなったため、回答させてしまい申し訳ないです。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.1

URLの部分がIE11だと括弧も認識して前回の質問にうまく飛ばないのでこちらに書き直しておきますね。 http://okwave.jp/qa/q8795572.html 上記の質問のNo13のコードを該当シートモジュールに対応させても駄目だったでしょうか Private Sub Worksheet_Activate() Dim BRow As Long Dim LColumn As Long With ActiveSheet BRow = .UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row LColumn = .Cells(BRow, Columns.Count).End(xlToLeft).Column .Cells(BRow, LColumn + 1).Select End With End Sub もしかして、最後にデータを入れたセルというのが最終行とは限らないということでしょうか。

KAIJI-000
質問者

お礼

大変返事が遅くなりました。前回からの引き続きの回答有難うございます。

KAIJI-000
質問者

補足

>もしかして、最後にデータを入れたセルというのが最終行とは限らないということでしょうか。 おっしゃる通り、最後にテータを入れたセルが常に最終行となります。

関連するQ&A

  • VBA 最後に編集したデータにジャンプ

    VBAで最後に編集したデータがあるセルに常にカーソルを合わせたいと思って ネットで調べたのですが、なかなかいいのが見つからなくて教えていただきたいです。 ショートカットで shift + F5もあるようですが、これだと何かしらの操作をしたら (セルにポインタを合わせる、セルを空白にするなど)でもその場所に飛んでしまいますが、 そうではなくブックを開いたとき、下の例ならつねにデータが最後である「そ」のセル、 次回「たちつてと」と書けば今度は「と」の右隣にポインタを合わせたいVBAコードが欲しいです。 あ い う え お か き く け こ さ し す せ そ Sub Auto_Open() With End With End Sub ROWの場合だと こういうページを見つけたのですが、 http://officetanaka.net/excel/vba/tips/tips130.htm ROW をColumns に変えても上手くいきませんでした。

  • Excel(VBA)マトリクスの解体方法について

    VBAで、以下のようなマクロを作成したいのですが、どのように作成したら良いのか検討がつきません。 どのようにすれば良いか、ご教授いただけたらと思います。 (過去の質問No.1488981を参考に記入させていただきます) (1)下記のように、縦横のマトリクス表にデータが入力されている。     A B C ・・ 1   X Y Z 2 a ○ × ○ 3 b × ○ ○ 4 c ○ ○ ○ (2)これを別シートに【"○"のついたデータのみ】縦に3列にデータを並べるように処理する。  左列には"項番"(1~)、中列には"行データ"、右列には"列データ" 1 a X 2 a Z 3 b Y 4 b Z  ・  ・  ・ (3)列データと行データの数は不定で、一番右下となるセルまで、処理を繰り返すかたちにする。(空白セルが10個以上になる等の条件で) 以上のような条件です。ご回答よろしくお願い致します。

  • エクセル マクロ VBA

    エクセルのマクロについて質問です。 『集計』というブックの『集計開始』というシートに     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 コメント  空白     空白   3行目 空白   空白     空白 4行目 商品名  支店     個数  5行目 空白   空白     空白 6行目 空白   空白   コメント1 7行目 空白   空白     空白 8行目 空白   空白   コメント2 9行目以降    上記のデータ(見出しを除く)の繰り返し というデータが入っています。 B列の中に『AAA』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 C列の中に『B』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 (今は、手作業で編集→置換→検索する文字列の中に『B*』と入力し、 置換後の文字列を空白にしてすべて置換ということをやっています。)                            ABC列(データーの入っている行まで)の空白を含む行を一括削除し、 以下のような形にしたいのです。     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 商品名  支店     個数  3行目 商品名  支店     個数          ・         ・ このようにするマクロ文はどのようになりますでしょうか?

  • VBAでのデータ転記処理

    下記の処理をVBAで作成したいのですが…。 Book "aaa" の "Sheet1" A |B |C |D |E |F |G |H |I |J |K 1 あ|い|う|え|お|か|き|く|け|こ|さ 2 た|ち|つ|て|と|な|に|ぬ|ね|の|は|ひ|ふ|へ 3 ま|み|む|め|も|や|ゆ|よ これをBook "bbb" の "Sheet1" に A|B|C|D|E 1 あ|い|う|え|お 2 か|き|く 3 け|こ|さ 4 5 た|ち|つ|て|と 6 な|に|ぬ 7 ね|の|は 8 ひ|ふ|へ 9 10 ま|み|む|め|も 11 や|ゆ|よ と言う風にデータを転記したいのです。 Book "aaa" の Sheet "Sheet1"のA~E列までは必ずデータが入っていますが F列以降は、データがある場合と無い場合があり データがなければ、そこのセル(行)は詰める。 さらに、Book "aaa" の1行を1セットとして、Book "bbb" で1セット単位で、空白行を設けたいのです。 上記例のように、1セットの行数は固定ではありません。 Book "aaa" の Sheet "Sheet1"のデータ行数は大量に(1000行以上)あります。 わかりにくいと思いますが、どなたかよろしく御願いします。

  • エクセルVBAについて教えてください。

    エクセル2007を使ったVBAについて2つ質問です。 1つ目の質問は、5列目の右端の数字を2列目の右端に持ってくるため、 Range("B2").End(xlToRight).Next.Select ActiveCell.FormulaR1C1 = Range("A5").End(xlToRight) というVBAを組んだのですが、2列目に空白が入っている場合うまく動かないため動くように したいのですが、どのように組めばいいのかわかりません。 例    A     B     C     D     E     F     G     H     I     J     K 1  2 【数値1】  □    □     □     1     2     3     4     5  3 4 5 【数値2】   6     7     8     9     10 6 ※□は空白 上記の例の場合、5行目の右端である10を2行目の空白を除いた右端である5の隣に持っていきたいです。 2つ目の質問ですが上記例の2列目の両端(1と5)を選択してDeleteする方法がわかりません。 2つの質問についてわかる方おりましたら教えていただけると助かります。 よろしくお願いしします。

  • データの並び替え

    以下の表(処理前のもの)があります A列 B列 を比較し、 一致すれば次の行へ、一致しなければ空白セルを挿入し (処理後の表の様にしたい)次の行へ進むという処理をマクロで行えるように したいと思っています。 どのようなマクロを組めばよいのでしょうか?ご存知の方いらっしゃいましたら ご教授お願い致します。 <処理前> A列 B列 ああ ああ いい いい うう ええ おお おお きき かか きき くく けけ けけ <処理後> A列 B列 ああ ああ いい いい うう      (B列に空白セルを入れる)     ええ  (A列に空白セルを入れる) おお おお     かか  (A列に空白セルを入れる) きき      (B列に空白セルを入れる) きき      (B列に空白セルを入れる)     くく  (A列に空白セルを入れる) けけ けけ エクセル2003を使用しています。

  • Excel2003でのVBA

    WindowsXPでExcel2003を使っています。 Excelにある表をマクロを使って編集したいと思ったのですが、セルの選択の設定で教えてほしい事があります。 まず、横A列~F列、縦1行~6行までの表があります。 A1セルは、空白。 B1セル~F1セルには、1~5の数字が入っています。(見出しなので全て入ってます。) A2セル~A6セルには、a~eのアルファベットが入っています。(見出しなので全て入ってます。) 表の中のデータは、ところどころにしか入っていなくて、全て埋まっていません。 また、横A列~F列というのは固定なのですが、縦1行~6行までという行数は変動します。 この表で、A2セルからF6セルまでを選択したいのですが、行が変動するのでA6とかF6とかでは指定できません。 Range("A2").Select Selection.End(xlDown).Select これで、A2セル~一番下の行(ここではA6セル)まで選択した後、F列まで(列の数は固定です。)選択するにはどうしたらよいのでしょうか? 右下のセルは、空白なので困っています。 Range(Selection, Selection.Next).Select こんなものを考えましたが、これでは一つ右隣しか選択できません。 これを少しいじればいいのではないかと思うのですが、全然違う方法でもかまいません。 どなたか教えていただけないでしょうか? 宜しくお願いします。

  • 空白セルをデータと認識してしまいます

    Excel2003を使用しています。 「マクロの記録」を使って、あるリストを自動作成 しようとしているのですが、うまくいきません。 A,B2つの列に分かれたデータを連結させるため、 C列に「CONCATENATE」関数を入れて適当な行まで コピーします。(それ以上はデータが入らないだろうと思われる100行目ぐらいまで) その後C列をコピーし、「値貼付け」をして 関数を値に変えます。 そうすると、たとえば実際には20行目までデータが 入っていたとすると、21行目~100行目までは 空白になりますよね? でも、どうもその空白行もデータとみなされている ようなんです…。 Range("C2").End(xlDown).Row で下端セルを探そうとすると、100行目に なってしまいますし、「ジャンプ」で空白セルを 探しても、同じ結果になります。 空白セルを選んで一度「Delete」を押すと 正しく「空白」と認識するようなのですが…。 「実際にデータの入っているセルとそうでないセル」 を自動で判別させたいので、 簡単に「何も入っていないセルを”空白”と正しく 認識させる方法」はありませんでしょうか?

  • Excel VBAによる検索処理?

    Excelで以下の例のように、A列・B列に入力されているとします。A列を検索して、C列にB列の値を返す式を考えてますが、さっぱりわかりません。VBAとかも正直素人ですが、サンプルもしくは考え方を教えていただければと思います。以下の処理内容です。 ・AXセルが「B」であった場合、次のセル(A(X+1))を検索し、次が空白になるまで検索し、空白になる前の最後の行のB列の値をCXセルに返す。該当しない場合は空白のまま 下記の例ですと3行目、8行目のB列の値を2・3、6-8行目のC列のセルに返すことになります。よろしくお願いいたします。 (処理前) ___A__B__C ------------- 1 2__B__2 3__B__3 4______4 5______5 6__B__6 7__B__7 8__B__8 9______9 (処理後) ___A__B__C ------------- 1 2__B__2__3 3__B__3__3 4______4 5______5 6__B__6__8 7__B__7__8 8__B__8__8 9______9

  • vba初心者です。どなたか教えて下さい。

      独学でエクセルVBAを勉強している熟年おじさんです。  色んな参考例を見ながらヒントになる事例を探していますが、中々、似た例が見つからず  困っています。手がかりでも掴めたらと思います。どなたかご指導下さい。   同一BOOK内の2つのシートに同じ行と列に同じ項目内容が入っています。その一枚目のシートの行と列を検索して同じ行と列に該当するデータを、二枚目のシートの同じ行列のセルにコピーするのです。   それだけのことですが、もうひとつの条件は、一枚目のシートには毎日新しいデータが入ってきて  その二枚目シートのデータを日単位で色分けしたいのです。従って、二枚目のシートには、日単位で 空いているセルにデータが蓄積されていき、空白セルが埋め尽くされていきます。   この場合、各シートのデータが同一セルにダブルことは絶対にありません。 一枚目シート                 二枚目シート     行⇒ A B C D E F G          行⇒ A B C D E F G 列 A1 2 6 1 9 23 7 90          列A1 2 6 1 9 23 7 90     B5 11 8 18 34 67 9 34          B5 11 8 18 34 67 9 34    C9                       C9   U9                        U9  ・・・翌日データ追加・・・    P5                        P5        上記はシートイメージですが、行は品名で列は工程名で、中のデータは測定値です。    2枚のシートには全く同じ品名と工程名が入っていて、毎日、入ってくる一枚目シートには    その日のデータしか入ってきません。それを、二枚目のシートの空いたセルにコピーして    いきます。データは毎日追加すのですが、同一セルにダブルことはありません。    以上よろしくお願いします。

専門家に質問してみよう