[[20090803103642]] 『別シ−トヘ自動転記』(みこ) ページの最後に飛ぶ

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

 

『別シ−トヘ自動転記』(みこ)

 ブック(1年間用)に各シ−ト「東芝」「ソニ−」「シャ−プ」「サンヨ−」「日立」
そして「本日予定表」があります。
「本日予定表」に入力したら
各「東芝」「ソニ−」「シャ−プ」「サンヨ−」「日立」まで飛ぶようにしたいのですが

本日予定表(1日分)
A3に日付(2009/8/1)

         B             E             G            H             I
5    納入番号     納入コ−ド    納入予定量      実納入量      納入先
F      10           672            553            553          東芝
8       15          3214            276            300          東芝
9       18          5014            830            831          日立

7列目のFを例にとりますと

 東芝シ−トに

        A          B         C            J
         日付       曜日  納入コ−ド  納入番号
7        7/31        金       322             21
8        8/1         土       672             10
9        8/1         土       3214            15

このように日付、納入コ−ド、納入番号を自動転記させたいのですが

ご指導をおねかいします。


 方針1:エクセルの学校全文検索からの結果の過去ログを参考にやってみる
http://www.excel.studio-kazu.jp/cgi-bin/estindex/estseek2.cgi?phrase=%E8%87%AA%E5%8B%95%E3%80%80%E8%BB%A2%E8%A8%98%E3%80%80%E5%88%A5%E3%82%B7%E3%83%BC%E3%83%88&perpage=10&attr=@uri+STRINC+kazuwiki&order=@uri+STRD&clip=-1&navi=0
 
方針2:google検索からの結果を参考にやってみる
http://www.google.co.jp/search?hl=ja&safe=off&rlz=1G1GGLQ_JAJP339&q=%E8%87%AA%E5%8B%95%E3%80%80%E8%BB%A2%E8%A8%98%E3%80%80%E5%88%A5%E3%82%B7%E3%83%BC%E3%83%88&btnG=%E6%A4%9C%E7%B4%A2&lr=
 
方針3:本日分でーたをいちいち転記ではなくて、1年間全データをリストに貯める。
日付を含めた入力とすれば、オートフィルタやピボットテーブルでの
集計が可能になるので、メーカごとにシートに振り分けると言う発想は必要なくなる。
 
(みやほりん)(-_∂)b


 みやほりんさん
回答ありがとうございます。

方針3に関しては、各書式が決まっているので
だめかと

方針1,2を調べてみましたが
合点のいくものがなく
参考にしょうと思っても
私には理解できません。

VLOOKUP関数を使って思考錯誤しましたが
うまく行ないです。

関数に関しては
簡単ものしか使った事がないもので

どうか

宜しくお願いします。

(みこ)


 たぶん「本日予定表」シートのデータは
 当日分のみを書いて行くのだと思いますので
 どうしても、マクロのスキルが必要に成ると思います。

 この手のお話は、転記自体のコードはそう難しくなく出来るのですが
 エラー処理を考えるのが面倒だと思います。

 今回の質問は、みこさんの入力を支援する物でしょうか?
 それとも、この様な作業が多くあり 幾人かの入力を
 簡素化するための物でしょうか?

 (HANA)


 HANAさん
返事ありがとうございます。

 >マクロのスキルが必要に成ると思います。
 マクロは難しいイメ−ジを持つています。

 >今回の質問は、みこさんの入力を支援する物でしょうか?
 >それとも、この様な作業が多くあり 幾人かの入力を
 >簡素化するための物でしょうか?
 今までは、各シ−トに直接入力していたのですが、
 ISOの管理文書の改訂で当日分の「本日予定表」作る事になったのです。
 本日予定表は私が入力して別の課へも配布しています。
 私が管理しているシ−トに「本日予定表」から転記できればと
 思い投稿しました。

(みこ)


 >マクロは難しいイメ−ジを持つています。
 でも、数式でやるのはもっと難しいんじゃないかと思います。

 >当日分の「本日予定表」作る事になったのです。
 >本日予定表は私が入力して別の課へも配布しています。
 この辺りのイメージが良く分からないのですが。

 ブックには、6枚シートが有るのですよね?
 次の日に成ったら、前の日の「本日予定表」はどうなるのですか?
 また、配布とは ブック毎配布するのですか?
 それとも、例えば印刷して とか・・・?

 (HANA)

 それと、気になっているのですが
 本日予定表シートの
 A,C,D,F列には、何が入っているのですか?
 また、入力はB:Iの範囲しか無いのでしょうか?

 見出し行は5行目で、6行目からがデータでしょうか?

 もしかして
 >本日予定表(1日分) 
 って事は、本日予定表は31日分有るってこと・・・?
 つまり 31 + 5 枚のシートがある?

 (HANA)

 >ブックには、6枚シートが有るのですよね?
 はいそうです。

 >次の日に成ったら、前の日の「本日予定表」はどうなるのですか?
 前日の分は消して本日分を入力します。

 >また、配布とは ブック毎配布するのですか?
 本日予定表のシ−トを印刷して配布します。

(みこ)


 >A,C,D,F列には、何が入っているのですか?
A=納入担当者
C=納入車の車番
D=納入倉庫No
F=品名

 >入力はB:Iの範囲しか無いのでしょうか?
はいそうです。
最後に備考欄を設けてあります。

 >見出し行は5行目で、6行目からがデータでしょうか?
その通りです。

 >って事は、本日予定表は31日分有るってこと・・・?
いいえ、1日だけです。

(みこ)


 >最後に備考欄を設けてあります。
 そして、転記が必要なのは 日付とE7,B7セルのみですか?

 もしかして、どの行にどのデータが入るのか
 決まっているのですか?
 例えば、7行目は必ず「東芝」と決まっているなら
 どのシートに転記すれば良いのかは決まってきますよね?

 但しそうなると、データの無い行(転記が不要な行)も
 出てきそうに思いますが。。。

 せっかく書いたので以下をそのまま載せておきますが
 状況によっては考え方の変更が必要かもしれません。
 私のイメージと、実際の状態が違うようで有れば
 お早めにお申し出頂ければと思います。

 ・・・取り敢えず、毎回変わってしまうとして・・・・
 まずは、コードを作成する前に 少し 実行&イメージ してみて下さい。

 東芝シ−トには、
 >7        7/31        金       322             21
 の行までしかデータが無いとします。

 今から
 本日予定表シートの
 >F      10           672            553            553          東芝
 の行を転記しようと思います。

 まず、本日予定表シートのI7のセルを見て
 5枚のシートの内、どのシートに転記するのか確認しますね。

 この行は「東芝」のシートに転記すれば良い事が分かります。

 そこで、「東芝」のシートを開きます(見ます)。

 Ctrl + ↑(Ctrlキーを押しながら、上向き矢印を押す)のキー操作で
 アクティブセルから上方向へ連続するセルまで移動出来ます。

 東芝シートの、A20セルを選択して Ctrl + ↑ で移動してみて下さい。
 アクティブセルは A7 セルへ移動します。
 (読むだけでなく、実際に実行して確認して下さい。)

 このセルの一行下の行へ
 本日予定表シートの7行目のデータが転記されれば良いですね。

 このセルの一行下の行の
  A列に、本日予定表シートのA3セルの値
  B列に、本日予定表シートのA3セルの値
  C列に、本日予定表シートのE7セルの値
  J列に、本日予定表シートのB7セルの値
 と転記されれば、本日予定表シートの7行目に関しての処理が完了します。

 実際はこれが、6行目から、7,8,9・・・と
 入力のある最終行まで続くのですが
 この様に処理がされれば良い事はイメージ出来ますか? 

 (HANA)

 >実際はこれが、6行目から、7,8,9・・・と

質問で6行目が抜けていました。
申し訳ありません。

 >東芝シートの、A20セルを選択して Ctrl + ↑ で移動してみて下さい。
 >アクティブセルは A7 セルへ移動します。

その通り移動しました。

 >この様に処理がされれば良い事はイメージ出来ますか?

私の思っている通りです。

 HANAさん
 本日予定表シートのI6から入る
 東芝だけが
 東芝1棟
 東芝2棟
 東芝3棟
 の3っの名称が入ります。
 納入先の名称は
 全部で
 7っになります
 東芝1棟、東芝2棟、東芝3棟は
 東芝のシ−トに転記されます。

 抜けていました。
 申し訳ありません。

 宜しくお願いします。

(みこ)


 >東芝1棟、東芝2棟、東芝3棟は
 >東芝のシ−トに転記されます。
 これは少し面倒ですね。

 東芝は個別に確認が必要に成りそうです。

 因みに
 >転記が必要なのは 日付とE7,B7セルのみですか?
 >本日予定表シートのどの行にどのデータが入るのか決まっているのですか?
 はどうでしょう?

 毎日、前日のデータは全く消してしまって
 (或いは、本日不要な行は削除してしまって)
 A,C,D,F列を再度入力するのでしょうか?

 もしかして、これらは数式で表示させるのかな・・・?

 少しコードの話しにします。
 話を簡単にするために、まず 7行目のI列は「東芝」のみにして下さい。

 先ほどイメージしてもらった事をコードにすると こんな感じです。

 '------
Sub Sample_1()
Dim sn
    sn = Range("I7").Value
    With Sheets(sn).Range("A" & Rows.Count).End(xlUp).Offset(1)
        .Range("A1:B1").Value = Range("A3").Value
        .Range("C1").Value = Range("E7").Value
        .Range("J1").Value = Range("B7").Value
    End With
End Sub
 '------

 Alt + [F11]を押して、VBEを立ち上げます。
 VBEのメニュー・挿入(I)→標準モジュール(M)を選んで
 挿入した標準モジュール(白いページが開くと思います)に貼り付けて下さい。

 エクセルに戻って
 本日予定表シートをアクティブにした状態で、Sample_1を実行すると
 実行する度に、7行目のデータが東芝シートの最終行に転記されます。

 このコードの中で「=」が4回出てきますが これは【入力】と読んで下さい。
    sn = Range("I7").Value
 は、snにI7の値を【入力】 です。

 Sheets(sn) が、「I7の名前のシート」
 Range("A" & Rows.Count).End(xlUp) が、「Ctrl + ↑」
 Offset(1) が、「一つ下の行」

 に対応します。

 先ほどイメージしてもらったことが、コードではこの様に書けますが
 何となく分かりますか?

 (HANA)

 HANAさん
 転記しました。

>転記が必要なのは 日付とE7,B7セルのみですか?

そうです。

 B7には曜日が入るので、
 今は、日付が入ってしまいます。
 そこで
 ユ−ザ−定義で
「aaa」で曜日に変換しました。

 >毎日、前日のデータは全く消してしまって
 >(或いは、本日不要な行は削除してしまって)
 >A,C,D,F列を再度入力するのでしょうか?
 本日予定表シートの前日のデ−タは全て消します。
 A,C,D,F列は手入力で再度入力します。
 ◎A3に日付が入ったら
 前日のデ−タが消えれば助かるのですが
 ボタンを作ってマクロ記録するつもりです。

 >先ほどイメージしてもらったことが、コードではこの様に書けますが
 >何となく分かりますか?
 説明が丁寧ですから
 よくわかります。

(みこ)


 >ユ−ザ−定義で
 >「aaa」で曜日に変換しました。
 はい、その様にして下さい。
 曜日の文字が必要な場合は、もう一工夫必要になります。
 もしもご要望が有るなら、出来ますので お申し付け下さい。

 >◎A3に日付が入ったら
 >前日のデ−タが消えれば助かるのですが
 でしたら、
 転記した段階で消してしまうのが安全だと思います。

 Sample_1でやってもらったように、このままですと
 実行する度に同じデータが転記されてしまいますので。。。

 コードの方は、もう少し段階が有ります。
 ゆっくり進みますので、分かっているところはさらっと
 流していただければと思います。

 次の段階として、ループ処理に入ります。
 詳しくは、入門ページを探して下さい。
 簡単に書くと
   For i = 1 To 10
       何か処理
   Next
 と書くと、「何か処理」を i=1 から i=10 に成るまで繰り返します。

 Sample_1は、本日予定表シートの7行目を想定してのコードでしたので
 該当の「7」と成っている部分が  6 から始まって
 A列の最終行まで繰り返されれば、全ての行が処理出来る事に成ります。

 A列の最終行は
     Range("A" & Rows.Count).End(xlUp).Row
 です。
 A列最後のセルから、Ctrl + ↑ で移動した 行(.Row)番号

 ループ用の変数を追加して

 '------
Sub Sample_2()
Dim sn
Dim i As Long
For i = 6 To Range("A" & Rows.Count).End(xlUp).Row
    sn = Range("I" & i).Value
    With Sheets(sn).Range("A" & Rows.Count).End(xlUp).Offset(1)
        .Range("A1:B1").Value = Range("A3").Value
        .Range("C1").Value = Range("E" & i).Value
        .Range("J1").Value = Range("B" & i).Value
    End With
Next
End Sub
 '------

 こんな感じになりますが、どうでしょう?

 「Dim i」「For 〜 Next」が追加に成ったのと
 例えば I7 が "I" & i に成りました。
 iが7だったら "I" & 7 → "I7" に成りますね?

 (HANA)

 >転記した段階で消してしまうのが安全だと思います。
 そうですね

 >該当の「7」と成っている部分が  6 から始まって
 For i = 6 To Range("A" & Rows.Count).End(xlUp).Row
 この部分で7→6に変えているんですね。

 >「Dim i」「For 〜 Next」が追加に成ったのと
 >例えば I7 が "I" & i に成りました。
 >iが7だったら "I" & 7 → "I7" に成りますね?
 はい、よく解ります。

 6行目にデ−タを入れて
 Sample_2を実行させたのですが
 全く転記されません。
 なぜでしょう?

(みこ)


 おかしいですね。
 本日予定表シートを選択した状態で実行して居ますか?

 また、
    sn = Range("I" & i).Value
 の下に
    MsgBox Sheets(sn).Name & " シートの " & _
        Sheets(sn).Range("A" & Rows.Count).End(xlUp).Row & " 行目へ転記します。"
 を追加してやってみると、どの様なメッセージが表示されますか?

 (HANA)

 >本日予定表シートを選択した状態で実行して居ますか?

 はい、しています。

 >を追加してやってみると、どの様なメッセージが表示されますか?

 なにも表示もされないです。

 Sample_1は
 うまくいったのですが
 ????

(みこ)


 マクロが実行されていれば、エラーメッセージなり
 追加したメッセージボックスなり
 何か表示されても良さそうですが。。。

 マクロの実行の所で「Sample_2」は有りますか?
 そこから実行して居ますか?

 でしたら、[ 実行(R) ] ではなく [ステップイン(S)]を
 押してみて下さい。

 VBEが前面に出てきて、コード内で黄色くなっている行が有ると思います。
 [F8]を押すと、ハイライトが下がっていきますので
 どの行まで行った後に消えてしまうのか 教えて下さい。

 (HANA)


 以前同じ様な事を言われた気がするのですが
 どのログだったか忘れて見つけられないんですよね。(笑)

 >Sample_1は
 >うまくいったのですが
 って事なので、もう一度 Sample_1を実行したらどうか
 とか、
 I7の値を I6にコピーしてみたらどうか
 とか
 やってみて下さい。

 それから、テストデータとしてA列に入力が無い物を使っていたら
 A列にも入力して下さい。

 Range("A" & Rows.Count).End(xlUp).Row
 の行まで処理をする事にしてあるので。

 (HANA)

 おせわになっています。

 >マクロの実行の所で「Sample_2」は有りますか?

 本日予定表シ−トから
「Sample_2」を選択して実行しています。

 >でしたら、[ 実行(R) ] ではなく [ステップイン(S)]を
 >押してみて下さい。

「Sub Sample_2()」コード内が黄色くなっています。

 >[F8]を押すと、ハイライトが下がっていきますので
 >どの行まで行った後に消えてしまうのか 教えて下さい。

一回目

For i = 6 To Range("A" & Rows.Count).End(xlUp).Row

 2回目

End Sub

 >テストデータとしてA列に入力が無い物を使っていたら
 >A列にも入力して下さい。

 A列に入力したら
「東芝シ−トの6行目へ転記します」メッセ−ジが出ました。

宜しくお願いします。

(みこ)


 >A列に入力したら
 >「東芝シ−トの6行目へ転記します」メッセ−ジが出ました。
 って事は、転記されるように成りましたか?

 (HANA)


「東芝シ−ト」にデ−タが転記しました。

(みこ)


 データ量ももう少し増やして
 A列の最後の行まで処理が行われる事を
 確認してみて下さい。
  その際I列には「東芝」以外の名称も入れてみて下さい。

 また、A列に入力が無い状態(昨日の状態)の時
 転記されなかった(何も起きなかった)理由についても
 少し考えてみて頂ければと思います。
   iの値がどうなっているのか(6から始まり何番まで行くのか)想像しながら
   ステップインで一行ずつ実行していくと
   分かりやすいかもしれません。

 連続転記が無事に行われたと言うご報告を頂きましたら
 >東芝1棟、東芝2棟、東芝3棟は
 >東芝のシ−トに転記されます。
 この部分の処理を付け加えようと思います。

 (HANA)


 >A列の最後の行まで処理が行われる事を
 >確認してみて下さい。
 MsgBox Sheets(sn).Name & " シートの " & _
        Sheets(sn).Range("A" & Rows.Count).End(xlUp).Row & " 行目へ転記します。"
 を消して実行しました。

「OK」ボタンを何度も押さなくてはいけないので

 最後の行までは
 とりあえず40000行まで行いました。

 >その際I列には「東芝」以外の名称も入れてみて下さい。
 入れて実行してみました。

各シ−トへデ−タが転記された事を確認しました。

(みこ)


 >とりあえず40000行まで行いました。
 そんなにたくさんやってもらったのですか?
   5つぐらいで良かったのですが。。。^^

 って事で、まだコードの作成は続きますので
 5つ位に減らして下さい。
 >MsgBox ・・・ を消して実行しました。
 こちらは、消しておいてもらって良いです。

 上手く行った様ですので、Sample_3を作ることにします。

 今回は、条件分岐 If 〜 End If を使用します。
 こちらも簡単に書くと
  If 条件 Then
     条件成立時の処理
   Else
       条件不成立時の処理
   End If
 と言った形に成ります。

 今回は
 >東芝1棟、東芝2棟、東芝3棟は
 >東芝のシ−トに転記されます。
 ですから、
 sn(I列の値)が「東芝1棟、東芝2棟、東芝3棟」の時、シート名(sn)を「東芝」にする。
 ですが、よく見てみると
 『左二文字が東芝の時』と言う条件で 3パターンに対応出来そうです。

 左二文字は、ワークシート関数にも有りますが
 Left(sn, 2) で取り出せます。
 これが "東芝" と等しいかどうかを条件にするので。。。

 '------
Sub Sample_3()
Dim sn
Dim i As Long
For i = 6 To Range("A" & Rows.Count).End(xlUp).Row
    sn = Range("I" & i).Value
    If Left(sn, 2) = "東芝" Then
        sn = "東芝"
    End If
    With Sheets(sn).Range("A" & Rows.Count).End(xlUp).Offset(1)
        .Range("A1:B1").Value = Range("A3").Value
        .Range("C1").Value = Range("E" & i).Value
        .Range("J1").Value = Range("B" & i).Value
    End With
Next
End Sub
 '------

 これまで出てきた「=」は【入力】と言う意味でしたが
 今回出てきた「=」は【等しいか】と言う意味で使われます。

 また、今回 条件不成立時(左二文字が東芝で無い時)は
 sn(シート名)はsn(I列の値)のままで変更しなくて良いので
 >  Else
 >      条件不成立時の処理
 の部分は使っていません。
 (強いて書くなら sn = sn ・・・?)

 I列の「東芝」を「東芝1棟」「東芝2棟」「東芝3棟」等に変更して
 テストしてみて下さい。

 (HANA)

 段階ごどの肉付け説明

 とても解りやすいです。

 > I列の「東芝」を「東芝1棟」「東芝2棟」「東芝3棟」等に変更して
 テストしてみて下さい。

 検証、東芝シ−トに転記され
 各ソニ−、シャ−プ、サンヨ−、日立
 それぞれのシ−トに転記されました。

(みこ)


 上手く行ったようですね。
 これで転記部分は完成です。

 後は
  転記が済んだら削除する
 と言うのと、エラー処理です。

 エラー処理は、
 なるべくたくさんの異常な(普通のデータ状況でない)状態を思い浮かべて
 そうなってもコードが途中で止まってしまったり
 思った動きとは違う動きをしたり、不安に成ったりしないように・・・
 するための処理です。

 簡単に思いつくところだと
  1.転記データ(A列の入力)が無いのに実行して仕舞った時
  2.I列に入力が無い時
  3.I列に入力してある名前のシートが無い時
 が有ると思います。

 まず、1番に付いてですが これは
 Range("A" & Rows.Count).End(xlUp).Row
 の結果が6より小さい時がそうですね。
 その場合は、メッセージボックスを表示。
 そうでない場合に、現在できて居るコードを実行しようとしたら
 どの様なコードを書けばよいか 分かりますか?

 Sub いちばん() を作ってみて下さい。

 条件で処理を分岐するので If 〜 End If を使う事に成りますね。
 条件が成立したときは Msgbox でメッセージを表示します。
 条件が成立しないとき(Elseとして)現在のコード(For i = 6 〜 Next)を実行です。

 因みに
 >最後の行までは
 >とりあえず40000行まで行いました。
 これは、実際の処理も毎日40000件有るのですか?

 (HANA)

 あっっ、一番忘れてはいけないエラー処理が有りました。。。
 「本日予定表」以外のシートがアクティブな状態で実行すると
 問題が起こるかもしれません。

 これも確認しておいた方が良さそうですね。

 ですが、(いちばん)が出来たらそう難しくは無いと思いますので
 初心を貫いて(いちばん)を作ってみて下さい。

 (HANA)

 HANAさん
 試験ですね(笑い)
 少し時間を下さい。
 作ってみます。

 >これは、実際の処理も毎日40000件有るのですか?
「データ量ももう少し増やして
 A列の最後の行まで処理が行われる事を
 確認してみて下さい。」

 A列の最後までやろうとしたんです が
 40000行までやれば
 認めてもらえるかなと
 思ったのです。

(みこ)


 >試験ですね
 はい。(笑)

 (いちばん)が難しそうなら
 (ぜろばん)
 アクティブシート名が「本日予定表」で無かったら
  「本日予定表シートをアクティブにして実行して下さい。」
  と言うメッセージを表示させる。
 Elseで For i = 6 〜 Next を実行

 ってのを作ってもらっても良いです。
 どちらでも、分かりやすそうな方をやってみて下さい。

 アクティブシート名の取得方法は。。。。Web検索して下さい。
 すぐに見つかると思います。

 等しいは「=」ですが、等しくないは「<>」です。

 >A列の最後までやろうとしたんです が
 済みません、書き方が悪かったですね。
 A列【に入力がある】最後の行
 ってつもりだったので。。。。

 40000行もやったら、時間がかかったんじゃないです?^^

 (HANA)

 >40000行もやったら、時間がかかったんじゃないです? 
 かかりました、ましてやボタン押しがあったから
 (笑)

アクティブシート名が「本日予定表」で無かったら

  「本日予定表シートをアクティブにして実行して下さい。」
  と言うメッセージ

Sub Sample_4()

 Dim sn
 Dim i As Long
 Ans = MsgBox("本日予定表ですか?", vbYesNo, "納入管理")

    If Ans = vbYes Then
    MsgBox "本日予定表シートをアクティブにして実行して下さい。"

    Else
    MsgBox "終了してください"
    End If

For i = 6 To Range("A" & Rows.Count).End(xlUp).Row

    sn = Range("I" & i).Value
    If Left(sn, 2) = "東芝" Then
        sn = "東芝"
    End If
    With Sheets(sn).Range("A" & Rows.Count).End(xlUp).Offset(1)
        .Range("A1:B1").Value = Range("A3").Value
        .Range("C1").Value = Range("E" & i).Value
        .Range("J1").Value = Range("B" & i).Value
    End With
Next
End Sub

 何点かな?
 わくわく

(みこ)


 >ましてやボタン押しがあったから
 あぁぁ・・・。(涙)

 そして
 >何点かな?
 みこさん!!びみょ〜ですよ!!

 「本日予定表ですか?」って質問に
 "はい"って言ってるのに 「本日予定表シートをアクティブにして」って言われるし
 "いいえ"を選んで
 >MsgBox "終了してください"
 ってメッセージボックスが表示されても
  For i = 6 〜 Next
 が実行されて仕舞いますし。。。

 動かして確認してみられてますよね?
 なんだか変な事になりますよね?(涙)

 でもって、
 「本日予定表」以外のシートが選択されていて
 確認メッセージが出たのに いつもの癖で [はい]を押して仕舞うと
 せっかくメッセージを出しても意味がないです。

 そもそも、今回の処理は「うっかり防止」ですから
 マクロが勝手に確認をするのが良いと思います。

 今回つくってもらいたいのは
 >アクティブシート名が「本日予定表」で無かったら 
 ですから、アクティブシート名を取得する方法を調べなくてはいけません。
 アクティブシート名が取得出来たら
 等しくないは「<>」ですから
 "本日予定表"と比べればいいです。

 そして、Elseの所で
 >MsgBox "終了してください"
 でなくて
 >For i=6 〜 Next
 です。

 IF アクティブシート名が"本日予定表"でない Then
      メッセージ
 Else
      For i = 6 〜 Next
 End If

 そしたら、
 ・・・でない時にメッセージが表示されて End If に移動
 ・・・だった時に Else に分岐するので For i 〜 Next が
 実行されて、それが済んだら End If に移動
 します。

 (HANA)

 お世話になっています。

 0点ですね
 アクティブシ−トの取得について調べていました。

 'シートが存在しない場合 
      Sheets.Add.Name = Cells(1, 1).Value 
      Set sn = ActiveSheet 
    Else 
      'シートが存在する場合 
    End If 

    '存在チェックしたシートをアクティブにします 
    sn.Activate 
    MsgBox "シート " & ws.Name & " はあります" 
  Next 
  MsgBox "終了しました" 
End Sub 

 このコ−ドが一番近いかな、

 色々試しましたが

 エラ−の連続(泣)

 >アクティブシート名が取得出来たら
 >等しくないは「<>」ですから
 > "本日予定表"と比べればいいです。

 意味は
 解るのですが
 どのように表示させればよいのか?

 HANAさんのレスは

ほとんど答えに近いかと思います、

 それを理解できない私は
 おバカの100乗

 もう少しヒントを
 お願いします。

(みこ)


 難しいですね。。。
 でも、惜しいところまで行っているかな・・・?
 たくさん調べて、たくさん考えて、たくさんエラーを出した方が
 はやく分かるように成ると思うので
 もう少し頑張ってみて下さい。

 Sample_2 が、上手く動かなかった時に
 メッセージボックスを表示するコードを
 付け加えてもらいましたね?
 その後、40000回(?) [ OK ] を押した奴です。(笑)

 その時のコードは
 >MsgBox Sheets(sn).Name & " シートの " & _
 >       Sheets(sn).Range("A" & Rows.Count).End(xlUp).Row & " 行目へ転記します。"
 でしたね。

 Sheets(sn).Name で、転記先のシート名が表示されたと思います。
 でもって
 >Sheets(sn) が、「I7の名前のシート」
 でしたね。

 みこさんのコードは
 「Set sn = ActiveSheet」
 ってしてあります。

 右側に書いてある ActiveSheet が「アクティブに成っているシート」
 だと思ったから、この様にされたのですよね?

 「I7の名前のシート Sheets(sn)」の名前を知るには
   Sheets(sn).Name
 で良かったです。

 では、「アクティブに成っているシート ActiveSheet」の名前は?

 (HANA)

 因みに、こんな感じで検索すると

http://www.google.co.jp/search?hl=ja&q=%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%80%80%E3%83%9E%E3%82%AF%E3%83%AD%E3%80%80%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B7%E3%83%BC%E3%83%88%E3%80%80%E3%82%B7%E3%83%BC%E3%83%88%E5%90%8D&lr=

 見つかります。

 (HANA)

お世話になっています。

お手上げ状態です。 

Sub Sample_5()

 Dim sn
 Dim i As Long

 If ActiveWorkbook.Worksheets.Count = 2 Then

        MsgBox "本日予定表ではありません。"
        Exit Sub
    End If
 For i = 1 To ActiveWorkbook.Worksheets.Count
        If Sheets(sn).Name <> "本日予定表" And _
           Sheets(sn).Name <> "実行" Then

        End If
    Next
 Result = MsgBox(Sheets(sn).Name & "本日予定表シートをアクティブにして実行して下さい。" & Chr (13) _
              & Chr(13) & "はい   :実行します。" _
              & Chr(13) & "いいえ  :実行しません。" _
              & Chr(13) & "キャンセル:マクロを終了します。")
    If Result = 2 Then 'キャンセル
        Exit Sub
    Else

(みこ)


 では、よそ見をせずに 以下の質問文から想像して答えて下さい。

 「Sheets(sn)」のシート名は
   Sheets(sn).Name で得られます。

 では、「ActiveSheet」のシート名は
 どの様に書けば得られるでしょう?

 この4行の文章から【推測】して答えて下さい。

 (HANA)


ActiveSheet.Name
です。

(みこ)


 そうです!!
 なので
 >IF アクティブシート名が"本日予定表"でない Then
 >     メッセージ
 >Else
 >     For i = 6 〜 Next
 >End If
 は

 If ActiveSheet.Name <> "本日予定表" Then
      MsgBox "本日予定表シートをアクティブにして実行して下さい。"
 Else
      'For i = 6 〜 Next の処理
 End If

 になります。

 「本日予定表」シートをアクティブにして実行。
 別のシートをアクティブにして実行。
 してみて下さい。

 「本日予定表」シートをアクティブにして実行すると
   転記処理(Else の中に書いた処理)がされて
 別のシートをアクティブにして実行すると、
   メッセージが表示されるだけで 転記処理はされません。
 ・・・・よね?

 なんだか難しく考えすぎていたでしょう?

 (HANA) 

 Sub Sample_117()
Dim sn
Dim i As Long

If ActiveSheet.Name <> "本日予定表" Then

      MsgBox "本日予定表シートをアクティブにして実行して下さい。"
 Else

For i = 6 To Range("A" & Rows.Count).End(xlUp).Row

    sn = Range("I" & i).Value
    If Left(sn, 2) = "東芝" Then
        sn = "東芝"
    End If
    With Sheets(sn).Range("A" & Rows.Count).End(xlUp).Offset(1)
        .Range("A1:B1").Value = Range("A3").Value
        .Range("C1").Value = Range("E" & i).Value
        .Range("J1").Value = Range("B" & i).Value
    End With
Next

 End If
End Sub

 >「本日予定表」シートをアクティブにして実行すると
 >転記処理(Else の中に書いた処理)がされて
 >別のシートをアクティブにして実行すると、
 >メッセージが表示されるだけで 転記処理はされません。

その通りになりました。

少し白髪ができました(笑)

 HANAさんはレスの中で
 答えを出していたんですね。

(みこ)


 >少し白髪ができました(笑) 
 それは大変!!
 たくさん書いていたのに、読んで下さらないんですもの。(笑)

 Googleの検索結果の中にも
 >アクティブシート名をセルに入力する
 >Range("A1") = ActiveSheet.Name
 ってのが有るんですよ〜。(現時点で、一番上に表示されているページです。)

 因みに、
 みこさんが手がけていた方法は、
 >3.I列に入力してある名前のシートが無い時
 のエラー処理として使われることが多いと思います。

 転記しようとするシート名(sn)と
 実際に有るシート名(.Name)を見比べていって
 見つかったら、そのシートがあるので 転記をする
 見つからなかったら、そのシートは無いので転記しない。
 ・・・と言った感じで。

 ただ、今回は別の方法を使います。
 該当シート名のシートが有るか無いか確認せずに
 「○○のシートの!!」って言うと、
 そのシートが無かった時に、エクセルがエラーを出すので
 エラーで止まらない様に言いつけておいて
 ※ On Error Resume Next
 こそっとエラー番号を確認して
 ※                     If Err = 0 Then
 エラーでなかったら転記処理を行い
 エラーだったら、メッセージを出して
 ※                     Else
 その行は転記処理を行いません。

 この様な処理の流れにする事にしたので
 一行転記が済む度に、その行のデータは消します。
 ※                         Range("A" & i & ":J" & i).ClearContents

 例えば、9行目の行でシート名が見つからず 転記されなかった場合
 I9セルの値を正しい入力に変更して、再度実行する事に成りますが
 その際、6〜8行目は入力が無い状態です。
 (一度目の転記で成功してデータを削除してあるので。)
 そこで
 >2.I列に入力が無い時
 の処理が必要に成ってきます。
 ※             If sn <> "" Then
 ・・・実際は 入力がある時に処理をする コードにしてありますが。

 あとは、最初の
 >1.転記データ(A列の入力)が無いのに実行して仕舞った時
 も加えておきます。

 Range("A" & Rows.Count).End(xlUp).Row 
 が2回出てくる事に成るので、変数に入れて
 ※     mr = Range("A" & Rows.Count).End(xlUp).Row
 ※     If mr < 6 Then
 以降はその変数で処理をする事にしています。
 ※         For i = 6 To mr

 '------
Sub miko()
Dim sn, mr As Long
Dim i As Long
    On Error Resume Next
    If ActiveSheet.Name <> "本日予定表" Then
        MsgBox "本日予定表シートをアクティブにして 実行して下さい。"
    Else
        mr = Range("A" & Rows.Count).End(xlUp).Row
        If mr < 6 Then
            MsgBox "データが有りません。"
        Else
            For i = 6 To mr
                sn = Range("I" & i).Value
                If sn <> "" Then
                    If Left(sn, 2) = "東芝" Then
                        sn = "東芝"
                    End If
                    With Sheets(sn).Range("A" & Rows.Count).End(xlUp).Offset(1)
                        If Err = 0 Then
                            .Range("A1:B1").Value = Range("A3").Value
                            .Range("C1").Value = Range("E" & i).Value
                            .Range("J1").Value = Range("B" & i).Value
                            Range("A" & i & ":J" & i).ClearContents
                        Else
                            MsgBox i & " 行目は転記出来ません。" & vbLf & _
                                    "I" & i & " セルの値 (" & Range("I" & i).Value & ") を確認して下さい。"
                            Err = 0
                        End If
                    End With
                End If
            Next
        End If
    End If
End Sub
 '------

 エラー処理として、何をどこまで入れるかは
 いつでも悩ましい問題だと思いますが。。。

 今回のコードは、転記済みデータの削除処理を入れていますので
 テスト前には、テストデータを退避しておいて下さい。

 それと、消す範囲が今一良く分かっていません。
 A列から、備考欄も入れてJ列まで?

 あとは【ここ重要なんですが】せっかくたくさんのデータを入力するのに
 その一部しか残さないのは とても勿体ないと思います。
 後日そのデータが有った方が良かった場合 ってのは、有る可能性が有る
 (たとえ非常に可能性が少なくても0ではない)と思いますので
 新たにシートを作ってでも、一覧にして残しておくのが良いと思いますよ。
 ご一考下さればと思います。

 (HANA)

 >たくさん書いていたのに、読んで下さらないんですもの。
「アクティブシート名の取得方法」ばかりが
 頭からはなれず
 そればかりが脳裏を巡っていました。
 HANAさんの文章も何度も読み返し、
 教えいただいたGoogleの検索もいっぱい見たり
 検索項目を「アクティブシート取得方法」とか変えたり、
 仕事帰りに本屋へ立ち寄り
 色んな本を見て
 やったのですが
 結果は
 この通りでした(笑)

 ボタン押しで転記させようと思っています。
 Sub miko()
 Dim sn, mr As Long
 Dim i As Long
  ↓
 Sub ボタン1_Click()
 Dim sn, mr As Date
 Dim i As Long
 動作確認はしたのですが
 どうでしょう?

 >それと、消す範囲が今一良く分かっていません。
 >A列から、備考欄も入れてJ列まで?
 A列から、M列まであります。
 Range("A" & i & ":j" & i).ClearContents
        ↓
 Range("A" & i & ":M" & i).ClearContents
 の変更でよいですよね?
 動作確認はしました。

 J列には、行ごとにチェックボックスを入れてあります。
 これは、転記したときに消えません。
 消せる方法はあるのでしょうか?
 そもそも
 チェックボックスを入れてあるのは、
 本社からのデ−タとの整合性を図るために作りました。
 *本日予定表への入力ミス防止

 >あとは【ここ重要なんですが】せっかくたくさんのデータを入力するのに
 >その一部しか残さないのは とても勿体ないと思います。
 >後日そのデータが有った方が良かった場合 ってのは、有る可能性が有る
 >(たとえ非常に可能性が少なくても0ではない)と思いますので
 >新たにシートを作ってでも、一覧にして残しておくのが良いと思いますよ。
 >ご一考下さればと思います。
 ありがとうございます。
 ISO管理文書上では、
 本日予定表は、紙面上として1年間 保存なので
 私が管理している転記シ−トは
 15年で
 転記デ−タのほうが大切なのです。

(みこ)


ActiveSheet.Name.Range(Array("Check Box 1", _
        "Check Box 2", "Check Box 3", _
        "Check Box 4", "Check Box 5", _
        "Check Box 6", "Check Box 7", _
        "Check Box 8", "Check Box 9", _
        "Check Box 10")).Select
    With Selection
        .Value = xlOff
    End With

 Dim i As Integer
 For i = 1 To 10
    ActiveSheet.Shapes("Check Box " & i).Select
    With Selection
        .Value = xlOff
    End With
    Next
 End Sub

 このコ−ドでチェックボックスの
 チェックが消えるみたいですが
 消えない

 ???

(みこ)


 >結果はこの通りでした(笑)
 でも、「推測」でも乗りきれるって 分かりました?^^
 全く根拠の無い推測じゃ駄目ですけどね。。。。

 今回調べたことも、もう少しマクロが分かるようになると
 使いどころが分かってくるようになると思います。

 >ボタン押しで転記させようと思っています。
 大丈夫です。
 ボタンを「本日予定表」にしか置かないなら
 うっかり他のシートで実行する事も無いと思うので
 それに関するエラー処理は不要だったかもしれませんね。

 >A列から、M列まであります。
 その変更で大丈夫です。

 >J列には、行ごとにチェックボックスを入れてあります。
 チェックボックスはいくつか種類があります。
 チェックボックスをダブルクリックして
 「コントロールの書式設定」が表示されるなら
 [コントロール]タブの リンクするセル で
 J列の各行のセルをリンクさせてみて下さい。

 >ISO管理文書上では
 そうかもしれませんが、文書(印刷物)を作ることが目的ではないはずです。
 ISOで決めたから○○をする では、本末転倒ですよ。

 まぁ、そんなことはどうだって良いんですが・・・・
 業務が分かりませんので断言出来ませんが 例えば
 「備考が@@だった時っていつだっけ」とか
 「この車番は前にいつ動いたっけ?」とか・・・が
 データとして残して有れば、
 紙を繰ったり 記憶を辿ったりしなくても
 簡単に検索出来ますし、後々集計なんて事にも使えます。

 消すのは一瞬で出来ますが、入力するのはそうはいきません。
 一度入力した物は、後生大事にとっておくのが良いと思います。
  その転記だって、マクロでやらせてしまえば
  シートが一つ増えるだけでしょ?

 (HANA)

 お世話になっています。

 返事が遅れて大変申し訳なく思っています。

 朝の地震で目が覚めた私です。

 >でも、「推測」でも乗りきれるって 分かりました?^^
 HANAさんに
 そう言われると
 嬉しいです。

 反面ビクビクしていました。
 返事を出すたびに
 問題をぶつけられる…んじゃないかと(笑)

 >ボタンを「本日予定表」にしか置かないなら
 >うっかり他のシートで実行する事も無いと思うので
 >それに関するエラー処理は不要だったかもしれませんね。
 いえいえ
 最初に言わなかった
 私に責任がありましたが
 それなりに
 勉強させていただきました。

 >チェックボックスをダブルクリックして
 >「コントロールの書式設定」が表示されるなら
 > [コントロール]タブの リンクするセル で
 > J列の各行のセルをリンクさせてみて下さい。
 これまた、知らなかった

 上記の用に
 させたのですが
 転記時にチェックは消えるのですが
 J列の各行のセルに
 チエックを入れた場合
 TRUEが表示され
 チエックを入れない場合
 FALSE、TRUEを表示させない方法は
 あるのでしょうか?
 条件付き書式で
 数式 J6=FALSE
 だったら
 フォントの色を白色にすれば
 消えますが
 TRUEも同様
 このやり方でよいでしょぅか?

 >消すのは一瞬で出来ますが、入力するのはそうはいきません。
 >一度入力した物は、後生大事にとっておくのが良いと思います。
 おっしゃるどおりだと思います。
 早急に本日予定の管理を
 ペェパ−レスから
 電子化に
 改訂しょうと思っています。

 HANAさん
 欲がでました。
 東芝は
 東芝1棟
 東芝2棟
 東芝3棟
 の3っの名称が入りましたよね。
 東芝シ−トのI列が
 納入先欄なのですが
 本日予定表から
 直接入るように
 できないでしょうか?

 それと
 本日予定表から
 別のブックに
 自動リンク転記される
 ことは可能なのでしょうか?

 宜しくお願いします。

(みこ)


 地震、大きかったみたいですね。大丈夫ですか?

 >FALSE、TRUEを表示させない方法
 J列は全ての文字が表示されなくて良いと思いますので
 条件付書式で設定するまでもなく
 文字色を白にしておけば良いと思います。

 >本日予定表から直接入るようにできないでしょうか?
 済みませんが、何をなさりたいのか良く分かりませんので
 もう少し詳しく説明して下さい。
 「直接入る」って、どこに何が?

 >本日予定表から別のブックに自動リンク転記
 可能ですが、お薦め出来ません。
 ですので、ご自身で研究して頂ければと思います。

 (HANA)

 >地震、大きかったみたいですね。大丈夫ですか?
 おかげさまで
 大丈夫でした。
 台風被害の方が大変でしたみたいですね。

 本日予定表(1日分)
 A3に日付(2009/8/1)

          B             E             G            H             I
5    納入番号     納入コ−ド    納入予定量      実納入量      納入先
6      10           672            553            553          東芝1棟
7      15          3214            276            300          東芝2棟
8      18          5014            830            831          日立
9      22           304            900            900     ソニ−
10     25           604            500            501          東芝3棟
11     33           777            555            555          シャ−プ

 転記ボタンを押すと
 東芝シ−トには

          A          B         C             J          P
         日付       曜日  納入コ−ド  納入番号              納入先
7        7/31        金       322             21               東芝1棟
8        8/1         土       672             10               東芝1棟
9        8/1         土       3214            15               東芝2棟
10       8/1         土     604            25               東芝3棟    

 このようにP列に入るようにできないでしょうか?

 >条件付書式で設定するまでもなく
 >文字色を白にしておけば良いと思います。
 そうですよね
 それが一番
 私は
 難しく考えすぎなのでしょうか(笑い)

 >可能ですが、お薦め出来ません。
 >ですので、ご自身で研究して頂ければと思います。
 はい
 わかりました。

(みこ)


 そう言えば、台風もでしたね。。。。

 >このようにP列に入るようにできないでしょうか?
 そう言うことでしたか。
 納入コード(E列をC列に)と、納入番号(B列をJ列に)は、↓の様にして書き込むのですから
                            .Range("C1").Value = Range("E" & i).Value
                            .Range("J1").Value = Range("B" & i).Value
 納入先も I列をP列に って感じで その下にでも追加してみて下さい。
                            .Range("P1").Value = Range("I" & i).Value

 ・・・でもこれって、東芝だけですか?
 他のシートにはP列無し?

 でしたら、IFの出番って事になりますが。。。

 ただ、今は不要かもしれませんが(他のシートは同じ内容ですし)
 後の事を考えると 他のシートにもP列を作って転記しておくのが
 良いんじゃないかと思います。

 (HANA)

 .Range("P1").Value = Range("I" & i).Value
で入りました。

 マクロのコ−ドもアルファベットでなく
 日本語なら
 解りやすいのですが
 翻訳ソフトがあるのですから
 何々を基準に
 こうしたら
 有る動作をしなさい
 名づけて
「簡単マクロコ−ドソフト」
 HANAさん
 作って下さい(笑)

 >後の事を考えると 他のシートにもP列を作って転記しておく
 現在は東芝のみになりますが
 そうですね
 で
 IF文は????
 何か
 嫌な予感
 質問されるのかな
 ドキドキ

(みこ)


 >「簡単マクロコ−ドソフト」
 簡単な物は、マクロの記録で出来ますよ。
 手順しか記録してくれませんけどね。。。
 今回の物も、その気になれば
 マクロの記録だけで出来ると思います。
 でも、コードを書いた方が すっきりと処理が出来ると思いますよ。

 >何か
 >嫌な予感
 >質問されるのかな
 って事は、「どうやるのか見当も付かない」って事ですか?

 If シート名(sn)が東芝の時は Then
     .Range("P1").Value = Range("I" & i).Value
 End If

 ってやるだけなんですが。。。^^;
 無理っぽいですか?

 (HANA)


 If Sheets(sn) = "東芝" Then
 .Range("P1").Value = Range("I" & i).Value
 End If
 このコ−ドをどこに入れるかって
 ことですよね?

(みこ)


 えっと・・・
    .Range("J1").Value = Range("B" & i).Value
 の下に

 If sn = "東芝" Then
     .Range("P1").Value = Range("I" & i).Value
 End If

 かな?

 If Sheets(sn) = "東芝" Then
 では、エラーになりますよね?

 強いてやるなら
 If Sheets(sn).Name = "東芝" Then
 でも、これって良く考えると変な処理ですよね?

 snが東芝だったら、
 Sheets(sn)で東芝のシート。
 そのシートの .Name シート名は?
 ・・・って、東芝でしょ。

 snが日立だったら、
 Sheets(sn)で日立のシート。
 そのシートの .Name シート名は?
 そりゃ日立だよね。。。

 (HANA)


 >.Range("A1:B1").Value = Range("A3").Value
 >.Range("C1").Value = Range("E" & i).Value
 >.Range("J1").Value = Range("B" & i).Value

 >If sn = "東芝" Then
 >.Range("P1").Value = Range("I" & i).Value
 >End If
 >Range("A" & i & ":j" & i).ClearContents
 P列に転記しました。

 >でも、これって良く考えると変な処理ですよね?
 >snが東芝だったら、
 >Sheets(sn)で東芝のシート。
 >そのシートの .Name シート名は?
 > ・・・って、東芝でしょ。
 >snが日立だったら、
 >Sheets(sn)で日立のシート。
 >そのシートの .Name シート名は?
 > そりゃ日立だよね。。。
 HANAさんの
 最後のコメントも
 ある意図が
 込められてる文章だと
 私は思います。
 私の今後の為のものかな?

 この板には「みこ」ハンドルネ−ムの方が
 多々みえますね。
 ハンドルネ−ムを誰も使わないネ−ムにしたら
 覚えいてくれるかも
 次回
 投稿した時も
 HANAさんが
 回答していただけたらな〜
 その時は
 HANAさん
 忘れていられるかも…ね(笑)

 HANAさん
 短い時間でしたけど
 少しは世間話を交えながらも
 お付き合いくださり
 投稿の内容とは違う事でも
 アドバイスをいただき
 感銘を受けています。
 忙しいなか
 色々とありがとうございました。

 HANA様へ
 みこより


 上手く行きましたか。良かったです。

 >この板には「みこ」ハンドルネ−ムの方が
 >多々みえますね。
 って事は、これが初めての質問ですか?
 点滅関係の質問をなさったみこさんや
 その辺りの(笑)みこさんと
 同じ方かと思ってましたが。。。
 違う方でしたら、失礼しました。

 それがプラスに働くか、マイナスに働くか分かりませんが
 なるべく過去の人と混ざらない様にしておかれるのが良いと思います。
 名前を忘れないかどうかとは又別問題として。

 >最後のコメントもある意図が込められてる文章だと私は思います。
 エクセルは「絶対こうしないといけない」って事は 余り多く無いと思います。
 全く遠回りをしていても、同じ結果にたどり着くことも出来ると思います。
 しかし、遠回りは なるべくなら しない方が良いと思います。

 これから先、ご自身で色々な処理をするコードや数式などを作ることが有ると思います。
 希望する結果が得られたときに、それで満足するのではなく
 考え方が行ったり来たりしていないか、見直してみてもらえればと思います。

 長いことおつきあいいただき、こちらこそ 有り難う御座いました。

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.