>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり 下記の「*」部分に変数を入れてます。 Sub TestFind1() End Sub, こんなので好いですか? 以下の場合、貼り付け処理でエラーになります。 また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。 ファイルを閉じた時にマクロを自動実行させる方法は「Workbook_BeforeClose」と「Auo_Close」の2つあります。  c.Offset(0, 1).Value = 0 というものがよく出てきますが、これは何でしょう? iとjは普通の変数(VBA以外の言語における変数と変わらないという意味で)としてプログラミングすることができます。iとjの両方とも1から5と固定しましたが、これらを算出するコードを作りそこから取得するといったことも可能です。 RangeとCellsを使ってセルを指定する方法.     c.Offset(0, 1).Value = 0 とコードが書けないです。 こういうものですか? A列     B列     C列       お問合せはこちらでも受け付けています。 ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。 しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。  Application.ScreenUpdating = True 6 [はい]ボタンが押された : vbNo: 7 [いいえ]ボタンが押された ... Excel VBA LongやString、変数のデータ型と型の指定方法 . Range(Cells(8, 1), Cells(1587, 2)).Select            SearchFormat:=False) End With マクロVBA入門者が、まず最初につまずくのが、このDimで変数を宣言することでしょう。変数とは、数値や文字列など(すなわちデータ)を一時的に格納する入れ物 と良く説明されますが、まずはこの考えで良いでしょう。この入れ物には、いろいろなタイプの入れ物があります。 どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。 私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。 上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。 Range("cells(8,s+2)").Activate >でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗   I = I + 1       c.Offset(, 1).Value = 0 Sub Sample1() また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。 (adsbygoogle = window.adsbygoogle || []).push({}); ExcelVBAとアウトドアとゴルフが趣味の30代のおじさんです。 過去の質問を参考に下記のように入力するとコンパイルエラーとなり上手くいきません。。 Withステートメントを使えばスッキリ纏めることができます。 ※イメージ >しました。’global’オブジェクト) ホルダ  R-134256 このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。 ご存じの方、式の書き方をお教え願えないでしょうか。, エクセルの行の挿入の仕様で、挿入によりずれた行を参照している数式はすべて修正されます。 '-------------------------------------- 作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。 このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。 セルのコピー、または切り取りを行っていると思います。 エクセルのセルにRC(~~)と書いたらエラーになるんです。。 Sub Sample() ActiveSheet.Paste RC2やRC[-5]とか、数字自体じゃなくて、数式?を入れたいのです。 ThisWorkbook.Name   .Range(.Cells(8, 1), .Cells(1587, 2)).Select you can read useful information later efficiently. # Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。 '複数ある場合(パターンを使った方法)            SearchOrder:=xlByRows, _ (例) #3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。 Set A = Worksheets("Sheet1").Cells.Find("A") スペース入っていませんでした。。。 やりたいことは どういう意味のものかわかりません。 Application.CutCopyMode = False ≪例1≫ Application.Goto Reference:="R1C1:R[" &***& "]C1" Sub OpenFolders() >しかし、何が原因でエラーになるか自分では分かりません。 >Set A = Worksheets("Sheet1").Cells.Find("A") ------------ 現在書け... 今回はExcelVBAで処理中の画面を更新しない方法と使いどころをご説明します。 >過去の質問で考えてみたのです >そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ 新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。 With Sheets("Sheet2") Range("A2").Select   Const MYTXT As String = "A" (「Option Explicit」が表示されるには、Excelを再起動しなければならない場合があります。), このようにデータ型を定義すると初期化しなくても初期値が指定されますが、読みやすさなどを考えると初期化して明示することをオススメします。, オブジェクト型についてはSetステートメントを使って以下のように初期化、代入する必要があります。, このサンプルコードではInteger型の変数iとString型変数strとDate型変数dtを宣言、定義しています。そして「=」記号を使用してそれぞれの変数を初期化し、出力表示しています。, オブジェクト型やオブジェクト型の代入については、こちらのサイトで詳しく解説しています。, このサンプルコードでは、Integer型の配列arrを宣言、定義しています。arr(3)と記述していますので、要素数は4となります。, そして、各要素をFor文を使って初期化しています。なお、サンプルコードでは配列の要素数を調べるためにLBound関数とUBound関数を使用しています。, LBound関数は引数に指定した配列で使用できる最も小さいインデックス番号を返します。UBound関数は引数に指定した配列で使用できる最も大きいインデックス番号を返します。, 配列の使い方、LBound、UBoundの使い方についても、こちらのサイトで詳しく解説しています。, 変数は宣言によって使える場所が限られます。これを変数のスコープ(適用範囲)といいます。, SubプロシージャやFunctionプロシージャなどのプロシージャ内で使える宣言なのか、それよりも大きいモジュール内で使える宣言などがあります。, ちなみにこれまでお伝えしてきた変数はすべてプロシージャ内で宣言されていました。プロシージャ内で宣言された変数は宣言したプロシージャ内でしか使用できません。, このような変数をプロシージャレベル変数といいます。これに対してモジュール内で宣言されているが、どのプロシージャ内にも含まれていない変数をモジュールレベル変数といいます。, モジュールレベルの変数はそのモジュール内のどのプロシージャからも使用することができます。, ただし、ほかのモジュールから使用することができません。ほかのモジュールでも使用できる変数はPublicステートメントを使って宣言します。, モジュールレベル変数やパブリック変数は使える範囲が広いため便利ですが、その分多くのプロシージャやモジュールから意図せず値を変更される危険性やバグを生む原因にもなります。, などが上げられます。確かに、業務効率化はどこの企業も目指していて、需要が高いように見えます。ただ、VBAを扱えることが強みになるかといわれると、すこし疑問があります。, VBAは基本的にエクセル上でしか使用することができません。しかし、最近では社内書式をスプレッドシートで管理している企業も増えており、今後エクセル自体の需要が少なくなってしまう可能性も考えられます。, そうなってしまうと、VBAを習得しても活躍の場が限られてしまいますよね。そう考えると将来的にVBAの需要はあまり高くないといえます。, ではVBAを学んでいる人はどうすればいいのでしょう。VBAの将来性や今後の対策などをこちらの記事でまとめているのでぜひご確認ください。, 変数の宣言やデータ型の定義、データ型の種類、値の初期化・代入の方法などについてお伝えしてきました。そのほかにも配列型の宣言・定義・初期化、変数のスコープについてもお伝えしました。, 変数を使いこなせるとVBAをより広い範囲で使っていくことができるようになるので、使いこなすことができるようにこの記事を何度も参考にして下さいね!, 熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。  Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★ #3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。            SearchDirection:=xlNext, _ 例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas 開くフォルダを変えたいときは targ に与えるパスを変更します。 いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。 ≪例2≫     FirstAdd = c.Address End Sub, 始めまして、VBA初心者のものです。 そのため、頻繁に画面の更新が行われる処理時には、意図的に画面の更新を停止させることで処理速度を... Excel VBA 複数のファイルのデータを1つのファイルの1シートにまとめる方法.  Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _ ActiveSheet.Paste 商品名  商品番号  コード ActiveWorkbook.Name とりあえず実用性も踏まえました。 また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。     Do Application.CutCopyMode = False とすると、行の挿入をすると Sub 繰り返し() Range(HENSU).Borders.LineStyle = True #3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。 Dim c As Range End Sub            MatchCase:=False, _ ------------ Sub TestFind3() .HasTitle = True 上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。 というわけです。            MatchCase:=False) エクセル2003です。, INDIRECT関数でできますよ。 とりあえず実用性も踏まえました。 Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select  Application.ScreenUpdating = False  MsgBox ("完了") Range("A2").Select どうぞよろしくお願いします。, 部品表というブックがあります エクセル入門・初級編  xlBook.Close このシートの見出しが多いときは、色分けして目立たせたい事... 今回は処理速度の改善や、高速化方法についてご説明します。 この処理を行うと指定したシートへ強制的にとんでしまいます。。。   Worksheets("シートA").Activate というわけです。            LookIn:=xlValues, _ これをVBAで書いてみましょう。ここでは、とっても基本的な書き方から、ちょっと変わった書き方まで、思いつく範囲で書いていきたいと思います。全部で12の方法で書いてみます。ちなみに、一番短いものは、1行で書けます(Subの行とEnd Subの行は除いて)。, 目次を見ちゃうと書き方がわかってしまうかもしれないので、ちょっと考えてみたいという人は、ひとまずこの下にある目次を見ずに考えてみましょう。, まずは、王道中の王道。For文を使ったものですね。たいていの人が一番初めに思いつくのはこれだと思います。, 特に解説はいらないでしょう。一番オーソドックスな書き方で、テキストで問題として出題されていたら、これが模範解答として載るはずです。これが書けないと、VBAが使えるとは言えません。「マクロの記録」から頑張って抜け出しましょう。, つまらない言い換えですが、繰り返しといえば、For文とこれです。一般的なプログラムではwhile文ですが、VBAの場合は、"Do Loop"になります。, ただの言い換えでは面白くないので、セルの指定方法を少し変えてみました。i番目のセルを指定するときには、Cellsを使うことが多いと思いますが、上のようにRangeを使って書くこともできます。個人的にはあまりこういった書き方はしないのですが、どの列を指定しているかがわかりやすいので、このように書く人もいます。, 繰り返しというと、For文かDo Loop文を使うのが一般的ですが、こういう書き方もできなくはないです。, 現在のプログラマーでわざわざGoTo文を使う人はいないかもしれません。昔は誰もがスパゲティコードに苦しめられましたが、GoToはそれを生み出す原因の一つですからね。ただ、VBAでは、エラー処理などの時に、GoTo文を使う場面は出てきます。そういう意味では、GoToは覚えておくべき事項ですが、今のような処理の時には普通は使わないでしょうね。現実的ではない書き方です。, GoToのあとにあるのは、行ラベルです。設定した行ラベルに飛ぶことができます。上の例では「MyLabel:」に飛んでいくということですね。ラベルは特に何か処理をするわけではないので、一度目は素通りするだけです。その後、GoToのところまで来ると、ラベル行に戻ってから再度処理が進みます。なので、For文と同じような処理の流れになります。, 「On Error GoTo」とは、エラーがあったときに、そのあとに指定する行ラベルにジャンプするということです。エラーが発生すると、通常はエラーメッセージが表示されて処理が止まってしまいます。しかし、上のように書けば、指定した行ラベルに移動して処理が続きます。エラーが出ない場合でもEndの行まで行ってしまうので、必要があれば「Exit Sub」と書いて、ラベルに移る前に強制的に処理を終わらせます。GoTo文が使われるのは、こういう場合に限られ、For文の代わりに用いられることはないでしょう。, 再帰関数とは、簡単に言えば、自分で自分を呼び出す関数のことです。VBAのコードを書く場合にはあまり出てきませんが、他のプログラムでは登場することもあります。, 2つ目の処理の最後で、自分自身を呼んでいます。上のセルに1を足して次のセルへ移動する、という処理を何度も繰り返しているわけですね。今の処理が終わる前に別の処理を呼ぶことになるため、終わらない処理がどんどんたまっていきます。そのため、呼び出す回数が多くなるとエラーが出てしまったりするのですが、VBAでもこういう書き方ができるということを覚えておくのはいいことだと思います。, 再帰関数は、フィボナッチ数列や階乗の計算などの例を使って説明されることが多いですね。気になる人はググってみましょう。VBAのコードで解説しているサイトは少ないかもしれませんが。, 今度は少し違ったアプローチです。パッと見ると、For文を2重にしただけのように見えますが、実際にはもう少し不思議なことをしています。, 「i & j」というのは、iとjを文字として連結している、ということです。つまり、"00"という文字から"99"という文字までを作っているということです。見た目は数字ですが、プログラムではテキストとして扱われています。そのあと、1を足していますが、この足し算の段階では数値として認識され、結果として1から100までの数字が出来上がる、という流れになっています。, 数字の見た目をしたテキスト(例えば"00"とか)でも、数値の演算の際には自動的に数値に変換されてしまいます。こういう現象は、「暗黙の型変換」と呼ばれています。文字の連結は「&」を使っても「+」を使ってもいいのですが、こうした暗黙の型変換が行われないようにするために、「&」を使うようにしたほうが安全です。意図しない型変換が起こると、エラーの原因になる可能性がありますからね。, 実はセルに値を書き込むという処理は、すごく時間がかかるんですよね。今まではそれをちまちま1個ずつやっていたので、相当処理が遅いんです(処理数が少なければ、体感できませんが)。セルに値を入れていくより、配列に入れていくほうが圧倒的に早くなります。また、配列のデータをセルに吐き出すのも、一度にやるならそんなに時間はかかりません。, この方法は、範囲と配列の大きさが合っていないとうまくいきませんが、使える時には積極的に使ったほうがいいです。特に、処理する範囲が大きければ、処理にかかる時間が劇的に減ります。, まず、「1から100までの数を書く」というのを、エクセル上で手作業で行う場合を考えてみます。一番思いつきやすい方法は、A1セルに1を入力し、A2セル以降は「上のセル+1」という式を入力する、というものでしょう。そういった作業をそのままコードにしてみると、次のようになります。, 「PasteSpecial」は貼り付けのことですが、そのあとの「xlPasteFormulas」は数式貼り付け、「xlPasteValues」は値貼り付けのことです。セルに入っている数式を値に変換するために、値貼り付けを行っています。, For文などで繰り返しの作業をしていたのに比べると、作業時間は減ります。また、変数が使われていないことにも注目です。問題文を見ると「変数を使って繰り返せばいい」と考えてしまいがちですが、別に変数がなくても書くことはできます。1個1個処理していくよりも、一気に処理をしてしまったほうが、一般的に処理時間は短くなります。, 次はもっとエクセル独自の機能を活かした書き方です。連続した値を簡単に入力する、「オートフィル」という機能を使った書き方です。, 「オートフィル」は、「他の範囲の値を自動的に埋める」という機能ですが、この機能を使うためには、基準となる値、値を埋める範囲、埋める値の計算方法、を指定する必要があります。それが上の「AutoFill」の箇所で行っていることですね。, 上のコードでは、Typeとして「xlLinearTrend」を指定しています。これは線形にどんどん増やしていく(または、減らしていく)という設定で、ここでは「1ずつ足し上げていく」というように解釈されます。, このTypeの設定はいろいろあって、何も指定しなければ「xlFillDefault」を指定したことになります。これは、エクセルが自動的に判断して値を埋めてくれる、という設定です。しかし、上のコードでデフォルトの値を使うと、「1が入ってるから、きっと他も1が入るんだろうな」と解釈されてしまいます。すべての範囲に1が入ってしまうという、意図しない結果になってしまいます。なので、ここでは、「xlLinearTrend」を指定しています。, もし、「xlFillDefault」を指定したい、または、この設定を省略したい場合は、次のように書けばOKです。, 1と2を入力してからエクセルに判断させると、「これはどんどん足していけばいいんだな」と理解してくれます。1行長くなりますが、上のような書き方でも同じ結果になります。, 次は、かなり気持ち悪い書き方です。セルを順番に選択していき、値を入れていくというやり方です。Do Loop文ですが、変数を使わないという不思議な書き方です。セル選択を頻繁に行うので、実行すると画面がチカチカします。, 「Selection = Selection.Row」とは、「選択したセルに、選択したセルの行を入力する」ということです。そして、選択するセルをどんどん下に移動していく、というやり方です。「Offset(1, 0)」が、「1つ下のセル」を意味しています。, 途中のIf文で、選択したセルのアドレスとA100セルのアドレスを比較しています。最後のセルまで行けば、そこでDo Loop文から抜ける、ということをしています。アドレスを比較していますが、もし「.Address」をつけなければ、それぞれのセルに入っている値をただ比較するだけになってしまいます。, ちなみに、「If Selection Is Range("A100") Then」という書き方はできません。文法的にはあっているのでエラーは出ませんが、意図した結果は得られません。残念ながら、RangeオブジェクトをIsで比較することはできません。Rangeオブジェクトごとに、別のメモリ領域に格納されるためです。下のサイトが参考になります。, RangeオブジェクトはなぜIs演算子で比較できないのか:エクセルマクロ・Excel VBAの使い方-Rangeオブジェクト, Addressで確認するというやり方が、一番簡単で確実です。もちろん、ここでいうアドレスとはメモリのアドレスではなくて、エクセルにおけるセルのアドレスのことです。, 「繰り返し」で使うものには、For Each文というのもあります。これを使った書き方もやってみます。, 「For Each 要素 In コレクション」というような書き方をします。コレクションとは、何かが集まった集合みたいなものです。例えば、Sheetsとはシートが集まったコレクションだし、Shapesとは図形が集まったコレクションです。, 上の例は、A1からA100というRangeが集まったコレクションに対し、そこに含まれる要素を1つ1つ取り出して処理を行うということです。Valueは省略することができるので、「r.Value = r.Row」の部分は、「r = r.Row」と書いても同じです。, For Each文のいいところは、個数がわからなくてもいいということです。今は処理する個数が決まっているのでうれしさがよくわかりませんが、例えば100個になることもあるし、10個になることも1000個になることもある、という状況では書き方が簡単になる場合があります。「処理する個数を数えて変数に格納する」というコードをわざわざ書かなくてもよくなるからです。また、「i番目のオブジェクト」と指定するより、「それぞれのオブジェクト」とするほうが、見やすいコードになることも多いです。, 使える場面は限られますが、すっきり書けるようになることはよくあります。ただ、コレクションの知識が必要になり、難易度が少し上がってしまうところが欠点です。, 次は、もっと短く書こうと頑張ってみるコードです。該当する範囲に、式を直接入れて計算するという方法です。, 1行目で式を設定し、2行目でそれを値に変換しています。実質的には1行目で処理は終わっています。値にしなくてもよければ、1行でおしまいです。, セルの数式を指定する方法は、いくつかパターンがあります。その中でも一番わかりやすいのは、上で使用している「Formula」だと思います。これは、設定する数式内に登場するセルをA1形式で書く方法です。上のように書けば、他のセルに対しても、参照先が自分自身となるように数式が設定されます。, 「FormulaR1C1」を使うこともできます。これは、Formulaと同じく数式を設定するものですが、R1C1形式でセルを設定する点がFormulaとは異なります。このR1C1形式では、数式の入ったセルを基準に相対的にセルを指定することもできるし、絶対参照でセルを指定することもできます。自分自身のセルは「RC」と書けばよいので、次のように書き換えてもOKです。, FormulaR1C1は慣れるまでは少しわかりづらいのが欠点です。アドレスがわかっていなくても使えるので便利なのですが、この形式に慣れている人はたぶん少ないので、できれば使うのを避けたほうがいいんじゃないかと思います。, ちなみに、数式を設定するには、今までに述べた方法のほかに、次のような方法でもいいんですよね。下の2つのどちらも、同じ結果になります。, 実はこれは値貼り付けと同じ効果です。「そのセルで計算した値を、そのセルに代入する」ということなので、数式が消えてセルには値が入るようになります。わざわざコピーして値貼り付けをする、ということはしなくてもいいんですよね。書き方もシンプルだし、クリップボードを使わなくなるので、覚えておくと便利です。, 前の例では、「式を入れる、値にする」という2段階の処理を行っていました。もうこれ以上短くなるような気がしません。これ以上短くするには、「いきなり計算結果を値にしてセルに入力する」必要があるからです。, しかし、実はそういうメソッドがあるんですよね。マイナーですが、Evaluateというのがあります。, このように書くと、計算した結果が値となってセルに格納されるようになります。これ1行でおしまいです。, これを実行すると、すべてのセルに1が入ってしまいます。式がコピーされて計算されるわけではないようですね。参照先が変わってほしいのですが、そうはなってくれません。, この実行結果は、A1セルからA10セルまでは、1から10が入り、A11セル以降はエラー値、となります。Evaluateの処理について、僕はそんなに詳しくないのですが、上の処理結果から大体どういうことが起こるかは想像できると思います。, なお、Evaluateは、角括弧([])を使っても同じ結果を得ることができます。また、Evaluateの中に数式を入れると計算結果が返ってきますが、セルのアドレスを入れると対応するRangeオブジェクトが返ってきます。この2つのことから、上のコードは次のように書き換えることができます。, [A1:A100] = [ROW(A1:A100)]、これだけ! これが、僕が思いつく中で、一番短いコードです。, ただ、この書き方は短さで言うと一番ですが、はっきり言ってわかりにくいです。この書き方はマイナーすぎます。しかも、これを見た人が「[]ってどういう意味かな?」と疑問に思っても、検索しづらいです。なので、もっとメジャーな書き方にしたほうがいいですね。これはネタとして知っておくくらいでいいのではないか、と思います。, さて、今までで12通りの書き方を紹介してきました。長いものから短いものまでありましたが、最後にそれぞれの実行速度を計ってみましょう。, 100個では少なすぎるので、1000000個でやってみます。つまり、上のコードで100のところを1000000に、IntegerをLongに変えたコードで計測してみます。文字連結を使ったコードは、2文字ではなく6文字の連結に書き換えました。タイムを計るところは、次のように書きました。呼び出すプロシージャをころころ変えて、実行しました。, 一番早いのは、意外にも、オートフィルでした。100万個処理して0.2秒というのは、かなりの早さです。「一瞬」といってもいいレベルです。この問題に対して、「オートフィルを使う」書き方を真っ先に思いつく人は少ないと思うんですよね。しかし、よくよく考えてみると、1から順番に数字を入れていくという処理に、もっとも最適化された機能だということを考えれば、そんなに不思議な結果ではないのかもしれません。, 2次元配列やEvaluateを使った処理も、1秒台となかなかの早さです。2次元配列を使うと処理が速くなるというのは知っていたので、個人的にはそれほど驚きはないです。Evaluateや角括弧を使った書き方は、短いうえに処理も早いんですね。素晴らしいです。, 手作業の自動化やFormulaを使った書き方は、上の処理よりも少し遅くなります。「式を設定する」「それを値にする」という2回の処理で、それぞれセルの操作をしていますが、おそらくこれが時間のかかる原因でしょうね。セルへの操作回数は少ないほどいいので、この差が時間の差となって表れたということでしょう。, それ以外の繰り返し処理は、かなり時間がかかっています。早くても、18秒台。「結構処理に時間がかかるなぁ」と感じてしまうレベルです。ちなみに、Do Loopが少し遅くなっていますが、これはセルの選択方法を変えたためです。RangeではなくCellsを使えば、For文と大して変わらない速さになります。つまり、文字の連結が遅いということです。, これからわかることは、繰り返しだからと言って、常にFor文を使えばいいというわけじゃないということですね。処理が多い時には、セルへの処理回数を減らす書き方はないかを考えたほうがいいです。100個くらいの処理なら誤差ですが、これが多くなってくると、遅くなったりエクセルが固まってしまう原因となります。, ちなみに、グラフが突き抜けてしまってますが、「セル選択」を使った書き方は、400秒くらいかかりました。1個ずつセル選択をしてしまうと、半端なく時間がかかってしまいます(マクロを実行すると、「応答なし」になってしまいました)。「マクロの記録」を使ってコードを作った場合、「カーソルの移動」が入ることがよくありますが、そのまま使ってしまうのは避けたほうがいいでしょう。, また、再帰関数はエラーとなってしまいました。これは時間がかかりすぎるというわけではなくて、「スタック領域が不足しています」というエラーが出て、マクロが止まってしまう、ということです。そもそも結果までたどり着けません。上の文中でも書きましたが、処理が終わる前に別の処理を呼ぶので、処理が多くなってくると、こういうエラーが出てしまいます。ただ、これは再帰関数が使えないというわけじゃなくて、得意な分野と不得意な分野があるということです。処理回数が多いと使える場面は減りますが、処理回数が不明な繰り返し処理では使える場面が増えます。.