• ベストアンサー

エクセル マクロ

エクセル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行あるので、全てに操作を記述するのは非効率的だろうと思います。何か良い方法はありますでしょうか。 ご助言お待ちしております。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 >>なお、"標準事務用品" にコマンドボタンを置くなら、 >With Worksheets("標準事務用品") は、 >With Me >として良いです。 > >勉強不足のため、ご指示の意味内容が理解できていませんが With Me というのは、 Me (Meキーワードという)は、英語の me と同じ意味で、「私」ということです。 ローカルモジュール(標準モジュール以外ということ)では、オブジェクトのワークシートなどを持っていますので、その部分を指します。Me は、Sheet1 だったり、Sheet2 だったりします。省略符号のひとつです。慣れないうちは、With Worksheets("標準事務用品")としてもよいです。 なお、私は、Sheets("標準事務用品")ではなく、Worksheets("標準事務用品")と書くように、差別化しています。Sheets には、大別すると3種類(ワークシート、グラフシート、マクロシート)あるので、あえてワークシートと限定して書いています。

09051114
質問者

お礼

解りやすいご説明どうも有難うございます。 Meキーワード、ワークシートの差別化、勉強になりました。 頭に叩き込むためにも、とりあえず、Meではなく、Worksheets(””)と書くようにしていきたいと思います。

その他の回答 (5)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.5

>”コンパイルエラー:プロシージャの外では無効です” 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)
回答No.4

>また、全部で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

09051114
質問者

お礼

丁寧にご説明頂き、有難うございます。 >1列ずつ横にずれながら、1行ずつ下にコピーしているのではないでしょうか?  ご指摘の通りです。 For~Next文のコードを"標準事務用品"の冒頭にコピーさせて頂いたのですが、"標準事務用品"のシートに移動してコマンドボタンを押したら、 ”コンパイルエラー:プロシージャの外では無効です” とエラーが表示されてしまいました。私が記述した場所が誤っているのでしょうか。 浅学のため、理解に乏しく申し訳ありません。 ご助言頂ければ幸いでございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 一つ直しても、またエラーが出るはずです。 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

09051114
質問者

お礼

簡潔なご回答ありがとうございます。 ご提示のコードをコピーして、Range("A1")の部分だけRange("B12:G12")に 置き換えました。 >なお、"標準事務用品" にコマンドボタンを置くなら、 With Worksheets("標準事務用品") は、 With Me として良いです。 勉強不足のため、ご指示の意味内容が理解できていませんが、まさに意図していたものが出来ました。どうも有難うございます。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

>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)
回答No.1

>Sheets("申請書").Select > (↓ここでエラーになってしまします。) >Range("B13:G13").Select このB13:G13の途中に、セル結合したセルがありませんか? あったら結合を解除してみてください。

09051114
質問者

お礼

 すばやいご回答ありがとうございました。  おっしゃる通り、B13:G13は結合セルでした。  

関連するQ&A