『マクロの応用?』(mako) 現在、マクロを使用し、入力シートと反映シートを作成しています。 入力シートには登録というボタンを作成し、反映シートにいくようにしています。 -------------------------- 入力シート -------------------------- 1 商品ブランド 2 担当者 3 その他 登録 -------------------------- 1の商品ブランドには入力規制をかけており、 文具、雑貨、衣料品、食品を選択するようになっています。 この四項目を一つずつのシートに分けたいです。 例えば1で文具を選択したら文具という名前のシートに反映させたいのです。 雑貨を選択したら雑貨シートに反映させる、というようなことはできるでしょうか? 1で選択し、その他の項目を入力してから登録ボタンを押し、 それぞれの商品ブランドのシートに入力したデータがとぶようにしたいです。 方法はありますでしょうか・・? ---- 入力規制→入力規則を設定しているセルがA1として WorkSheets(Range("A1").Value ). で雑貨を選択したら雑貨シートの操作はできますが。 ---- ごめんなさい・・。 どこに>WorkSheets(Range("A1").Value ).を 入力したらよいのでしょうか・・? 本当に素人で申し訳ないです・・。 (mako) ---- >入力シートには登録というボタンを作成し、反映シートにいくようにしています。 このコードを載せてみられるのがよいでしょう。 ■▲(HANA)■▲ ---- 入力シートと反映シートのレイアウト不明のため詳しくは書けませんが 仮に入力シートのA1に入力規則が設定してあり雑貨が選択されていたとき 入力シートのA1を雑貨シートのA1にコピペするコードは、 Worksheets("入力").Range("A1").Copy Worksheets(Range("A1").Value).Range("A1") 多分反映シートにDATAを「蓄積したい」だと思うので、他にもOffsetプロパティ,Endプロパティ等使用すると思いますが・・・。 ---- 説明が下手で申し訳ありません。 シートのレイアウトは @入力シート(Seet1)としているものが下記のようになります。 -------------------   A ------------------- 1 商品ブランド▼ →入力規制で項目を選択(文具、雑貨、衣料品、食品) 2 担当者 3 注文日 4 取引先 5 商品番号 6 取引先番号   __   |登録|   ―― -------------------------- (seet1) A(seet1)で入力した内容が隣のseet2に反映されます。   A      B     C     D     E     F 商品ブランド  担当者  注文日  取引先  商品番号   取引先番号 ---------------------------------------------------------------------------- 雑貨     ○○○   2009/3/3  ABC   123-456   11111111 ・       ・      ・    ・     ・      ・ ・       ・      ・    ・     ・      ・ ・       ・      ・    ・     ・      ・ ・       ・      ・    ・     ・      ・ ----------------------------------------------------------------------------- (seet2) B今回、やりたいことはseet1のA1の商品ブランドの項目4つのシートを Seet2のようにつくりたいです。 A1の商品ブランドで雑貨を選択し、担当者、注文日、・・・・取引先番号を全て入力し、 登録ボタンを押します。 C商品ブランドで雑貨を選択したので seet2と同じレイアウトの雑貨というseetに内容を反映させたい。 雑貨seetのとなりには文具、衣料品、食品とseetを全部で四つ作成し、 A1で選択した項目のseetに入力したものが反映するようにしたいです。 seetを四つに分けないでSeet2だけの場合はできるのですが、 そうすると四項目全て同じseetになってしまうので ひとつの入力seetで四つのseetに反映させるようにしたいんです。 上記のようなことは不可能でしょうか・・? seetを四つに分けたかったら入力seetを四つ作成するべきでしょうか・・? 長々と申し訳ありません。 ---- 私は   >入力シートには登録というボタンを作成し、反映シートにいくようにしています。   このコードを載せてみられるのがよいでしょう。 と書きましたが。 (HANA) ---- (HANA)さん何度もごめんなさい。 コードは入力という名前のseetを右クリックしてコードの表示で やっているのですが、 今回の場合、ひとつのseetからいくつかへのseetに反映させるので どの部分にどういったコードを記載すればいいのでしょうか・・。 今入力seetには下記のようなコードを入力しています。 反映させるseetはALLとういseet名です。 --------------------------------------------------------------------------------------- Private Sub CommandButton1_Click() With Sheets("入力") If .Range("F8") = "" Then MsgBox "商品ブランドが選択されていません", , "エラー" .Range("F8").Select Exit Sub End If Dim i As Long i = Sheets("ALL").Cells(65536, 1).End(xlUp).Row + 1 Sheets("ALL").Cells(i, 1).Value = .Range("K2").Value Sheets("ALL").Cells(i, 2).Value = .Range("F6").Value Sheets("ALL").Cells(i, 3).Value = .Range("F8").Value Sheets("ALL").Cells(i, 4).Value = .Range("F10").Value Sheets("ALL").Cells(i, 5).Value = _ .Range("F12").Value & "-" & .Range("H12").Value & "-" & .Range("J12").Value Sheets("ALL").Cells(i, 6).Value = .Range("F14").Value Sheets("ALL").Cells(i, 7).Value = .Range("F16").Value Sheets("ALL").Cells(i, 8).Value = .Range("F18").Value Sheets("ALL").Cells(i, 9).Value = .Range("F20").Value Sheets("ALL").Cells(i, 10).Value = .Range("F22").Value Sheets("ALL").Cells(i, 11).Value = .Range("F24").Value Sheets("ALL").Cells(i, 12).Value = .Range("F26").Value Sheets("ALL").Cells(i, 13).Value = .Range("F28").Value .Range("F6,F8,F10,F12,H12,J12,F14,F16,F18,F20,F22,F24,F26") = "" End With End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) End Sub --------------------------------------------------------------------------------------- 宜しくお願いします。 ---- 現在のコードは 「ALLとういseet名」のシートにデータを入れますね。 これが 「A1で選んだseet名」のシートに入れば良いですね。 コード内の  Sheets("ALL") を、ALL ではなく  Sheets( A1で選んだsheet名 ) にしたいのですから 該当個所(14箇所)を  Sheets(.Range("A1").Value) と置き換えれば良さそうに思います。 上手く行きそうですかね。 (HANA) ---- (HANA)さんありがとうございます! ただ登録ボタンを押して入力しようとすると 【このコマンドを使用するとデバッグは中断します】という エラーがでてしまいま す。。 また下記の一行目がなぜか黄色の帯状ででてきてしまいます。。 ----------------------------------------------------------------- Private Sub CommandButton1_Click()→黄色の帯状ででてくる。 With Sheets("入力") If .Range("F8") = "" Then MsgBox "仕入形態が入力されていません。", , "エラー" .Range("F8").Select Exit Sub End If Dim i As Long i = Sheets(.Range("A1").Value) .Cells(65536, 1).End(xlUp).Row 1 Sheets (.Range("A1").Value) .Cells(i, 1).Value = .Range("K2").Value Sheets (.Range("A1").Value) .Cells(i, 3).Value = .Range("F8").Value Sheets (.Range("A1").Value) .Cells(i, 4).Value = .Range("F10").Value Sheets (.Range("A1").Value) .Cells(i, 5).Value = _ .Range("F12").Value & "-" & .Range("H12").Value & "-" & .Range("J12").Value Sheets (.Range("A1").Value) .Cells(i, 6).Value = .Range("F14").Value Sheets (.Range("A1").Value) .Cells(i, 7).Value = .Range("F16").Value Sheets (.Range("A1").Value) .Cells(i, 8).Value = .Range("F18").Value Sheets (.Range("A1").Value) .Cells(i, 9).Value = .Range("F20").Value Sheets (.Range("A1").Value) .Cells(i, 10).Value = .Range("F22").Value Sheets (.Range("A1").Value) .Cells(i, 11).Value = .Range("F24").Value Sheets (.Range("A1").Value) .Cells(i, 12).Value = .Range("F26").Value Sheets (.Range("A1").Value) .Range("A1,F8,F10,F12,H12,J12,F14,F16,F18,F20,F22,F24,F26") = "" End With --------------------------------------------------------------- どこか不備があるのでしょうか・・。何度も申し訳ないです。。。、 ---- 改行はこちらへ貼り付けた際に行いましたか? 実際も改行されている場合は、改行を削除して下さい。   Sheets (.Range("A1").Value).Cells(・・・   と一行にする。 また、最後の方に「Sheets (.Range("A1").Value)」しか無い行が有りますが・・・。 最初の方の i=・・・の .Row の後ろに「1」が有りますが・・・。 あとは、VBEの方(コードを貼り付ける方)の窓の上の所に 「中断」と書いてあったら、メニューの三角定規マークの隣にある ■(リセット)を押してリセットした後、実行してみて下さい。 (HANA) ---- HANAさん何度もアドバイスありがとうございます! 改行は削除しました。 >あとは、VBEの方(コードを貼り付ける方)の窓の上の所に 「中断」と書いてあったら、メニューの三角定規マークの隣にある ■(リセット)を押してリセットした後、実行してみて下さい。 こちらもやってみましたが、【実行エラー9 インデックスが有効範囲にありません】と でてしまいます・・。 コードもいろいろ確認してみたりしているのですが、エラーが毎回でてしまいます・・。 関係ないかもしれませんが、 > With Sheets("入力") If .Range("F8") = "" Then MsgBox "仕入形態が入力されていません。", , "エラー" .Range("F8").Select Exit Sub 上記のコードは9項目エラーがでるように設定しています。 なので上記コードが9続いて入力しています。 今回のエラーと何か関係ありますでしょうか・・? また>最初の方の i=・・・の .Row の後ろに「1」が有りますが・・・。 を確認してみました。 もともとseetをわける前には >i = Sheets(.Range("A1").Value).Cells(65536, 1).End(xlUp).Row + 1 と記載して問題はなかったのですが、 このコードの意味が自分で分かっていません・・。 昔誰かが使っていたエクセルを使いまわしていたので・・。 ------------------------------------------------------------------ Private Sub CommandButton1_Click() With Sheets("入力") If .Range("F8") = "" Then MsgBox "仕入形態が入力されていません。", , "エラー" .Range("F8").Select Exit Sub End If Dim i As Long i = Sheets(.Range("A1").Value).Cells(65536, 1).End(xlUp).Row + 1 Sheets(.Range("A1").Value).Cells(i, 1).Value = .Range("K2").Value Sheets(.Range("A1").Value).Cells(i, 3).Value = .Range("F8").Value Sheets(.Range("A1").Value).Cells(i, 4).Value = .Range("F10").Value Sheets(.Range("A1").Value).Cells(i, 5).Value = _ .Range("F12").Value & "-" & .Range("H12").Value & "-" & .Range("J12").Value Sheets(.Range("A1").Value).Cells(i, 6).Value = .Range("F14").Value Sheets(.Range("A1").Value).Cells(i, 7).Value = .Range("F16").Value Sheets(.Range("A1").Value).Cells(i, 8).Value = .Range("F18").Value Sheets(.Range("A1").Value).Cells(i, 9).Value = .Range("F20").Value Sheets(.Range("A1").Value).Cells(i, 10).Value = .Range("F22").Value Sheets(.Range("A1").Value).Cells(i, 11).Value = .Range("F24").Value Sheets(.Range("A1").Value).Cells(i, 12).Value = .Range("F26").Value Sheets(.Range("A1").Value).Cells(i, 13).Value = .Range("F28").Value .Range("A1,F6,F8,F10,F12,H12,J12,F14,F16,F18,F20,F22,F24,F26") = "" End With End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) End Sub --------------------------------------------------------------------------- 上記のようにコードを設定、また、リセットし実行すると 実行エラー9とでてしまいます。。 反映するほうのseetにも何か設定が必要なのでしょうか・・・? 何度も本当に申し訳ないです・・。 ---- >【実行エラー9 インデックスが有効範囲にありません】 は、タブン シート名が一致していないのだと思います。 ↓のコードで、A1セルに入力されているシートが選択出来ますか?  それとも、同じエラーになりますか? Sub シート選択() 'A1セルに入力されているシートを選択します。 Sheets(Range("A1").Value).Select End Sub A1セルの入力規則を解除して シートタブからシート名をコピーして 貼り付けた後、もう一度やってみて下さい。 ちなみに、A1セルの書式設定は「標準」ですか? >上記のコードは9項目エラーがでるように設定しています。 >なので上記コードが9続いて入力しています。 これは関係ないと思います。 (HANA) ---- HANAさん! ありがとうございます!! できました!! 本当に何度も何度もありがとうございます! 勉強になりました!! (mako) ---- 出来ましたか。良かったです。 このコードは、必ず入力シートが表示された状態で 実行されますよね? でしたら「With Sheets("入力")」は省略出来ます。 すると、「With Sheets(.Range("A1").Value)」と書いて こちら側を省略する事が出来るように成ります。 ↓の様に。 Private Sub CommandButton1_Click() Dim i As Long   If Range("F8") = "" Then MsgBox "仕入形態が入力されていません。", , "エラー" Range("F8").Select Exit Sub End If   With Sheets(.Range("A1").Value) i = .Cells(65536, 1).End(xlUp).Row + 1   .Cells(i, 1).Value = Range("K2").Value .Cells(i, 3).Value = Range("F8").Value .Cells(i, 4).Value = Range("F10").Value .Cells(i, 5).Value = _ Range("F12").Value & "-" & Range("H12").Value & "-" & Range("J12").Value .Cells(i, 6).Value = Range("F14").Value .Cells(i, 7).Value = Range("F16").Value .Cells(i, 8).Value = Range("F18").Value .Cells(i, 9).Value = Range("F20").Value .Cells(i, 10).Value = Range("F22").Value .Cells(i, 11).Value = Range("F24").Value .Cells(i, 12).Value = Range("F26").Value .Cells(i, 13).Value = Range("F28").Value End With   Range("A1,F6,F8,F10,F12,H12,J12,F14,F16,F18,F20,F22,F24,F26") = "" End Sub 因みに >i = .Cells(65536, 1).End(xlUp).Row + 1 この部分は 「Cells(65536, 1)」A65536のセル から 「End(xlUp)」  上方向へ移動し、最初に入力が有るセル 「Row」     の行番号 「+ 1」     に+1した値 つまり、A列の入力が有る最終行に+1した これからデータを転記する行を取得しています。 「With Sheets("入力")」をやめて「With Sheets(.Range("A1").Value)」にするので 今まで「.Range」と成っていた所が「Range」に変わり 「Sheets(.Range("A1").Value).Cells」と成っていた所が 「.Cells」に変わります。 (HANA) ---- >このコードは、必ず入力シートが表示された状態で 実行されますよね? はい!そうです! 省略できるんですね・・! やってみます! また、解説ありがとうございます!! 頑張ってエクセルマスターしたいです! HANAさんありがとうございました! (mako)