「日本語の変数でプログラミングすれば、みんなが幸せになれる」 >>ABC346231234Yahoho9877999999499999.5249999.75餃子定食(改行なし) 上記のような理由から「横着するためにマクロを使いたい」次第です。 せっかく対応案をいただいたのですが、いまPCを操作できる環境にないので、明日確認のうえ、またご返答させてください。 セルN1が選択された なお、Range(Cells,Cells)の書き方を使ってセル範囲を指定する場合も、 ご回答ありがとうございます。 そしてその現状の運用方法すら(おおよそ10分間で100件超などと)アクションが高頻度なため、手間だと感じています。 ●貼り付けできる: | 夢想的BABYMETAL初考 その61 », 最近は、EXCEL_VBAをいじる機会があまりありません。記憶を確かめるように、少し、転記作業をコード化し、簡単なコードを作ってみようと思います。, EXCELマクロにしろ、VBAにしろ、まずは馴染むことが肝心だろうと思っていて、用語などで躓かないようにするべきでしょう。 EXCELのシートと同様に、VBA・コードを書いて実行させるのを体験すれば、何とかなるものです。, どんな業務・作業を行うのかをコード化するには、具体的にどのようなデータに基づいてどのような作業をし、どのような結果を出力しているかを明らかにする必要があります。, ここでは、マクロブック、転記元ブック、転記先ブックの3つのブックを想定し、転記元ブックのデータシートのアルセル範囲を、転記先ブックの実績シートにコピー貼付けする作業を考えてみます。 出来上がりのイメージは、当コードを入力・保存しているマクロブックをオープンし、ボタンクリックで、転記元ブックと転記先ブックをそれぞれオープンし、指定セル範囲のデータを指定セルへ貼付け、その後転記元ブックと転記先ブックをクローズし、処理完了のメッセージを表示させるまでです。, マクロブック シート名「sheet1」 転記元ブック シート名「データ」 セル範囲「A5:F20」 転記先ブック シート名「実績」  貼り付け先は、A列の最終行の次行 A列からF列まで。, 上記の作業イメージから、処理毎に区分して書いてみます。エクセルの操作を想像してみます。マクロブックのsheet1上にあるボタンをクリックすると、まず、転記元と転記先の2つのブックをオープンします。オープンした転記元ブックのデータシートのA5:F20セル範囲をコピーし、オープンしている転記先ブックの実績シートのA列最終行の次行に貼り付けます。転記先ブックは値が変わったので、保存する必要があるので、保存します。転記元ブックと転記先ブックを閉じます。完了のメッセージボックスを表示します。以上となります。, Sub Macro1()'' Macro1 Macro''    Range("E9").Select    Workbooks.Open Filename:= _        "C:\Users\XXXXXXXXXXXXXX\Documents\ABC.xlsx"End Sub, マイドキュメント・フォルダーからabc.xlsxブックをオープンしたキー記録です。最初のselect文は、キー記録開始のボタンを押して、E9セルをクリックしたようです。これはオープンとは関係ないので、削除してよいです。, Workbooks.Open Filename:= _        "C:\Users\XXXXXXXXXXXXXX\Documents\ABC.xlsx", 注)filename:=の後に、「 _」がありますが、これは本来一行である分を二行にわたって記述する際のお約束です。これがあれば、次行も本来一行のコードとして解釈されます。 ですので、下記のように1行で記述する事も可能です。Workbooks.Open Filename:="C:\Users\XXXXXXXXXXXXXX\Documents\ABC.xlsx", 対象ブックがDドライブ上にあるとして、この文を使うと、Workbooks.Open Filename:="d:\転記元.xlsx"Workbooks.Open Filename:="d:\転記先.xlsx"となります。, (2)コピー&ペースト ブックがオープンしたので、対象セル範囲をコピーし貼付けの処理をコードにしてみます。, キー記録で、sheet1のA3からA5までを、sheet2シートのA4に貼り付けてみます。, Sub Macro2()'' Macro2 Macro''    Range("A3:A5").Select    Selection.Copy    Sheets("Sheet2").Select    Range("A4").Select    ActiveSheet.Paste    Range("A8").Select, ' どのシートかは、前提となっているので明示されてません。 Range("A3:A5").Select   'A3からA5を範囲指定しました。 Selection.Copy       '範囲指定した領域をコピーします。, Sheets("Sheet2").Select  'sheet2シートを指定しました。  Range("A4").Select    'A4セルを指定・アクティブにしました。 ActiveSheet.Paste     '貼付けを行いました。               'A4セルを左上として貼り付いたのを確認 Range("A8").Select    '貼り付け先範囲が選択状態となっているので、              'A8をクリック=指定して、選択状態を解除。, セル関係でキー記録をとると、必ずSELECT、SELECTION~というように、操作に応じた記録となります。ただ、VBAでは、いちいち操作手番を追っていくコードではなく、別のコードを使うことが可能です。プログラムの規則、文法を若干でも知れば、いちいちキー記録を取ることも必要なくなります。, いわゆる、BASIC言語の文法を若干知るということでしょうか。VBAって、Visual Basic for Applicationsの略であり、BASIC言語を源流としている言語=文法という事です。 といっても、改めてBASIC言語を学ぶ必要はないです。ただ、手操作の通りにコードを書く必要はない、別のコードがあるということを覚えていれば良いかと思います。 例えば、下記のセル選択とコピーの分は、  Range("A3:A5").Select Selection.Copy   ↓ Range("A3:A5").Copy と1行で記述することが可能です。, 理屈をおいておいて言うなら、SELECTとSELECTIONが続けてあれば、それは省略して一文にできそうだという事です。手操作なしで、ほとんどコードは記述できます。 セルの範囲を指定して、シートを切り替え、切り替えたシート貼り付け先のセルを指定し、貼り付け操作をするというイメージではなく、コピー元のセル範囲を指定し、コピー先を指示する構文を書くことが可能です。, また、EXCEL VBAは非常にユーザーフレンドであり、構文をどのように記述すれば良いのか、サジェストがしっかりしています。次にどのような語句を記述するのかがヒント表示されます。また、ネット上に多くのコードサンプルやら例題などがありますから、実践的に素早く使用することができる環境にあります。, Range("A3:A5").Copyと入力し、ブランクを1こ開けると、COPY([Destination])とヒント表示されます。これは、貼り付け先が記述できることを表しています。range().copy ブランク 貼り付け先:range("b10")と記述すると、B10セルに貼りつくという事です。, なので、セル範囲を選択し、選択領域をコピーし、貼り付け先を指定し、貼り付けるという一連の作業は、  セル範囲.copy 貼り付け先セル番地 の構文で記述できます。, Range("A3:A5").Copy Sheets("Sheet2").Range("A4"), 貼り付け先は、同じシートである必要はなく、別シートでも、別ブックでも指定すれば貼り付き指定できます。また、コピー元にrange=セル番地・範囲のみがあるので、この場合はアクティブシート上のA3:A5をコピー元としています。これも、シートを指定すれば、アクティブシート以外のシートからコピーし、別のシートのセルに貼りつけることができます。, sheets("sheet2").range("a1:a5").copy sheets("sheet1").range("b1") この構文は、シート2のA1からA5のセル範囲をコピーして、シート1のB1セルに貼りつける構文になります。 この構文が前提としているのは、同じブック内での処理だという事です。, 複数ブックがオープンしている状態で、この構文を実行した場合、アクティブになっているブック上で処理が行われます。, (3)データを追加する行は、データの最終行の次行。 今回の場合は、 マクロブック シート名「sheet1」 転記元ブック シート名「データ」 セル範囲「A5:F20」 転記先ブック シート名「実績」  貼り付け先は、A列の最終行の次行の A列からF列までになります。 3つのブックをオープンして処理を行いますから、どのブックのどのシートのセルをコピーし、どのブックのどのシートのどのセルに貼りつけるかを指定する必要があります。 書式的には、 workbooks("転記元").sheets("データ").range("a4:f20").copy _    workbooks("転記先").sheets("実績").range("A列の最終行の次行")    という構文になります。, どのブックのどのシートの、どのセル番地であるかを常に意識しておくことが、VBAでは必要なスキルように思われます。VBAに慣れていない最初の頃はこれでよく失敗をしました。でないと、貼り付けたくない関係ないシートに貼り付き、元あったデータが上書きされてしまいます。この場合、通常エクセルの操作のCTRL+Z(元に戻す)機能は使えません。, A列の最終行は、「vba 最終行」で検索をかけると分かります。 MaxRow = Cells(Rows.Count, 1).End(xlUp).Row というのが例示されていますので、これを使います。 cells()は、range()と同様にセルを指定することができます。ただ、行列番地の順序がrange()とは逆になります。 cells(行番号、列番号)となります。 A1セルの場合、range("a1")としますが、cellsの場合は、cells(1,1)となります。B3であれば、cells(3,2)と記述します。又は、cells(3,"B")とします。列方向に繰り返し処理を行う場合、range()は使えませんから、cells()を使います。 ただ、cells()は通常のエクセル・セル番地とは、行列が逆になるので、違和感があります。コードの可読性を高めるためにも、range()を基本使い、range()が使えない場合のみ、cells()を使うのが良いと思います。また、初心者・コード記述はたまにしか行わない場合も、基本セル指定等はrange()を使うようにします。 rows.countは、シートの最終行を表示します。 xl2003でも、xl2010~でも、絶対行数を使わずに、rouws.countとするだけで、最終行を指定することができます。 end()は、ctrl+矢印の機能で、値があるセルを指示します。 A11行までシート最終行から何もセルに未入力で、A10に何か値があれば、A10に移動します。 end(xlup)なら、ctrl+↑の操作になり、end(xldown)なら、ctrl+↓の操作結果になります。 rowは行番地を表します。columnは列番地(数字)になります。, Cells(Rows.Count, 1).End(xlUp).Row Cells(Rows.Count,1)は、A列のシート最終行を言い、 end(xlup)で、A列最終行から、上方向に移動し、 rowで、移動したセルの行番号を表しています。, つまり、 Cells(Rows.Count, 1).End(xlUp).Row はA列で値があるセルの最終行の行番号を取得します。 新しくデータを追加登録するのは、最終行の次行ですから、 Cells(Rows.Count, 1).End(xlUp).Row + 1 と、1を足してやればよいことになります。, ここで、前提となっているのは、A列のデータは、キー列もしくは、連続して値が入力されているということになります。 A列に値がなく、B列に値があるなどは、想定していないことになります。 A列に値が入力されたり、されなかったりし、B列に必ず値が入力されるというリスト形式のデータであるなら、  Cells(Rows.Count,21).End(xlUp).Row と、cellsの中の数字を2に変更します。, workbooks("転記元").sheets("データ").range("a4:f20").copy _    workbooks("転記先").sheets("実績").range("A列の最終行の次行")    という構文は、A列最終行の次行の文を入れて、, workbooks("転記元").Sheets("データ").Range("a4:f20").Copy _    workbooks("転記先").Sheets("実績").Range("a" & (Cells(Rows.Count, 1).End(xlUp).Row + 1))    という構文になります。 range("a1")の1の代わりに、cells文が入ったという事です。 ただ、()の中に()があり、ネスト構造になっているので、わかりにくいです。そのような場合、最終行の次行の値をいったん変数に代入し、その変数を使ってrange()を表すようにします。, 変数の定義は、 dim i as long などのようにします。 変数を使う場合は、どのような方の何という名前の変数を使うかをdim文で宣言します。, asの後ろは、変数の型を指定します。 数値であれば、long 文字であれば、string シートであれば、worksheet ブックであれば、workbook などとなります。, 数値の場合、integerもありますが、事務系では使う必要はないと思われます。メモリーが高価で使える量も少なかった場合は、節約のためにintegerを使うこともありましたが、今は気にする必要はないので、longを使います。, sub 貼り付け() Dim i as long i=Cells(Rows.Count, 1).End(xlUp).Row + 1, workbooks("転記元").Sheets("データ").Range("a4:f20").Copy _    workbooks("転記先").Sheets("実績").Range("a" & i)end sub, sub~end subまでのプロシージャー=マクロ文が出来上がりように思われます。ところが、このマクロを実行させると、思わぬ動きをすることがあります。それは、 i=Cells(Rows.Count, 1).End(xlUp).Row + 1 この最終行の次行を取得する文は、シート・ブックの指定がないので、アクティブブックのアクティブシートに対して行われることになります。 workbooks("転記先").Sheets("実績")の指定をしないといけません。 .Cells(Rows.Count, 1).End(xlUp).Row + 1, sub 貼り付け() Dim i as long i=workbooks("転記先").Sheets("実績").Cells(Rows.Count, 1).End(xlUp).Row + 1.