[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロの応用?』(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)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.