Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5393 / 13644 ツリー ←次へ | 前へ→

【51044】データベースの作成 takuya 07/8/26(日) 17:34 質問[未読]
【51045】Re:データベースの作成 neptune 07/8/26(日) 19:14 発言[未読]
【51047】補足Re:データベースの作成 takuya 07/8/26(日) 21:52 発言[未読]
【51048】Re:補足Re:データベースの作成 neptune 07/8/26(日) 22:09 回答[未読]
【51064】Re:補足Re:データベースの作成 マキチャン 07/8/27(月) 11:38 回答[未読]
【51070】Re:補足Re:データベースの作成 Jaka 07/8/27(月) 14:11 発言[未読]
【51084】Re:補足Re:データベースの作成 takuya 07/8/27(月) 21:19 お礼[未読]
【51086】Re:補足Re:データベースの作成 takuya 07/8/27(月) 21:31 質問[未読]
【51089】Re:補足Re:データベースの作成 マキチャン 07/8/28(火) 8:45 回答[未読]
【51090】Re:補足Re:データベースの作成 じゅんじゅん 07/8/28(火) 10:18 発言[未読]
【51095】Re:補足Re:データベースの作成 マキチャン 07/8/28(火) 11:06 発言[未読]
【51099】Re:補足Re:データベースの作成 じゅんじゅん 07/8/28(火) 11:36 回答[未読]
【51092】Re:補足Re:データベースの作成 Jaka 07/8/28(火) 10:32 発言[未読]

【51044】データベースの作成
質問  takuya  - 07/8/26(日) 17:34 -

引用なし
パスワード
   仕事で普段エクセルでリストを作成しております。
どんなリストかといいますと

8/25のリスト  
   a    b     c

1  日付  得意先 品名Co 
2  8/25  ABC  00000
3  8/25  BCA  11111
4  8/25  CBA  22222

と例として上記のように作成しております(項目はもう少し増えますが・・・)
やはり、8月分は8月分で下記のように作成した毎回次の行に保存したいのですが。
 
例 保存先に
  a    b    c    d
  NO   日付  得意先 品名Co 
1 01   8/22  ZZZ 99999
2 02   8/23  CCC 98989
3 03   8/24  SAS 78787
4 04   8/24  MMM 66666
5 05   8/25  ABC  00000
6 06   8/25  BCA  11111
7 07   8/25  CBA  22222

コピーして貼り付けて作成するのは手間がかかるので
一発で、データの追記が行えるようなマクロは可能でしょうか?

よろしくお願いします。

【51045】Re:データベースの作成
発言  neptune  - 07/8/26(日) 19:14 -

引用なし
パスワード
   ▼takuya さん:
>コピーして貼り付けて作成するのは手間がかかるので
>一発で、データの追記が行えるようなマクロは可能でしょうか?
多分、可能ですよ。

で、何が解らないのでしょうか?

ちなみにA列にデータが入力されている場合、そのアドレスは下記で取得
できます。アドレスの例ですが、他の情報が欲しいときは
RangeオブジェクトのHelpを隅々までご覧下さい。
Sub t()
Dim ret As String
  ret = Range("A" & Rows.Count).End(xlUp).Address
  MsgBox ret
End Sub

【51047】補足Re:データベースの作成
発言  takuya  - 07/8/26(日) 21:52 -

引用なし
パスワード
   Range("A2:C5").Select
  Selection.Copy
  Sheets("2007データ").Select
  ActiveSheet.Paste
  Sheets("本日分").Select
  Range("A17").Select
  Application.CutCopyMode = False
End Sub
上記のマクロをするとデータが上書きされてデータが追記できなくなります。
2007データの中に本日分のデータを2007の前のデータに上書きせず、次の行にデータをコピーしていくという作業ができるようにしたいのです。
目的はデータだけの格納庫を作成したいのです。
これでわかりますでしょうか?

【51048】Re:補足Re:データベースの作成
回答  neptune  - 07/8/26(日) 22:09 -

引用なし
パスワード
   ▼takuya さん:

こんにちは
>2007データの中に本日分のデータを2007の前のデータに上書きせず、次の行にデータをコピーしていくという作業ができるようにしたいのです。
>目的はデータだけの格納庫を作成したいのです。
>これでわかりますでしょうか?
私が書いたサンプルが目的にぴったりと思います。
必要なのは、データが入っている最後の行ですよね。次に行はその行番号に
+1するだけです。

A列に適当にデータを入れてサンプルを実行してみて下さい。

後は、takuya が書かれているプログラムを少し改造すれば良いだけです。

【51064】Re:補足Re:データベースの作成
回答  マキチャン  - 07/8/27(月) 11:38 -

引用なし
パスワード
   takuyaさんこんにちは。私も初心者です。
takuyaさんの作られたものを最大限に生かし、
neptuneさんのアドバイスを利用すると
次のようになると思います。

Sub ああ()
Dim ret As String

Range("A2:C5").Select
  Selection.Copy
  Sheets("2007データ").Select
 
  ret = Range("A" & Rows.Count).End(xlUp).Offset(1).Address
 
  Range(ret).Select
   ActiveSheet.Paste
  Sheets("本日分").Select

  Application.CutCopyMode = False
End Sub


これで、本日分のシートから2007データのシートにデータは
累計されていきます。
しかし、いくつか使い勝手という点から問題があると思いませんか?
1.本日分のシートも"C2:A5"というように固定でなく、
  少なくても行数は可変にした方が、いちいちマクロを直さなくていいですよ   ね。これは、累計の方を可変にした要領で、考えてみてください。
2.本日分は累計したら、クリアーしておいた方が、次の日に入力するのに
  便利かもですね。もちろん累計の最後にクリアーを入れればいいと思います。
  (念のためバックアップのためにとっておきたいという考えもあるかもしれま   せんが)

また、SELECTは使用しなくてもマクロは作れるので、使用しない方が
いろいろ利点があるようです。過去ログなどで調べてもらえばいろいろ
アドバイスが出ていると思います。

【51070】Re:補足Re:データベースの作成
発言  Jaka  - 07/8/27(月) 14:11 -

引用なし
パスワード
   例1
Sheets("Sheet2").Range("A6:C13").Copy Sheets("Sheet3").Range("B25")

例2
Sheets("Sheet2").Range("A6:C13").Copy
Sheets("Sheet3").Range("F25").PasteSpecial

例3
Sheets("Sheet2").Range("A6:C13").Copy
Sheets("Sheet3").Range("J25").PasteSpecial (xlPasteValues)

【51084】Re:補足Re:データベースの作成
お礼  takuya  - 07/8/27(月) 21:19 -

引用なし
パスワード
   ホンマありがとうございます。
初心者と思えないような手さばきですね☆
なにかあればよろしくおねがいします
▼マキチャン さん:
>takuyaさんこんにちは。私も初心者です。
>takuyaさんの作られたものを最大限に生かし、
>neptuneさんのアドバイスを利用すると
>次のようになると思います。
>
>Sub ああ()
>Dim ret As String
>
>Range("A2:C5").Select
>  Selection.Copy
>  Sheets("2007データ").Select
> 
>  ret = Range("A" & Rows.Count).End(xlUp).Offset(1).Address
> 
>  Range(ret).Select
>   ActiveSheet.Paste
>  Sheets("本日分").Select
>
>  Application.CutCopyMode = False
>End Sub
>
>
>これで、本日分のシートから2007データのシートにデータは
>累計されていきます。
>しかし、いくつか使い勝手という点から問題があると思いませんか?
>1.本日分のシートも"C2:A5"というように固定でなく、
>  少なくても行数は可変にした方が、いちいちマクロを直さなくていいですよ   ね。これは、累計の方を可変にした要領で、考えてみてください。
>2.本日分は累計したら、クリアーしておいた方が、次の日に入力するのに
>  便利かもですね。もちろん累計の最後にクリアーを入れればいいと思います。
>  (念のためバックアップのためにとっておきたいという考えもあるかもしれま   せんが)
>
>また、SELECTは使用しなくてもマクロは作れるので、使用しない方が
>いろいろ利点があるようです。過去ログなどで調べてもらえばいろいろ
>アドバイスが出ていると思います。

【51086】Re:補足Re:データベースの作成
質問  takuya  - 07/8/27(月) 21:31 -

引用なし
パスワード
   もう1ついいでしょうか?
すいません、甘えてしまいますが、可変とはどうすればできるのでしょうか?

下記のとおりコピー元がバラバラにあり、2007データに横一列で追加できるようにはできますか?
Range("A2,B2,D12,F1").Select
  Selection.Copy
  Sheets("2007データ").Select
>▼マキチャン さん:
>>takuyaさんこんにちは。私も初心者です。
>>takuyaさんの作られたものを最大限に生かし、
>>neptuneさんのアドバイスを利用すると
>>次のようになると思います。
>>
>>Sub ああ()
>>Dim ret As String
>>
>>Range("A2:C5").Select
>>  Selection.Copy
>>  Sheets("2007データ").Select
>> 
>>  ret = Range("A" & Rows.Count).End(xlUp).Offset(1).Address
>> 
>>  Range(ret).Select
>>   ActiveSheet.Paste
>>  Sheets("本日分").Select
>>
>>  Application.CutCopyMode = False
>>End Sub
>>
>>
>>これで、本日分のシートから2007データのシートにデータは
>>累計されていきます。
>>しかし、いくつか使い勝手という点から問題があると思いませんか?
>>1.本日分のシートも"C2:A5"というように固定でなく、
>>  少なくても行数は可変にした方が、いちいちマクロを直さなくていいですよ   ね。これは、累計の方を可変にした要領で、考えてみてください。
>>2.本日分は累計したら、クリアーしておいた方が、次の日に入力するのに
>>  便利かもですね。もちろん累計の最後にクリアーを入れればいいと思います。
>>  (念のためバックアップのためにとっておきたいという考えもあるかもしれま   せんが)
>>
>>また、SELECTは使用しなくてもマクロは作れるので、使用しない方が
>>いろいろ利点があるようです。過去ログなどで調べてもらえばいろいろ
>>アドバイスが出ていると思います。

【51089】Re:補足Re:データベースの作成
回答  マキチャン  - 07/8/28(火) 8:45 -

引用なし
パスワード
   >>コピー元がバラバラにあり、2007データに横一列で追加できるようにはできます
>>か?
  UNIONを調べてください。バラバラのセルを横一列にできると思います。

>>可変とはどうすればできるのでしょうか?
 最初の例では、セルはバラバラでなかったので、累計先のシートの
 コピー場所を可変で探しているので、コピー元のシートも最終行を
 求めて、そこまでをコピーすればよいのですが。すでにできているものを
 応用すればできると思います。

 ただ、A2,B2,D12,F1のようにセルが縦にもバラバラだと、本日分シート
 でどのように入力したいのかわからないと、回答できないと思います。
 具体的に、本日シートの内容を記述してもらい、識者の方の回答を待ちましょ  う。私も、初心者なのでわからないと思いますので勉強させてもらいたいです。

 

【51090】Re:補足Re:データベースの作成
発言  じゅんじゅん  - 07/8/28(火) 10:18 -

引用なし
パスワード
   ▼マキチャン さん:
>>>コピー元がバラバラにあり、2007データに横一列で追加できるようにはできます
>>>か?
>  UNIONを調べてください。バラバラのセルを横一列にできると思います。

横から失礼します。
UNIONを用いても、結果は
>Range("A2,B2,D12,F1").Select
と同じではないでしょうか?
横一列になるのでしょうか?

COPYにこだわらず、Range("A2,B2,D12,F1")の値を順に転記するか、
一旦配列に入れて一気に転記するか、かなと思っているのですが。

回答でなくすいませんでした。

【51092】Re:補足Re:データベースの作成
発言  Jaka  - 07/8/28(火) 10:32 -

引用なし
パスワード
   飛び飛びの同じ行、列のセルをコピペすると、貼り付けた後は飛び飛びじゃなくなります。

sub tt1()
Range("A1").Value = "あ"
Range("C1").Value = "い"
Range("F1").Value = "う"
Range("G1").Value = "え"
Range("J1").Value = "お"
Range("A1,C1,F1:G1,J1").Copy
Range("A15").PasteSpecial
end sub

そうでない場合、エリアごとにループさせる。
取りあえず。
(結合セルについては考えてなかったと思う。)
htt p://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=142;id=FAQ

【51095】Re:補足Re:データベースの作成
発言  マキチャン  - 07/8/28(火) 11:06 -

引用なし
パスワード
   UNIONそうでしたね。うろ覚えで書き込み
大変ご迷惑をおかけしました。
やはり、識者さんの回答を待ちましょう。
失礼しました。

【51099】Re:補足Re:データベースの作成
回答  じゅんじゅん  - 07/8/28(火) 11:36 -

引用なし
パスワード
   >一旦配列に入れて一気に転記するか
であれば、例えば一例。

Sub try()

'----------------準備-------------------------
Dim i As Long
With Range("A1")
   .Value = 1
   For i = 1 To 3
     .Offset(i, i).Value = i + 1
   Next
End With
'---------------------------------------------

Dim v, vv
Dim rr As Range

For Each rr In Range("A1,B2,C3,D4")
v = v & rr.Value & ","
Next

vv = Split(v, ",")
Range("F1").Resize(, UBound(vv)).Value = vv
End Sub
私が取る方法としては、こんな感じです。
個々のセルの値を一旦連結して、配列にしてます。

5393 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free