[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データの入力と蓄積を別々に出来ますか??』(みず)
入力フォームを設けて、そこに入力したデータが自動的に別のシートへと
次々に蓄積されていくような方法はございますか。
下記の例ですと、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/
実際に必要となるマクロがさまざまに収録されていますので、
欲しいマクロを利用して下さい。
それでは(まこ)
以前、参考書を買っては見たもののちんぷんかんぷんだったのに、
なんとなくわかってきました!関数にばかりこだわらずに、
マクロにも踏み込むべきですね!!
ありがとうございました。勉強します。(みず)
データ保存シート(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.