- ベストアンサー
エクセルでシートを選択したらA列の最下行にセル
いつもお世話になっております。 横に大きいシートに移動した時に、隠れている列を知らずに、左端の列をA列のつもりで入力してしまうミス防止です。 特定のシート(Sheet「A」とSheet「あ」とSheet「イ」)を選択したらA列、出来れば最下行の入力セルに飛ぶようにしたいのですが。 よく考えたら、全てのシートに適用でも良いかもしれませんが、オペミス防止として適用したいBookが多数なので、シート毎か全シートに適用かは実際に使ってみないとわからないので、贅沢を言うようですが両方ご指導いただければ幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
シート毎でしたらそれぞれのシートモジュールに Private Sub Worksheet_Activate() Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Select End Sub Bookで全シート指定の場合はThiesWorkbookのモジュールに Private Sub Workbook_SheetActivate(ByVal Sh As Object) Sh.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Select End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
ThisWorkbookにSheetActivateイベントがあるので Private Sub Workbook_SheetActivate(ByVal Sh As Object) Select Case Sh.Name Case "Sheet1", "Sheet3", "Sheet5" Sh.Range("A100000").End(xlUp).Offset(1, 0).Select End Select End Sub ーー Case "Sheet1", "Sheet3", "Sheet5"の行は シートに名前を付けている場合は、そのシート名の文字列に変えて記述すること。(質問ではAやあやイです。) Case分を使って、IF文利用を避けて、カンマで区切って列挙できる点を利用した。スッキリするだろう。
お礼
早々のご回答ありがとうございます。 期待通りに動くこと確認しました。 残念ながら、かつ申し訳りありませんが(すでにお気づきとは思いますが)当方にはスッキリ度合いが分らず共感出来ない悲しい実力です。
- HohoPapa
- ベストアンサー率65% (455/693)
追記します。 >特定のシート(Sheet「A」とSheet「あ」とSheet「イ」)を 要求2 1つのブックに複数のシートがあり、 その中のシート名が、「A」、「あ」、「イ」に限って そのシートの使われているセルたちの範囲の 最終行の次行のA列を選択したい ということであれば、 ThisWorkbookモジュールに以下を配置します。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim LastRow As Long If ((Sh.Name <> "A") And _ (Sh.Name <> "あ") And _ (Sh.Name <> "い")) Then Exit Sub If WorksheetFunction.CountA(Sh.UsedRange) = 0 Then Sh.Cells(1, 1).Select Else LastRow = Sh.UsedRange.Rows.Count + Sh.UsedRange.Row Sh.Cells(LastRow, 1).Select End If End Sub
お礼
昨夜動作確認したのですが、その時にはすでにこの追加回答までいただいてしまっており申し訳ありません。 同じ作業をしているBookが多数あり、年間200以上のファイルに入力作業をします。 ここで教えてもらった種々のコードをC&Pで使えるようにシート名を極力統一しています。 このコードは該当するシート名が無くてもエラーにならないことを確認しましたので今回のBook以外で便利に使えると思っています。 該当するシート名をandで追加するだけで指定のシートの指定の列に移動するのは便利です。 いつもご丁寧なご回答ありがとうございます。
- HohoPapa
- ベストアンサー率65% (455/693)
要求1 1つのブックに複数のシートがあり、 どのシートを選択しても、 そのシートの使われているセルたちの範囲の 最終行の次行のA列を選択したい ということであれば、 ThisWorkbookモジュールに以下を配置します。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim LastRow As Long If WorksheetFunction.CountA(Sh.UsedRange) = 0 Then Sh.Cells(1, 1).Select Else LastRow = Sh.UsedRange.Rows.Count + Sh.UsedRange.Row Sh.Cells(LastRow, 1).Select End If End Sub 要求2 1つのブックに複数のシートがあり、 その中の、いくつかのシートに限って そのシートの使われているセルたちの範囲の 最終行の次行のA列を選択したい ということであれば、 そのシートたち、それぞれのシートモジュールに 以下を配置します。 Private Sub Worksheet_Activate() Dim LastRow As Long If WorksheetFunction.CountA(UsedRange) = 0 Then Cells(1, 1).Select Else LastRow = UsedRange.Rows.Count + UsedRange.Row Cells(LastRow, 1).Select End If End Sub
お礼
いつも大変お世話になっております。 早々のご回答に感謝!!! 昨夜動作確認し期待通りに動くことを確認しました。 但し、今朝早々に2番目のご回答で実シートで確認したら1つ当方の質問内容に不備がありました。 単純にA列の最終行としか記載していませんので、「セルたち」という発想はなかったです。 横に広い表でいくつかのセルには式が入っていますので「セルたち」だと表の一番下のA列に飛ぶことに気付きました。 質問の内容不備でごめんなさい。。。
お礼
早々のご回答ありがとうございます。 実質1行のコードで解決、やはりというかそれにしてもすごい、と改めてマクロのすごさを実感しました。(1行のマクロが自作できないのが情けないですが。。。) 現在はファイルオープン時に決まったシートの指定の列に飛ぶことは、マクロの記録とオープンイベントというのをNETで調べて組み合わせて出来るのですが、今回は起動後のシート移動時だったのでお手上げでした。(SheetActivateというのがあるのですね) 昨夜自宅で試して期待通りに動くことを確認しましました。 但しA列にデータがない場合は2行目に飛ぶのはご愛敬ということで全く問題なし。 このためにコードが増えるより、シンプルな方が良いです。 聞いてよかった。