- 締切済み
エクセルのマクロについて
是非ご教示いただきたく投稿いたしました。 とても素人レベルな質問かと存じますが、 例えば、A1にて数字の1を入力し、それをA10までコピーします。 A11から数字の2にし、A20までコピー。 A21から数字の3にし・・・ という繰り返しを実施するにはどのようなマクロのコードを入れればよろしいでしょうか? 勉強のために是非ともお詳しい方、お助けくださると幸いです。 よろしくお願い致します。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- ubku
- ベストアンサー率37% (227/608)
こういうことでしょうか? 一例を挙げます。 Sub MyMacro() Dim r As Long Dim num As Long num = 0 'For r = 1 To ActiveSheet.Rows.Count For r = 1 To 100 If r Mod 10 = 1 Then num = num + 1 Cells(r, 1).Select Selection.Value = num Selection.Copy Range(Selection.Offset(1, 0), Selection.Offset(9, 0)).PasteSpecial xlPasteAll End If Next r Application.CutCopyMode = xlNone End Sub シート全体に対して処理をすると数分~数十分かかると思われるので、 A100までで処理を打ち切っています。
#4です。すいません。質問に対する回答ではありません。 [#7さんへ] >「マクロで書かなきゃ」という固定観念に囚われてしまうと「手で書いた方が早い部分は手でやった方が早いのに、なんで時間をかけてマクロなんか作るの?マクロ作ったって、1度しか使ったら、もう2度と使わないのに、なんでマクロにするの?」 これは、その通りですよ。 ただ#4のコードくらいなら、VBエディターの開け閉めを考えても、1分以内で済む。だいたいINT関数やRAW,COLUMUN関数まで知ってるユーザーがどれくらいいるのか、考えた事はないのだろうか?。 関数を知らなければ、「誰かが調べてくれるのを何時間も待つ」か「何時間もかけて自分で調べなきゃいけない」という事態は、あり得ますよ。結局、数式もマクロも訓練と慣れが前提で、対費用効果を考えたら、どっちも万能ではあり得ない。 そしていずれにしろ1,2分の事なら、本人に任せたらどうですか?。質問者の方は、これだけのためにマクロを知りたいようでもないようなので。 マクロが数式編成より良いと思える点は、マクロの方が、基本的におぼえなければならない事項が少ない点だ。つまり必要最小限の学習で、後は応用力の問題になる。また「最悪こうすれば実現できる」という方法を持ってるのは、とても重要だ。 しかし一般には、マクロはプログラミングなので時間がかかる。これは事実だ。よってケースバイケース。それを判断できるようになるのも、訓練と慣れ。いずれにしろ楽は出来ない(^^;)。 ところで、次のような数式編成の方法もある。 (1)A1に1を入力する。 (2)名前ボックスで「A10」と「A20」を指定し、「A10」と「A20」に「c」でも入力しといて、番兵を立てる。 (3)Ctrl+HomeでA1に戻る。 (4)A2に「=A1」と入力し、A2をCtrl+Cでコピー。 (5)A2にいたまま、Ctrl+Shift+↓カーソルでジャンプ選択。そのままリターン。 (6)Ctrl+↓カーソルでA10に行き、1行下がってA11に「=」を入力した後、そのままCtrl+↑カーソルを2回行ってA1に行き、「+1」と追加入力して、そのままリターン。 (7)A11をCtrl+Cでコピーし、(5)の要領で、A11~A20まで貼り付け。 (8)↑カーソル,↓カーソルと連打して、(5)の要領でA11~A20をジャンプ選択。そのままコピー(Ctrl+C)。 (9)Ctrl+↓カーソルでA20に移動。A21に下がり、Ctrl+Vで貼り付け。 (10)Ctrl+↓カーソルでA30に移動。A31に下がり、ファンクションキーF4を押す。 後は(10)を繰り返して、「好きなだけコピーして(^^)」という事になる。こっちの方が、オートフィルなんか使うより、正確で速い。慣れたらせいぜい20秒だ。しかもA1の値の変化にも対応できる。 ここまで考えて発言したかい?。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19840)
追記。 以下の方法で「マクロに頼らず、すべて手作業で、同じ結果」を作れます。 1.A1セルに1を、A11セルに2を手入力します。A2~A10、A12~A20は「空白のまま」で構いません。 2.A1~A20の20個のセルを範囲指定します。 3.範囲選択枠の「右下の黒い■」を左ボタンでドラッグして、A100まで「連続データのフィル」をします。 すると、A1に1、A11に2、A21に3、A31に4…と言う状態で、10セルおきに数値が入ります。 4.A1~A100が範囲指定されているので、そのまま「Ctrl+C」でコピーします。 5.A2セルにカーソルを置いて「編集」「形式を選択して貼り付け」「貼り付け:すべて」「演算:しない」「空白セルを無視する」「OK」で貼り付けします。 6.A2~A101が範囲指定されているので、そのまま「Ctrl+C」でコピーします。 7.A4セルにカーソルを置いて「編集」「形式を選択して貼り付け」「貼り付け:すべて」「演算:しない」「空白セルを無視する」「OK」で貼り付けします。 8.A4~A103が範囲指定されているので、そのまま「Ctrl+C」でコピーします。 9.A8セルにカーソルを置いて「編集」「形式を選択して貼り付け」「貼り付け:すべて」「演算:しない」「空白セルを無視する」「OK」で貼り付けします。 10.A8~A107が範囲指定されているので、そのまま「Ctrl+C」でコピーします。 11.A10セルにカーソルを置いて「編集」「形式を選択して貼り付け」「貼り付け:すべて」「演算:しない」「空白セルを無視する」「OK」で貼り付けします。 12.A1セルをコピーして、A2~A9セルに貼り付けます。 馴れれば、この位の作業なら「1分半」で終わります。「1分半」で、同じような事をするマクロが書けるでしょうか? 誰かが作った既存のマクロをコピペして使えば1秒で終わるでしょうが「誰かが作った既存のマクロ」が無ければ「誰かが作ってくれるのを何時間も待つ」か「何時間もかけて自分で考えなきゃいけない」です。手作業でやれば1分半で終わるのに。
#4です。 Cell("B3"),Cell(3, 2)と書いたところは、Cells("B3"),Cells(3, 2)とsを足して下さい。最初はエラーが出ると、焦りますからね(^^;)。 数式が良いか、マクロが良いかは、人にも(慣れにも)業務にもよりますよ。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19840)
>また変な質問なのですが、セルに=INT((ROW()-1)/10)+1 と打ち込むのもマクロなのでしょうか? こういう作業は「マクロで書いて、動作試験して、マクロを実行して」と、まだるっこしい作業で無駄に時間を費やすより「直接、手で入力しちゃった方が早い」ので、手で直接セルに打ち込みます。 「マクロで書く必要がある」のは「何度も繰り返して同じ処理をする必要がある場合だけ」にしましょう。 但し「何度も繰り返して同じ処理をする」と言っても「基本となる処理を1回だけやって、後はコピーペーストで済む」と言う場合も、マクロなど使わずに「直接、手で入力しちゃって、あとは、手作業でコピーペーストした方が早い」です。 確かに「マクロは何でも出来る」のですが「マクロで書かなきゃ」という固定観念に囚われてしまうと「手で書いた方が早い部分は手でやった方が早いのに、なんで時間をかけてマクロなんか作るの?マクロ作ったって、1度しか使ったら、もう2度と使わないのに、なんでマクロにするの?」って話になっちゃいます。 マクロは「繰り返しだけども、微妙に書く内容が毎回異なる」とか「繰り返しだけども、書く内容が、どこかのセルの値に左右される」とか「手作業では出来ない場合」だけにした方が良いです。 ご希望の「A1~A10に1を、A11~A20に2を、A21~A30に3を…」という処理は「何度も入力を繰り返す必要がありますか?一度やったら「それっきり」ではありませんか? 「一度やったらそれっきり」の物を、わざわざマクロで書くなんて、馬鹿臭いです。 「ゴールが同じ」なら「マクロなんか使わなくても、手早く出来る方法で済ます方が効率が良い」です。
#2です。 記録したマクロを見た事はあるわけですね。VBエディターを開くのはOKと判断しました(^^)。ちなみにマクロボタン→マクロ選択→編集ボタンで現れる画面がVBエディターです。直接開くなら、Visual Basicボタン(VBAとか書かれてる場合もある)を押します。 VBエディターを開いて下さい。VBエディターのメニューで、挿入→標準モジュール、とやって下さい。新しい画面が開き、左側のVBA Projectツリーに「標準モジュール-Module1」などと追加されるはずです。いま開いた画面がModule1です。 Module1に、これからプログラムを書きます。マクロって実は、Office製品(Excelなどの)内部で作るVBAプログラムの事なんですよ。VBAとは、Visual Basic for Applicationというプログラム言語です。まずSub Routine構造を作ります。 Public Sub Main() End Sub と書きます。マクロの記録では、Sub Macro1~End Subが自動で作られますが、それを手動でやりました。Subの後のMainなどをサブルーティン名といい、これがマクロ名としてシートの方で表示されます。プログラムにやらせたい事は、Sub Main~End Subの間に書きます。 機械は高速な繰り返しが得意です。それでどんな言語でも、Loop構造をかけるようになっています。Sub Main~End Subの間に、For Next Loopを書きます。 For i = 1 to 10 Next i 上記はメニューの実行ボタンを押すと、i=1,2,3,・・・,10と変化しながら、10回繰り返し動作が起こります。よってFor~Nextの間にさせたい事を書けば、それが10回繰り返されます。 基本的に後は、Excelのオブジェクト階層をおぼえるだけです。オブジェクト階層といったって結局は、Excelの新しい機能をおぼえるのと、やる事は変わりません。最初は数式をおぼえましたよね?(^^)。 階層に現れる代表的オブジェクトは、シート(sheet)のセル(cell)です。例えば、B3セルに1を入力したいなら、 Cell("B3") = 1 と書くだけです。Bが列インデックス,3は行番号なのはご存じと思いますが、アルファベットで位置指定するのは、繰り返し作業時には不便です。それで、列番号も使えます。 Cell(3, 2) = 1 という書き方も可能です。2列目がB列、ってのはOKですよね?。さっきと列と行の順序が入れ替わりますが。 さてご質問のプログラムは、以下になります。 Counter = 0 For i = 1 to 10 For j = 1 to 10 Counter = Counter + 1 Cells(Counter, 1) = i Next j Next i 上記の意味は、ちょっと考えればわかると思います。A列(1列目)のCounter=1~100行が、1,1,・・・,2,2,・・・,3,・・・・・・,10,10,・・・,10 と埋まると思います。 [注意(重要)] 上記のプログラムは、現在表示されているシートに対して実行されます。現在のシートにデータがある場合、データは上書きされます。 かつマクロの実行結果は、Undoで取り消せません。
- kagakusuki
- ベストアンサー率51% (2610/5101)
>A1にて数字の1を入力し、それをA10までコピーします。 というやり方ではなく、A1:A10の範囲内のセルにまとめて1を入力するというやり方の方が簡単です。 尚、御質問文には、どこまで入力するのかという事が説明されておりませんので、取り敢えずA1セル~A90セルに1~9を入力する場合に関して回答させて頂きます。 Sub Macro() Dim i as Long For i = 1 To 9 Range("A" & ( i -1)*10+1).Resize(10,1).Value = i Next i End Sub
一つの方法は、マクロの記録をオンにして、書かれている作業を手でやり、終了後に記録されたマクロを調べる事です。 ただ記録されたマクロは、けっこう融通の利かない作業手順になっているので、基本ラインは自分で書いた方が、自由度は大きいです。 そこで質問なのですが、VBA(またはVB)における、For Next ループなどの使用法はご存知でしょうか?。それによって回答が変わりますし、VBAエディターの開き方は大丈夫ですか?(^^)。
お礼
ご指導ありがとうございます! 確かにマクロの記録も便利なのですが、おっしゃるとおり、融通が利かないのが難点でした。 FOR NEXTループというものがあるのですか? エディタ諸々そこらへんがわかってないので、こんな質問をしてしまったのかもしれません。お手数かけます汗
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19840)
A1に以下の式 =INT((ROW()-1)/10)+1 を入力して、必要なだけ下方向にコピーして下さい。 コピーしたら「A列全体」をコピーして、そのまま、A列全体が範囲指定されている状態で「編集」「形式を指定して貼り付け」「値」で貼り付けします。
お礼
ご指導ありがとうございます! また変な質問なのですが、セルに=INT((ROW()-1)/10)+1 と打ち込むのもマクロなのでしょうか? とても明瞭なご説明痛み入ります。 他の方の指示と平行して試してみます。
お礼
ご指導ありがとうございます! こんなやり方があったのですね。。。 つい最近からマクロを勉強し始めて多くを学ばせてもらいました。 早速試してみます!