• ベストアンサー

マクロでのカーソル移動

15年程前にLotusでやっていたMacroの復活戦中です。 Visual Basicへの進化に感嘆しつつ、初心に返って練習中、お助け下さい。 週次に発表される外部Webからエクセルにデータを取込んで表を作成しようとしています。 第1週の分は上手くMacroで自動取込みできましたが、その次の行に第2週分を取込もうとすると、第1週分に上書きされてしまいます。 原因は、Macro作成中に『→』、『↑』を押して右上のセルに進ませるのですが、右上には進まず、移動後の固定セル番号に行ってしまうためと解りました。 昔のMacroでは、{Right}{Up}と単純だったのですが、さてこの便利すぎる現代のMacroではどうすればよいのか、ご教示お願い致します。

  • ROYFF
  • お礼率77% (216/279)

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

マクロの自動記録には「絶対記録」と「相対記録」があります。 バージョンによって少し違うかも知れませんが、Excel97だとマクロ記録時に出る記録終了ツールバーの右側のボタンを押してから操作をすると相対で記録出来ます。 '絶対記録 A1を選択した状態で ↓ キーを押した Sub Macro1()  Range("A2").Select End Sub '相対記録 適当な場所を選択した状態で ↓ キーを押した Sub Macro2()  ActiveCell.Offset(1, 0).Range("A1").Select End Sub 絶対は「A2」を選択、相対はアクティブセルから1行下、0列右を基点(A1)として選択ってな意味でしょうか。 マクロ記録の相対記述と絶対記述を組み合わせて編集すれば大抵のことは出来ます。 他の方から既に答えは出てますが下記はA列最後行 + 1行目のセルを選択する例です。自動では記述出来ませんが慣れてくると組み合わせて書換えられるようになると思います。 Sub aaa()  Range("A65536").End(xlUp).Offset(1, 0).Select End Sub

ROYFF
質問者

お礼

絶対記録/総対記録の概念、よく解りました。 この後のお二人の議論のおかげで、Range("A1")の使い方も解りました。 このようにして一つずつ知識と経験を積上げて行くつもりです。 ありがとうございました。

その他の回答 (8)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.9

またまた、ROYFFさん ごめんなさいね。 「構文が変みたい」は、表現が適切でなかったようです。ごめんなさい。 「マクロの記録」で生成されたコードということが分かればそれで納得です。 普通は、あのような記述はしないと思います。 「マクロの記録」は、無駄なコードが一杯入ります。時によっては生成された コードで実行エラーになる場合もあるようです。 質問者にとって分かり易く、簡潔なコードで回答すれば、それで良いのでは ないでしょうか。 それこそ、ムダなレス? 失礼しました。 これで終わります。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.8

ROYFFさん、ごめんなさい。ja7awuさん宛です。 > ここを見た多くの方、特に初心者の方が、このように記述するものと思ってしまう > ことも考えられます。 「このように記述するものと思ってしまう」も何も、Excel97で相対参照 自動記録をするとこう記述されるんですよ。(^^; 他のバージョンでは違うのかな? ja7awuさんのExcelではどうでしょう? > そういうことで、書き込むべきか迷ったのですが、やはり正しい内容を掲載すべき > と思い、あえて書き込みしました。 ja7awuさんは、この記述が正しい内容ではないとおっしゃるのですね? 自動マクロの記述は省略できる記述も多いですが、「間違った構文」という認識は私にはありません。不要な記述という認識はありますが、、、 Sub Macro1()  Range("A1").Select  ActiveCell.Offset(1, 0).Range("A5").Select End Sub は A6 を選択するので、ActiveCell.Offset(1,0) = A2 を A1とした場合の A5、つまり A6 を選択するものと私なりに解釈しました。「基点(A1)として選択」について断定した言い方をしたつもりはありませんでしたが、あきらかに間違いなら謝ります。 ただ、ja7awuさんは「Range("A1")」は省略して書けるとか言うのではなく、「ちょっと構文が変みたい」とおっしゃっています。マクロ記述で書かれる構文が変である根拠を書かれた方がみんなのためにも私の勉強にもなります。 > やはり、このような場合は、黙っていた方がいいのでしょうか? あきらかに「間違っている」なら訂正すべきでしょうね。 ただ、今回は「構文が変」と言う指摘に納得出来てないので説明頂きたいです。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.7

質問者のROYFFさん ごめんなさいね。No.6のpapayukaさんのレスに対してですが・・・ > 私が気に入らないのでしょうか? 決してそんなことはありません。 回答者が、どなたであるかは意識しておりません。 内容を見ているだけです。 「ケチ」と言われたのは心外ですが・・・ ここは、質問された方ばかりでなく、多くの方が見ている公共のサイトであると 認識しております。 > ActiveCell.Offset(1, 0).Range("A1").Select に対して「基点(A1)として選択」とありましたので、基点をこのような記述で 指定するのかな? と思いテストしてみたところ、そうでもないようです。 ここを見た多くの方、特に初心者の方が、このように記述するものと思ってしまう ことも考えられます。 そういうことで、書き込むべきか迷ったのですが、やはり正しい内容を掲載すべき と思い、あえて書き込みしました。 やはり、このような場合は、黙っていた方がいいのでしょうか? 今のところ私は、回答者にはともかく、質問者の方のために書き込みすべきと 思っています。 もし、私の回答が間違っていたり、疑問なことを書いたりしていたら忠告して 頂いた方が、有り難いと思いますが・・・

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

#4です。 ja7awuさん 良く人のレスにケチを付ける方ですね。 私が気に入らないのでしょうか? > ちょっと構文が変みたいですが・・・ Range("A1") が意味が無いと思いますよ。 ご指摘の点は気づいていますが、Excel97の自動記録で「相対参照」を選びで ↓キー押した動作を記録したらこうなっただけです。(他のバージョンでは解りません) 絶対と相対の記録マクロを対比して例としてあげているのに、内容を編集したら混乱すると思うのですが、如何でしょう?

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.5

うぅ~ん。 黙っていた方がいいのかな? でも・・・ No.4レス > Sub Macro2() > ActiveCell.Offset(1, 0).Range("A1").Select > End Sub > 絶対は「A2」を選択、相対はアクティブセルから1行下、0列右を基点(A1)として選択ってな意味でしょうか。 うぅ~ん? ちょっと構文が変みたいですが・・・ Range("A1") が意味が無いと思いますよ。 ActiveCell.Offset(1, 0).Select でいいと思いますが・・・。

ROYFF
質問者

お礼

このご指摘のおかげで、Range("A1")の意味が解りました。 この後のお二人のやり取りを拝見して、A1は開始セルの場所を示しているので、常にA1ではないと理解できました。 構文というよりも変数についての補足をして頂いたのですね。 お二人の論争を理解しようとした事を含め、勉強になりました。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

>第1週の分は上手くMacroで自動取込みできましたが 短いのなら、Macroが現状どう言うコードなのか、補足に掲載されてはどうでしょう。多分マクロの記録のコードを一部修正して動かす類のご質問かとおもいます。Macroの内容がわからないと、適切に答えられないと思います。 #1、#2の回答とも当方の思いこみの回答でしたね。 ちなみに、アクチブセルの直ぐ下の行はActiveCell.Offset(1, 0).Selectで捉えられます。

ROYFF
質問者

お礼

折角ご回答頂いていたのに、仕事が忙しかったため見るのが週末になってしまいました。 この後に頂いた方々の回答とあわせ、問題は絶対記録を使っていた事に起因するもの、ActiveCell(相対記録)を使えば目的を達せられることが解りました。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

#1です。拙いものですが、下記を実行してみて、感じを掴めませんか。 Cells(i,j)のiを1づつプログラムで変化させます。 Sub test01() d = Range("a1").CurrentRegion.Rows.Count r = d p01: '-----endと入れると終わる x = InputBox("データ") If x = "end" Then Exit Sub Cells(r, 1) = x r = r + 1 GoTo p01 End Sub Range("a1").CurrentRegionはデータの入ったセルの (途中スペース行無しの)塊の最上行を指定しないと予想外になると思います。例えば第1,2行が余白スペース行である場合はRange("A3")などとする必要があります。注意。 >進むのに『↓』を使うと、・・・ 一般に、バッチ的プログラムを実行中に、手(人間の)操作を組合すタイプのプログラムは、学習が進んでからになると思います。VBで、イベントプロシージュアと一気進行Subプロシージュアの2タイプあるうちの、前者は次ぎの段階で、組み合わせとなると更にその次だとおもいます。

ROYFF
質問者

補足

再度のご回答ありがとうございます。 考え方は解りましたが、単純にはできないのですね。 マイクロソフトが行うソフトの改良が『余計なおせっかい』をしてくれる例だと思います。 ({Down}なら単純なのに、とまだ精神進化していない私です) 工夫してやってみることにします。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

データの入った最下行を自動的に(プログラムで)、捉えれば、その+1行(次の行)に追加データをセットすれば 過去のデータに上書きすることはなくなります。 こう言う問題ではないでしょうか。 私は下記(1)を使ってますが、それぞれ欠点も考えられますのでしらべてください。(VBA CurrentRegion、VBA End,VBA UsedRangeで各々WEB照会すれば) (1)CurrentRegionを使う Sub test02() d = Range("a1").CurrentRegion.Rows.Count MsgBox d End Sub (2)エクセルシートの最下行65536行よりEND CTRL+↑で行う操作のコード Sub test02() Range("a65536").End(xlUp).Select End Sub (3)UsedRangeを使う などが考えられます。 ---- LOTUSのマクロとはVBAは変っています。 (1)マクロと言う言葉使いはやめVBAに切り替え (精神的なもの) (2)、{Right}{Up}など操作を記号で記述する方式の思考からの脱却を提案します。 本問も忙しい人が一見してLOTUSの質問かと誤解されかねないと心配になりました。

ROYFF
質問者

補足

早速のご回答を頂きありがとうございます。 (2)の方法を使ってデータの入った最下行へは行けるのですが、そこから一つ下に進むのに『↓』を使うと、Macroでは固定セル番号で認識され、いつも同じ場所から上書きされてしまいます。 もし『その+1行(次の行)』に移動する方法を教えて頂ければ大変助かります。 PS.今後は『VBAへの精神的切替』を意識する事にします。

関連するQ&A

  • エクセル マクロ セルを縦に結合したいです。

    現在、Visual Basicにてコードを作成中です。(初心者です。) 現時点での出来ること 5列目の2~10行目に何か入力されれば その隣のセルに「お疲れ様です」と入力される(ここまではコード出来てます。) 例:B5セルに何か入力があればC5セルに「お疲れ様です」と入力される。   C5セルに何か入力あればD5セルに「お疲れ様です」と入力される・・・ といった内容です。 そのあとやりたい事(ここからコード出来ません) B5セルに何か入力があればC5セルに「お疲れ様です」と入力された後 C5~10行目を縦に結合し、文字を縦書きにする。 C5セルに何か入力があればD5セルに「お疲れ様です」と入力された後 D5~10行目を縦に結合し、文字を縦書きにする・・・ といった内容です。 一応コード下記に載せます。 Sub macro1() Dim a As Variant Dim i As Long Set a = Worksheets("sheet1") For i = 10 To 2 Step -1 If Len(a.Cells(5, i).Value) > 0 Then 'もし、5列目の2~10行目に何か入力されれば a.Cells(5, i).Offset(0, 1).Value = "お疲れ様です" Exit For End If Next i End Sub すいませんがコード記載よろしくお願いいたします。 回答よろしくお願いします。

  • ExcelVBAとVisual Basic

    30年位前に特殊用途の大型コンピュータのプログラミングの経験はありますが、パソコンではN88 Basicで簡単なプログラムを作成した経験があります。当時はデータの入出力にフィールド定義をしなければならずとても面倒だったことを覚えています。 その頃Lotus123というアプリケーションソフトが出現し、データの入出力が格段に簡略化されて驚いたことがありました。 しかし直後からプログラミングとは全く関係のない仕事になったこと、DOSからWindowsへの進歩に対応できなかったことetcにより、今では全くおばちゃんと変わりないパソコンユーザになってしまいました。 退職した今、ある事情から簡単な販売管理のプログラム(スタンドアローン)を作成する必要に迫られ、どのアプリケーションソフトがいいのか現状を調べているところです。 Lotus123の記憶からExcel VBAが簡単かなと思ってインターネット検索しサンプルを見たのですが、操作者(PCには無縁だった人に最初から操作を教えてかかる前提)にExcelの知識が必要だなと感じたことと、画面がちゃちに感じました。 たまたまMicro soft社がVisual Web Developer 2005 Express Editionを無償で配布するというニュースを目にし興味を抱いています。これはVisual Basicを内包しているようです。 質問はExcelVBAで作成したものとVisual Basicで作成したものとの操作性、見栄えについてですが、お考えをお教えください。

  • マクロでのカーソル移動

    標準モジュールにて、sub auto_open()で始まるマクロで、Enterキーで次々に(IF文、ElseIF文)カーソル移動の方法を教えていただきました。 このマクロの終了後はカーソルが最後の指定場所で止まったままです。 これを、このマクロの終了後続けてEnterキーを押せば普段どうりに一つ下のセルに移動させるように出来ますでしょうか。よろしくお願いいたします。(QNo.3558251関連)

  • マクロでのカーソル移動

    ブック内の全シートを対象としたマクロで、たとえば (A1)セルに入力後Enterで(C1)セルにカーソルを移動させるにはどのように記述したらよいでしょうか。よろしくお願いします。

  • マクロ、カーソルの相対移動

    下記マクロはカーソルの相対移動で教えいいただいたものです。 セルに値を入力しないで、Enterを押下した時もこのように動作させるためにはどのように記述したらいいでしょうか。教えてください。よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) if Target.Column = 2 Then Cells(Target.Row,5).Select if Target.Column = 5 Then Cells(Target.Row,7).Select if Target.Column = 7 Then Cells(Target.Row + 1, 2).Select End Sub

  • マクロでcellを選択しカーソルを移動させたい

    表でマクロをつかって特定の記号の表示されたCELLにカーソルを移動させたいのですが、どんな記述したらいいでしょうか?

  • カーソルが移動しなくなってしまうんです。

    東芝ノートパソコン、windows 2000 を使用していますが、 カーソルが突然固まってしまって、操作出 来なくなってしまいます。その度に電源を落とさなければ回復出来ません。中古品なので半分諦めていますが、もし解決法をご存知の方がいらっしゃいましたら、ご教授ください。

  • カーソルが突然移動する。

    Wordで文字を入力している時、突然カーソルが飛んでもないところに移動してしまいます。よくスペースを押した時によく起こるのですが、なんとも言えません。これはなぜでしょうか?あと回避方法はあるのでしょうか? ・Thinkpad/Win2k/Word97 ・よく英文を入力している時に起こるような気がする。

  • 簡単なカーソルの移動できますか

    カーソルの簡単な移動に関して教えてください。 仮に”A1”に入力後”C1”に入力その後”A3”に入力する過程が各シート毎にあるとします。 毎回同じセルに入力のために”ennter”を押しながらカーソルを移動しています。 何か、セルに入力後、カーソルが次のセルに移動する手っ取り早い方法はありますか? 少しでも仕事を簡素化しようと考えているため、皆さんの力をお借りしたいのです。

  • カーソルの移動

    ワード2002を使っています。普通横書きで使っていて、マウスを任意の場所でWクリックするとカーソルが移動します。ところが縦書きの場合しないのでいろいろ調べましたがわかりませんでした。元々縦書きではできないのでしょうか。できるようにする方法があれば教えてください。(クリックアンドタイプ編集はチエックがついていました。関係ないかも知れませんが) ・OSはXP ・ワードは2002 ・NECのLC500/3使用 ・ATOK2008版

専門家に質問してみよう