[[20040720114929]] 『データの入力と蓄積を別々に出来ますか??』(みず) ページの最後に飛ぶ

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

 

『データの入力と蓄積を別々に出来ますか??』(みず)

入力フォームを設けて、そこに入力したデータが自動的に別のシートへと

次々に蓄積されていくような方法はございますか。

下記の例ですと、Sheet1!A3:D3に見出しに沿って値を入力します。

すると、Sheet2!A3:D?の範囲へ
入力されたデータが次から次へと下方向に蓄積されていく

といった感じなのですが。。。

こんな操作は専用のソフトを用いればいいのかもしれませんが、

意地でもエクセルでやらなければなりません(涙)。

しかも、関数を使って出来たらとても助かるのですが・・・

どなたかご教授願います。

データ入力シート(Sheet1)

	 A	 B	  C	   D
1	入力フォーム			
2	氏名	生年月日 電話番号  入力日
3				

データ保存シート(Sheet2)

	  A	    B	        C	      D
1	保存フォーム			
2	氏名	  生年月日     電話番号    入力日
3	山田まるお 193X/5/20	 1919-888-8888  200X/7/20
4	水田真理  1980/11/10	 1192-296-2171  200X/7/21
5	原マキ   1976/12/12	 2236-067-1732  200X/7/21


関数でとのことでしたが、思いつきませんでした。
簡単なマクロですがよろしければご利用ください。
なお、シート名は、「データ入力シート」「データ保存シート」であるとしています。

マクロの作り方ですが、
エクセルのツールメニューからマクロ−Visual Basic Editerをクリックします。
Visual Basic Editer上で、左側上側の窓の中で、Microsoft Exlce Object を右クリック。挿入-標準モジュールをクリックしてください。
右側にMojule(コード)という窓が開きますので、ここへ以下のコードを貼り付けてください。

マクロを実行する際は、
エクセルのツールメニューから、マクロ−マクロ−マクロの実行−データ保存
を選んでください。(まこ)

Sub データ保存()

    Sheets("データ入力シート").Select
    Range("A3:D3").Select
    Selection.Copy

    Sheets("データ保存シート").Select
    If Range("A3") = "" Then
        Range("A3").Select
        ActiveSheet.Paste
    Else
        Range("A1").Select
        Selection.End(xlDown).Select
        ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Select
        ActiveSheet.Paste
    End If

    Sheets("データ入力シート").Select
    Range("A3:D3").Select
    Selection.ClearContents
    Range("A3").Select

End Sub


ありがとうございます!
初めてマクロを体験しました。
まだ単語や言語の意味を理解していないので

ただただ不思議です。

そこで、お願いなのですが、もしお時間がございましたら、
簡単な解説を頂きたいのですが。。。

行や列の異なる表で応用したいのです。。
すみません。(みず)


解説をとのことでした。
ほとんど英語そのままなのですが、どうぞご覧ください。

Sub データ保存() 'マクロ名です

    Sheets("データ入力シート").Select 'シート「データ入力シート」を選択します。
    Range("A3:D3").Select             '範囲A3:D3を選択します。
    Selection.Copy          '選択範囲をコピーします。

    Sheets("データ保存シート").Select 'シート「データ保存シート」を選択します。
    If Range("A3") = "" Then     'もし、範囲A3の内容が""(空白)に等しいならば
        Range("A3").Select            '    範囲A3を選択します。
        ActiveSheet.Paste             '    (先ほどコピーした内容を)貼り付けます。
    Else                              'そうではないならば(A3が空白でないならば)
        Range("A1").Select            '    範囲A1を選択します。
        Selection.End(xlDown).Select  '    選択範囲から、下方向の終わりのセルを、選択します。
                                      '  (エクセルでは、CTRL+↓です)
        ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Select
                                      '現在選択しているセル(activecell)から、rowOffset := 1ですから、行番号を一つ増やしたセルを、選択します。
        ActiveSheet.Paste             '    (先ほどコピーした内容を)貼り付けます。
    End If                            'IF文の終わりです。

    Sheets("データ入力シート").Select 'シート「データ入力シート」を選択します。
    Range("A3:D3").Select             '範囲A3:D3を選択します。
    Selection.ClearContents           '選択範囲の内容をクリアします。
    Range("A3").Select                '範囲A3を選択します。

End Sub                'マクロの終わりです。

ほとんど、マクロの自動記録そのままです。
(If文とOffsetはちょっと別ですが・・・)

マクロの記録は「Visual Basic ツールバー」で行うと便利です。
メニューバーの[表示]-[ツールバー]-[Visual Basic]で表示されます。

画面に細長いツールバーが表示されます。
ツールバーは、左から
1)右向き▲
2)中くらいの●
3)セキュリティ...
4)表になっているような□
5)金槌などの大工道具の絵
6)定規などの製図道具の絵
7)∞の絵
のアイコンです。

マウスカーソルをアイコンの上にのせてしばらくたつと、
それぞれのアイコンの意味が表示されます。

1)右向き▲
で記録したマクロを実行できます。

2)中くらいの●
でマクロの記録ができます。
例えば、セルを選択して、色を塗るなど、適当に操作を行ってみてください。
記録を終了するには、2)の●のアイコンが■になっていますので、■を押して終了してください。

4)表になっているような□
がマクロの編集を行うための、Visual Basic エディタが起動します。
どのように記録されたかを確認してみてください。

詳しくは、次のサイトをどうぞ。
エクセルマクロ・VBA編 − エクセル羅針盤 −
http://www2.cty-net.ne.jp/~hidenori/vba/
入門編です。マクロとは何かというところから始まって、一通り学
ぶことが出来ます。

すぐに役立つエクセルVBAマクロ集
http://www.sk2.aitai.ne.jp/~happy/
実際に必要となるマクロがさまざまに収録されていますので、
欲しいマクロを利用して下さい。

それでは(まこ)


よく先ほどのマクロを使われるのであれば、ツールバーに登録しておくと便利です。
[ツール]-[ユーザー設定]から[ツールバー]タブを選び、[新規作成]をクリックします。
すると、新しいツールバーが作成されます。
つぎに、[コマンド]タブを選び、分類(G)の中から、「マクロ」を選びます。
すると、右側に黄色いにっこりマークの「ユーザー設定ボタン」がありますので、先ほど作成したツールバーに、ドラッグします。
そしてツールバーに、にっこりマークがコピーされますので、にっこりマークを選び、右のボタンを押して、データの登録を行うマクロの登録を行えば、次回からはこのにっこりマークを押すと、データの登録を行うマクロが実行されるようになります。(まこ)


とってもご丁寧にありがとうございます。

以前、参考書を買っては見たもののちんぷんかんぷんだったのに、

なんとなくわかってきました!関数にばかりこだわらずに、

マクロにも踏み込むべきですね!!

ありがとうございました。勉強します。(みず)


すみませんエクセルの学校大変勉強になります。
時々ここにきては感心しながら書かれていることを試しています。
驚くばかりです。入力フォームを設けて、そこに入力したデータが自動的に別のシートへと次々に蓄積されていくような方法と書かれているのですが
データ入力シートへの入力項目がデータ保存シートへ貼り付けられていくのですが
三回目からは、データ保存シートの四行目に上書きされるだけなのですがなぜなのでしょう?
(超超初心者)

(超超初心者)
すみません出来ました
原因はデータ保存シートの1行目、2行目に何も書いていなかったせいのようです
結果を早く見たいとあせっていました。
お騒がせしました。
でも凄いなーと感心するばかりです。

遅ればせながら。

データ保存シート(Sheet2)

	  A	    B	        C	      D
1	保存フォーム			
2	氏名	  生年月日     電話番号    入力日

最初に書いてあったように A1の位置に文字が入っていればいいのですが(保存フォーム)、ここが空欄ですと、

 1        Range("A1").Select            'A1のセルを選択する(現在のアクティブセル=A1)
 2        Selection.End(xlDown).Select
                        ~~~~~~
この2行目の xlDownを実行するときに、「空欄」と「空欄でないところ」の境目で判断するので、この行を実行した後のアクティブセルが氏名のところ(A1とA2で判断されA2へ移動)になります。
そして、次行のコマンドでさらに一行下に移動(A2→A3)するので、

 3        ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Select  '一行下へ移動

 常に氏名の下の行(A3の行)に入力されると思われます。
 対策としては、Range("A1").Select の "A1"を"A3"になおせば確実かと思います。
 (先のマクロでは"Sheet2"の"A1"に文字が入っているのと、入っていないのでは、別の挙動をとってしまいます)
 (まさ)


凄いのひと言です。私も参考にさせていただいたのですが、加えて教えて頂ければ幸いです。

仮に【"データ入力シート"が5行あったとして、最初の2行のみ記入されている場合】

私の薄い知識では『未記入の残り3行もコピーされてしまうのです…』

記入した行のみをコピーした場合はどうしたら良いのか教えて下さい。


 どこで「2行しか記入されなかった」と判断できますか。
    Range("A3:D7").Copy
と記述すると、5行分、コピーされます。
例えば、D列の入力状況でコピーする行数を決定するのなら、(Excel2003の場合)
    Range(Range("A3") , Range("D65536").End(xlup)).Copy
と書けます。
(みやほりん)(-_∂)b

早速のご回答ありがとうございます!!
何度もスミマセンがまた教えて下さい…(´・ω・`;)

下記のとおり書いてみたのですが…

Sub データ保存()

    Sheets("データ入力シート").Select
    Range(Range("A3"), Range("D65536").End(xlUp)).Copy
    Selection.Copy

    Sheets("データ保存シート").Select
    If Range("A3") = "" Then
        Range("A3").Select
        ActiveSheet.Paste
    Else
        Range("A1").Select
        Selection.End(xlDown).Select
        ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Select
        ActiveSheet.Paste
    End If

    Sheets("データ入力シート").Select
    Range("A3:D7").Select
    Selection.ClearContents
    Range("A3").Select
End Sub

2行のみの選択は可能になりました!!
しかし"データ保存シート"にコピーされなくなってしまいました…


 とりあえず、3行目の
    Selection.Copy
 を消してみてください。

 または、
Range(Range("A3"), Range("D65536").End(xlUp)).Copy
 を
Range(Range("A3"), Range("D65536").End(xlUp)).Select にする。

 あと、画面のちらつきを気にする場合は、以下のようにしてSelectをなくしてやれば良いですよ。
'////////////////////////////////ここから 
Sub Test鮎()
Dim Input_Sh As Worksheet
Dim Data_Sh As Worksheet
Dim Copy_Range As Range
Dim lng_LastRow As Long
     
Set Input_Sh = Worksheets("データ入力シート")
Set Data_Sh = Worksheets("データ保存シート")
     
lng_LastRow = Data_Sh.Range("D65536").End(xlUp).Row
     
With Input_Sh
    Set Copy_Range = Range(.Range("A3"), .Range("D65536").End(xlUp))
    Copy_Range.Copy Destination:=Data_Sh.Cells(lng_LastRow + 1, 1)
    Copy_Range.ClearContents
    .Range("A3").Select
End With
     
Set Copy_Range = Nothing
Set Input_Sh = Nothing
Set Data_Sh = Nothing
End Sub
'////////////////////////////////ここまで

 上にある(まさ)ってのは、以前の自分だったような気がしてきた。_/ ̄|○ il||li

 (川野鮎太郎)旧HN:まさ

〉川野鮎太郎(まさ)さん、ありがとうございます。

サンプル版を作成して上手くいったので、いざ本版を作成したのですが…

Q.基本的にここでの『Selection.Copy』とは『貼り付け』になるのでしょうか?

  と言いますのも、入力シート自体がVlookupを使っての検索文字なんです…
  上記の式でやると、『♯PEF!』になってしまいます…orz

どうしたら良いのでしょうか?また教えて頂きたいですw


 基本的にのところは、セレクトした部分をコピーするものです。

 上で書いたコードの With 〜 End Withまでを以下に変えてください。
With Input_Sh
    Set Copy_Range = Range(.Range("A3"), .Range("D65536").End(xlUp))
    Copy_Range.Copy
    Data_Sh.Cells(lng_LastRow + 1, 1).PasteSpecial Paste:=xlValues
    Copy_Range.ClearContents
    .Range("A3").Select
End With

 (川野鮎太郎)  

( ̄□ ̄;)ナント!! 何となく上手くいきそうな気が…

最初の質問時のような【解説】を頂きたいのですが…
行や列の異なる表で応用したいのです…スミマセン(´・ω・`)何度も…

  
Sub Test鮎()
Dim Input_Sh As Worksheet
Dim Data_Sh As Worksheet
Dim Copy_Range As Range
Dim lng_LastRow As Long
     
Set Input_Sh = Worksheets("データ入力シート")
Set Data_Sh = Worksheets("データ保存シート")
     
lng_LastRow = Data_Sh.Range("D65536").End(xlUp).Row
     
With Input_Sh
    Set Copy_Range = Range(.Range("A3"), .Range("D65536").End(xlUp))
    Copy_Range.Copy
    Data_Sh.Cells(lng_LastRow + 1, 1).PasteSpecial Paste:=xlValues
    Copy_Range.ClearContents
    .Range("A3").Select
End With
     
Set Copy_Range = Nothing
Set Input_Sh = Nothing
Set Data_Sh = Nothing
End Sub


 簡単ですが。
Sub Test鮎()
Dim Input_Sh As Worksheet '変数宣言
Dim Data_Sh As Worksheet  '変数宣言
Dim Copy_Range As Range   '変数宣言
Dim lng_LastRow As Long   '変数宣言
     
Set Input_Sh = Worksheets("データ入力シート") '変数にシートを格納
Set Data_Sh = Worksheets("データ保存シート")  '変数にシートを格納
     
lng_LastRow = Data_Sh.Range("D65536").End(xlUp).Row
                        '変数lng_LastRowにData_ShのD列最終行を取得。
With Input_Sh            'Input_ShについてEnd Withまでの処理を行なう。
    Set Copy_Range = .Range(.Range("A3"), .Range("D65536").End(xlUp))
              '変数Copy_RangeにA3からD列最終行のセルまでを格納
    Copy_Range.Copy      '変数Copy_Rangeのセルをクリップボードにコピー
    Data_Sh.Cells(lng_LastRow + 1, 1).PasteSpecial Paste:=xlValues
                         'Data_Shの(lng_LastRow + 1)行目の1列目のセルに
             '値貼り付け
    Copy_Range.ClearContents
             '変数Copy_Rangeのセルの内容をクリア。
    .Range("A3").Select
End With
     
Set Copy_Range = Nothing '変数の内容をクリア
Set Input_Sh = Nothing   '変数の内容をクリア
Set Data_Sh = Nothing    '変数の内容をクリア
End Sub
 
(みやほりん)(-_∂)b


 見落としていました_/ ̄|○ il||li
 みやほりんさん、お手数をお掛けしましたm(_ _)m

 (川野鮎太郎)

 はじめまして。マクロ初心者の「はど」です。
 このマクロは「私の仕事にも使えそう!!」と思ってたのですが・・・

 データ保存シートには・・・

     A	    B	     C	   D
 1入力フォーム			
 2氏名コード番号
 3				 
 4  氏名  生年月日  電話番号   住所 
 5(ここに移したいデータがVLOOKUPで検索した情報とともに表示される)

 4〜5列目だけでいいのに、1〜3列目までも保存シートに移ってしまうのです・・・
 この場合どうしたらいいのでしょう?いろいろいじって試したみたのですが・・・
 初歩的なことかもしれませんがよろしくお願いしますm(_ _)m


 現在試して居られるコードを載せてみて下さい。

 また
 >4〜5列目だけでいいのに
 と言うのは
「必ずA4:D5の範囲」
 と言う事なのでしょうか?

 (HANA)

 返信ありがとうございます。
 また、返信遅くなりすみません。
 おっしゃるように「必ずA4:D5の範囲」ということです。

 Sub Test鮎()
 Dim Input_Sh As Worksheet
 Dim Data_Sh As Worksheet
 Dim Copy_Range As Range
 Dim lng_LastRow As Long
     
 Set Input_Sh = Worksheets("データ入力シート")
 Set Data_Sh = Worksheets("データ保存シート")
     
 lng_LastRow = Data_Sh.Range("D65536").End(xlUp).Row
     
 With Input_Sh
    Set Copy_Range = .Range(.Range("A4"), .Range("D65536").End(xlUp))
    Copy_Range.Copy
    Data_Sh.Cells(lng_LastRow + 1, 1).PasteSpecial Paste:=xlValues
    Copy_Range.ClearContents
    .Range("A2").Select
 End With
     
 Set Copy_Range = Nothing
 Set Input_Sh = Nothing
 Set Data_Sh = Nothing
 End Sub

 セルしかいじってません。とうかいじれず・・・

 ただ試行錯誤の結果、結局以下のコードで対処しました。
 ちらつきがきになりますが・・・

 Sub a()
 Worksheets("データ保存シート").Select

 g = Worksheets("データ保存シート").Range("A65536").End(xlUp).Row + 1

 With Worksheets("データ入力シート")
 Worksheets("データ保存シート").Range("A" & g) = .Range("a5")
 Worksheets("データ保存シート").Range("b" & g) = .Range("b5")
 Worksheets("データ保存シート").Range("c" & g) = .Range("c5")
 Worksheets("データ保存シート").Range("d" & g) = .Range("d5")

 .Range("a2") = ClearContents

 End With

 Worksheets("データ入力シート").Select
 Range("a2").Select

 End 

 よろしければ、今後のため最初のコードをどのように修正すればよいか
 教えていただけないでしょうか?

(ぱど)


 というか、
>ここに移したいデータがVLOOKUPで検索した情報とともに表示される
だったら、Test鮎は向いていないでしょうね。
コピーペーストなので、関数ごと貼り付きますし、
コピーした範囲をクリアしてますから、関数が消えてしまうし。
手直しではなくて、作り変えになりそう。
5行目の転記限定なら、次のようにしてみては。
 
 Sub a()
     Dim g As Long
     g = Worksheets("データ保存シート").Range("A65536").End(xlUp).Row + 1
     With Worksheets("データ入力シート")
         Worksheets("データ保存シート").Range("A" & g & ":d" & g).Value = .Range("a5:d5").Value
         .Range("a2").ClearContents
     End With
     Worksheets("データ入力シート").Select
     Range("a2").Select
 End Sub
 
ちなみに、
.Range("a2") = ClearContents
これは構文ミスですね。
ClearContentsがメソッドではなくて変数になってしまいます。
VBEのオプションで変数宣言を強制するようにして置いてください。
 
最初の論点、
> 4〜5列目だけでいいのに、1〜3列目までも保存シートに移ってしまうのです・・・
これは、D列の1行目から65536行目まで、間断なく、入力が在ると、
そのような現象が起きるかもしれません。
(みやほりん)(-_∂)b

コメント返信:

[ 一覧(最新更新順) ]


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