[[20090306121020]] 『マクロの応用?』(mako) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロの応用?』(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.