- ベストアンサー
エクセル マクロ
エクセル2000を使っています。 「申請書」、「標準事務用品」の2種のシートがあって、「申請書」のシートは定型の入力フォーム、「標準事務用品」は入力フォームに反映させたいデータの一覧表になっています。データの項目は左から、1.申請2.品物3.商品名4.品番5.メーカー名となっており、データは全部で74行あります。1.申請項目の列には各行1個づつコマンドボタンを設けました。コマンドボタンがクリックされたときに、該当行のセルの内容を入力フォームにコピーする処理が実行されるようにしたいです。 マクロの記録で記述されたコードをコマンドボタンのコードにコピーしてみましたが、エラーになってしまい修正の仕方がわかりません。 Private Sub CommandButton1_Click() Range("K30").Select Selection.Copy Sheets("申請書").Select ActiveSheet.Paste Sheets("標準事務用品").Select Range("L30").Select Application.CutCopyMode = False Selection.Copy Sheets("申請書").Select (↓ここでエラーになってしまします。) Range("B13:G13").Select ActiveSheet.Paste Sheets("標準事務用品").Select Range("M30").Select Application.CutCopyMode = False Selection.Copy Sheets("申請書").Select Range("B15:C15").Select ActiveSheet.Paste Sheets("標準事務用品").Select Range("N30").Select Application.CutCopyMode = False Selection.Copy Sheets("申請書").Select Range("B14:G14").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub また、全部で74行あるので、全てに操作を記述するのは非効率的だろうと思います。何か良い方法はありますでしょうか。 ご助言お待ちしております。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >>なお、"標準事務用品" にコマンドボタンを置くなら、 >With Worksheets("標準事務用品") は、 >With Me >として良いです。 > >勉強不足のため、ご指示の意味内容が理解できていませんが With Me というのは、 Me (Meキーワードという)は、英語の me と同じ意味で、「私」ということです。 ローカルモジュール(標準モジュール以外ということ)では、オブジェクトのワークシートなどを持っていますので、その部分を指します。Me は、Sheet1 だったり、Sheet2 だったりします。省略符号のひとつです。慣れないうちは、With Worksheets("標準事務用品")としてもよいです。 なお、私は、Sheets("標準事務用品")ではなく、Worksheets("標準事務用品")と書くように、差別化しています。Sheets には、大別すると3種類(ワークシート、グラフシート、マクロシート)あるので、あえてワークシートと限定して書いています。
その他の回答 (5)
- xls88
- ベストアンサー率56% (669/1189)
>”コンパイルエラー:プロシージャの外では無効です” Sub~End Subの中にコードを書きなさい、ということです。 Private Sub CommandButton1_Click() Dim i As Long For i = 0 To 73 Sheets("標準事務用品").Range("K30").Offset(0, i).Copy _ Sheets("申請書").Range("B12:G12").Offset(i, 0) Next i End Sub
- xls88
- ベストアンサー率56% (669/1189)
>また、全部で74行あるので、全てに操作を記述するのは >非効率的だろうと思います。何か良い方法はありますでしょうか。 Selectを止めて、コードを整理すれば規則性が見えてきます。 提示されたコードは、記述ミスされているようなので勝手に推測を入れると、下記のように纏まると思います。 Sheets("標準事務用品").Range("K30").Copy Sheets("申請書").Range("B12:G12") Sheets("標準事務用品").Range("L30").Copy Sheets("申請書").Range("B13:G13") Sheets("標準事務用品").Range("M30").Copy Sheets("申請書").Range("B15:G15") Sheets("標準事務用品").Range("N30").Copy Sheets("申請書").Range("B14:G14") 1列ずつ横にずれながら、1行ずつ下にコピーしているのではないでしょうか? 一例をあげてみます。 For~Next文で、Offsetプロパティの列と行を繰り上げながらループしてみます。 Dim i As Long For i = 0 To 73 Sheets("標準事務用品").Range("K30").Offset(0, i).Copy _ Sheets("申請書").Range("B12:G12").Offset(i, 0) Next i
お礼
丁寧にご説明頂き、有難うございます。 >1列ずつ横にずれながら、1行ずつ下にコピーしているのではないでしょうか? ご指摘の通りです。 For~Next文のコードを"標準事務用品"の冒頭にコピーさせて頂いたのですが、"標準事務用品"のシートに移動してコマンドボタンを押したら、 ”コンパイルエラー:プロシージャの外では無効です” とエラーが表示されてしまいました。私が記述した場所が誤っているのでしょうか。 浅学のため、理解に乏しく申し訳ありません。 ご助言頂ければ幸いでございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 一つ直しても、またエラーが出るはずです。 Private Sub CommandButton1_Click() は、シートモジュールですから、Rangeオブジェクトは、シートに属しています。違うシートの場合は、不整合ですから、エラーが発生します。 例えば、こういう書き方をします。 なお、"標準事務用品" にコマンドボタンを置くなら、 With Worksheets("標準事務用品") は、 With Me として良いです。 Private Sub CommandButton1_Click() With Worksheets("標準事務用品") .Range("K30").Copy Worksheets("申請書").Range("A1") .Range("L30").Copy Worksheets("申請書").Range("B13:G13") .Range("M30").Copy Worksheets("申請書").Range("B15:C15") .Range("N30").Copy Worksheets("申請書").Range("B14:G14") ' ・・ここに付け足します。 End With End Sub
お礼
簡潔なご回答ありがとうございます。 ご提示のコードをコピーして、Range("A1")の部分だけRange("B12:G12")に 置き換えました。 >なお、"標準事務用品" にコマンドボタンを置くなら、 With Worksheets("標準事務用品") は、 With Me として良いです。 勉強不足のため、ご指示の意味内容が理解できていませんが、まさに意図していたものが出来ました。どうも有難うございます。
- xls88
- ベストアンサー率56% (669/1189)
>Sheets("申請書").Select > (↓ここでエラーになってしまします。) >Range("B13:G13").Select エラーが発生するのはここだけですか? この行より前の行にも同じような記録コードがありますが、そちらは大丈夫なのですか? 取りあえず、Rangeオブジェクトを、その上位オブジェクトであるシート名で修飾すればどうなるでしょうか。 ≪例≫ Sheets("申請書").Range("B13:G13").Select 上記で通れば、次はSelectをやめてみましょう。 例えば、下記の部分ですが >Range("K30").Select >Selection.Copy >Sheets("申請書").Select >ActiveSheet.Paste Sheets("標準事務用品").Range("K30").Copy Destination:=Sheets("申請書").Range("A3") というようにできます。 (セルK30をコピー、貼り付け先は申請書シートのセルA3です。) 上記のようにすることで、下記コードが不要になります。 Application.CutCopyMode = False とりあえず、ここまでにします。
- FEX2053
- ベストアンサー率37% (7991/21371)
>Sheets("申請書").Select > (↓ここでエラーになってしまします。) >Range("B13:G13").Select このB13:G13の途中に、セル結合したセルがありませんか? あったら結合を解除してみてください。
お礼
すばやいご回答ありがとうございました。 おっしゃる通り、B13:G13は結合セルでした。
お礼
解りやすいご説明どうも有難うございます。 Meキーワード、ワークシートの差別化、勉強になりました。 頭に叩き込むためにも、とりあえず、Meではなく、Worksheets(””)と書くようにしていきたいと思います。