- ベストアンサー
エクセルマクロでセルに移動する方法
- エクセルのマクロで行を挿入し、前行の数式をコピーする方法を教えてください。
- 特定のセルにカーソルを移動するために、マクロの最後にどのような変更をすれば良いですか?
- エクセルのマクロを使って、セルへの移動を行いたいと思っています。具体的な方法を教えてください。
- みんなの回答 (18)
- 専門家の回答
質問者が選んだベストアンサー
こんばんわ。早速修正マクロを作ってみました。次の手順で操作してみて下さい。 1.前回マクロを貼り付けたブックを立ち上げる。 2.Sheet1モジュールシートを開き、コードをすべて削除した後、下記のコードをコピー・ペーストする。 Private Sub Worksheet_Activate() Call Module1.myCell_Select End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim myRow As Long Dim myCnt As Integer Dim i As Integer Dim myMsb As Integer Dim myCell1 As String Dim myCell2 As String myRow = Target.Row myCnt = Cells(1, Columns.Count).Column For i = 1 To myCnt If Target.Address = Cells(myRow, i).Address Then Exit Sub Next i If Range("A" & myRow).Value = "" Then Exit Sub myMsb = MsgBox("削除処理を実行してもよろしいですか?", vbYesNo + vbQuestion, "作 業 確 認") If myMsb = vbNo Then End Application.EnableEvents = False Target.Delete shift:=xlShiftUp Application.EnableEvents = True If myRow = 2 And Range("A" & myRow).Value = "" Then Exit Sub If Cells(Rows.Count, 7).End(xlUp).Offset(0, -6).Value = "" Then Application.EnableEvents = False Cells(Rows.Count, 7).End(xlUp).Value = "" Cells(Rows.Count, 8).End(xlUp).Value = "" Application.EnableEvents = True End If Application.EnableEvents = False Call Module1.myCalculation(myRow) Application.EnableEvents = True End Sub Private Sub Worksheet_Change(ByVal Target As Range) Dim myRow As Long Dim myColumn As Integer Dim myRange As Range myRow = Target.Row If myRow = 1 Then Exit Sub myColumn = Target.Column Select Case myColumn Case 1, 6, 7 If Target.Address = Range("A" & myRow).Address Then If myRow = 1 Or myRow = 2 Then Exit Sub If Range("A" & myRow).Value <> "" Then If Target.Value = Target.Offset(-1, 0).Value Then If Target.Offset(1, 0).Value <> "" Then Rows(myRow + 1 & ":" & myRow + 1).Insert shift:=xlShiftDown End If Else Rows(myRow & ":" & myRow).Insert shift:=xlShiftDown End If If Cells(Rows.Count, 1).End(xlUp).Row < Cells(Rows.Count, 7).End(xlUp).Row Then Application.EnableEvents = False Cells(Rows.Count, 7).End(xlUp).Value = "" Cells(Rows.Count, 8).End(xlUp).Value = "" Application.EnableEvents = True End If End If Application.EnableEvents = False Call Module1.myCell_Select Application.EnableEvents = True End ElseIf Target.Address = Range("F" & myRow).Address Then If myRow = 1 Then Exit Sub If Range("A" & myRow).Value = "" Then Exit Sub Application.EnableEvents = False If Target.Offset(0, 1).Value = "" Then Range("G" & myRow).Select Application.EnableEvents = True End Else If Target.Value = "" Then Target.Offset(0, 2).Value = Target.Offset(0, 1).Value * 0.75 Else Target.Offset(0, 2).Value = Target.Offset(0, 1).Value End If End If Application.EnableEvents = True ElseIf Target.Address = Range("G" & myRow).Address Then If myRow = 1 Then Exit Sub If Range("A" & myRow).Value = "" Then Exit Sub Application.EnableEvents = False If Target.Offset(0, -1).Value = "" Then Target.Offset(0, 1).Value = Target.Value * 0.75 Else Target.Offset(0, 1).Value = Target.Value End If Application.EnableEvents = True End If Application.EnableEvents = False Call Module1.myCalculation(myRow) Range("A" & myRow + 1).Select Application.EnableEvents = True End Select End Sub また、不都合なことがありましたら、お知らせ下さい。
その他の回答 (17)
- kazuhiko5681
- ベストアンサー率49% (79/159)
お返事有難うございます。マクロで数式と同じことをさせることができると思います。つまり、あなた様のやりたいことをすべて自動ですることができる。これがマクロを使う理由です。 もし私でよろしければサンプルマクロを作ってみたいと思いますので、以下の内容をお知らせ下さい。 1.表の項目名 2.どのセル番地にどんな内容を入力させたいのか。 お手数をおかけいたしますが、よろしく御願いいたします。
補足
次から次お世話になりますm(__)m お言葉に甘えまして、サンプルマクロを作っていただこうかと、 表の内容を記載させていただきます。 項目は A1 B1 C1 D1 E1 F1 G1 日付 得意先 作業内容 区分 価格実 価格 日別小計 となっています。 2,3行目は作成してあり、行の挿入は4行目からになります。 現行、4行目は使用しない空白の欄を空けてあります。 コピーする数式 F3→F4-- =IFD3="",E3*0.75,E3) G3→G4-- =IF(A3=A4,"",SUM($F$2:F3)-SUM($G$2:G2) G2には上段の行がないため、=IF(A2=A3,"",F2) と固定の数式をいれてあります。 新規の状態でG5のセルへ=SUM(G2:G4)の合計を求める式を入れてありますが、 これは行を挿入しても選択セルが(G2:G4)から変更されません。 これもマクロで作れるようでしたら…と勝手なことを(^^;) 以上の説明でご理解いただけたでしょうか? すっかり頼りにしてしまい、お手数をおかけ致します。 ありがとうございます、宜しくお願いします。
- suzusan7
- ベストアンサー率64% (22/34)
1行挿入して B、C、F、G列をオートフィルですよね。 これだとどうでしょうか? 一応オートフィルにしてみました。 #5と同じようにしてください。 Sub sounyu() Dim R As Long ActiveCell.EntireRow.Insert R = ActiveCell.Row Range(Cells(R - 1, 2), Cells(R - 1, 3)).AutoFill Destination:=Range(Cells(R - 1, 2), Cells(R, 3)), _ Type:=xlFillDefault Range(Cells(R - 1, 6), Cells(R - 1, 7)).AutoFill Destination:=Range(Cells(R - 1, 6), Cells(R, 7)), _ Type:=xlFillDefault Cells(R, 1).Select End Sub
お礼
回答ありがとうございました。m(__)m 作成いただいたマクロで挿入&コピーはうまくいきました。 このとき、G2に入れた数式をG3へコピーすると数式の選択セルも変更されてしまうことで躓いてしまっています。 IF(A3=A4,"",SUM($F$2:F3)-SUM($G$2:G2) という数式が入れてあり、コピーをしてもA3、A4の位置関係はそのままであってほしいのですが、行の挿入によりA4がA5へと変わってしまうんです・・・ エクセルの数式の入れ方に問題があるのかもしれないのですが、修正方法がまだ見つかっていません。 お気づきの点がございましたら、また宜しくお願いします!
- kazuhiko5681
- ベストアンサー率49% (79/159)
dongurikoさん。簡単にマクロであなた様のやりたいことが実行することができました。サンプルマクロをご紹介いたします。 Sub myinsert() Dim myRow As Long '選択した行に行を挿入する myRow = ActiveCell.Row Rows(myRow & ":" & myRow).Insert Shift:=xlDown '選択した行の1行上のB列とC列の数式を挿入した行のB列とC列にコピー Range("B" & myRow - 1 & ":" & "C" & myRow - 1).Copy _ Destination:=Range("B" & myRow & ":C" & myRow) '選択した行の1行上のF列とG列の数式を挿入した行のF列とG列にコピー Range("F" & myRow - 1 & ":" & "G" & myRow - 1).Copy _ Destination:=Range("F" & myRow & ":G" & myRow) '選択した行のA列にカーソルを移動 Range("A" & myRow).Select End Sub 私がVBAで次のように操作しましたら、正常に動きました。これならば、マクロを記述したほうがよろしいかと思います。 1.VBE(Visual Basic Editor)のSheet1のモジュールに上のコードを記述 2.Sheet1のメニューバーからツール→マクロ→マクロを選択 3.マクロダイアログボックスの右にあるオプションというコマンドボタンをクリック 4.カーソルが点滅しているテキストボックスにnと入力し、okボタンをクリック後×ボタンでマクロダイアログボックスを閉じる。 5.挿入したい行を選択し、Ctrl+nを押す。するとマクロが実行される。 例えば、セル番地D3を選択後Ctrl+nを押すと、セル番地B2とC2の数式がB3とC3にコピされ、セル番地F2とG2の数式がF3とG3にコピーされてA3にカーソルが移動しました。 先程は、難しいようなことを申し上げてしまいました。私の勘違いでした。お詫び申し上げます。
お礼
たびたびの回答、本当にありがとうございます。 kazuhiko5681さんに頂いたサンプルマクロを利用させて頂きました。 挿入できました、自分で考えていた動作よりとっても良く! ただ、日付ごとの小計を出すGのセルに入れてある数式を挿入した行にコピーするとセル番号が変わってしまって希望通りの計算ができなくなってしまうんです。 数式は、 IF(A3=A4,"",SUM($F$F2:F3)-SUM($G$2:G2))となっていて、A3の日付がA4と違っていたらG3で小計を出すものです。 これに行を挿入すると参照セルも移動してA4がA5となってしまうんですよね・・・ これは普通に行を挿入しても同じ現象ですが。 コピーの貼り付けで行えば良いのでマクロでのG列の数式を省きましたが方法があるのでしょうか? これは、マクロとは関係ない質問でしたらすみません。 でも、現行でも十分に利用しやすくなりましたので!! ありがとうございました。
- kazuhiko5681
- ベストアンサー率49% (79/159)
早速補足していただきまして有難うございます。数式をコピー後A3に行を挿入したい時はA3を、A5に行を挿入したい時はA5を自動的に行いたいという風に解釈したのですが、これでよろしいのでしょうか。 もしそうであれば、選択できるマクロを書く手間を考えると、手動で選択した方が早いと思うのですが・・・・・ もしどうしても自動で実行したい場合は、その旨をお知らせ下さい。サンプルマクロをご紹介させていただきます。
お礼
こちらこそ、早々に回答ありがとうございました。 行を挿入して前行の数式をコピーするまでがマクロの記録になっています。 表の行数が入力データの量に合わせるため、入力するたびに行を増やしていきたな・・・などと思ったのですが、 Kazuhikoさんの言うように手動で行った方が良い作業なのかもしれないですね。 エクセルの扱いに慣れていない人もボタンひとつでデータ入力箇所を探さずに作業できればと考えて余計に難しいことになってしまいました。 行の挿入や数式のコピー方法を説明してあげた方が正解ですね(^_^.) 検討して「どうしても、使いたい!」となったら また、ご相談しますので宜しくお願いします。m(__)m ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
本題への解答でなくて申し訳ありません。マクロ記録をコピー すれば、下記のような事態は起こらないので不思議です。 とんでもない誤解をしていないか心配なんですがその節は お許しを。 再現テストをすると、動きません。Range(b3:c3).SelectでAutofillしたとき、行方向にしているようなので、Destination:=Range("f3:f4")は Range("b3:f3")で無いといけないのではないでしょうか。 (1)元を1行に指定して複数行(f3:f4のように)にAutofillは出来ない、元を1列にして複数列へのAutofillは出来ないのではないでしょうか。 (2)Destination:=Range("f3:f4")のf3はRange(b3:c3).Selectのb3と一致しないといけないのでは。
補足
お世話になります。 すみません、抜けている部分があったようで・・・ 下記が使用しているマクロです。 Sub Sounyu() ' ' Sounyu Macro ' ' Rows("4:4").Select Selection.Insert Shift:=xlDown Range("B3:C3").Select Selection.AutoFill Destination:=Range("B3:C4"), Type:=xlFillDefault Range("B3:C4").Select Range("F3").Select Selection.AutoFill Destination:=Range("F3:F4"), Type:=xlFillDefault Range("F3:F4").Select Range("G3").Select Selection.AutoFill Destination:=Range("G3:G4"), Type:=xlFillDefault Range("G3:G4").Select Range("A2").Select End Sub マクロを使用することに踏み込んだばかりで、 ご指摘頂いた内容を見ても、まだ理解できなくて・・・ 補足に回答できない状態で、質問するのは失礼だと承知の上でお願いしておりますm(__)m 一行追加するたびにA2を選択しています。 これを、追加した行の頭のセルを選択するようにできるだろうか?という内容でした。 質問も不明確だったようで、すみませんでした。
- kazuhiko5681
- ベストアンサー率49% (79/159)
こんばんわ。はじめまして。 >挿入した行のAのセルへカーソルがいくようにするにはどう変更するのか この場合、挿入した行のAのセルということは、セル番地がA4ということでよろしいのでしょうか。 そうであれば、最後の行のRange("A2").SelectをRange("A4").Selectと書き換えれば、あなた様の思うことが実現されると思います。
補足
質問が不明確であったようで・・・すみません。 行を追加しながらデータを入力する際に、行を挿入後、その挿入した行の頭(A列)を選択しすぐに入力作業に入れるようにしたいということでした。 A4、A5…というよりも「今、追加した行のA列」などという感じで…
- kiri_kiri
- ベストアンサー率25% (13/51)
こんばんは。 質問の意味が良くわからないのですが、Range("A2").selectはA2のセルを選択するという意味なのですが・・・ “Aのセルへ~”が何をおっしゃいたいのかが良くわかりません。
補足
質問が不適当ですみません。 行を追加後、常にA2のセルを選択するようになっているものを、直前に追加した行の頭(A列)を選択するようにしたいのです。 …こんな説明でわかってもらえるかしら…?
- 1
- 2
お礼
回答ありがとうございました。 修正していただいたマクロ、確認させていただきまた。 おかげさまでとても、使いやすい表を作成することができました。 少しでも簡単にデータ入力をと考えた小さなマクロから、大作業をしていただくこととなりお手数に感謝しています。 私はもちろん、社会復帰でがんばろうとする大お姉さま方も、PC恐怖症で仕事嫌いになることも減少すると喜んでます! また、宜しくお願い致します。 ありがとうございました。