Excel VBA質問箱 IV

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

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


9653 / 13646 ツリー ←次へ | 前へ→

【26174】入力用のブックのシートから「累積用のブック」のシートにデータを転送する... skuroyan 05/6/25(土) 19:11 質問[未読]
【26176】Re:入力用のブックのシートから「累積用の... かみちゃん 05/6/25(土) 20:14 発言[未読]
【26187】Re:入力用のブックのシートから「累積用の... skuroyan 05/6/26(日) 5:24 回答[未読]
【26177】Re:入力用のブックのシートから「累積用の... ponpon 05/6/25(土) 20:24 発言[未読]
【26188】Re:入力用のブックのシートから「累積用の... skuroyan 05/6/26(日) 5:29 回答[未読]
【26194】Re:入力用のブックのシートから「累積用... ponpon 05/6/26(日) 17:17 発言[未読]
【26179】Re:入力用のブックのシートから「累積用... kobasan 05/6/25(土) 20:48 回答[未読]
【26181】Re:入力用のブックのシートから「累積用... kobasan 05/6/25(土) 21:28 発言[未読]
【26189】Re:入力用のブックのシートから「累積用... skuroyan 05/6/26(日) 11:57 お礼[未読]
【26218】開いた Book を見えないようにして kobasan 05/6/27(月) 20:49 発言[未読]

【26174】入力用のブックのシートから「累積用のブ...
質問  skuroyan  - 05/6/25(土) 19:11 -

引用なし
パスワード
   次のことをやりたいと思っていますが、VBAでの効率的なやりかたがわかりませんので、どなたか教えてください。よろしくお願いいたします。

やりたいこと:「入力用のブック」のシートに入力されたデータ(500件/日)を「累積用のブック」のシートに転送したい。
詳細:「入力用のブック」にはユーザーフォームから1件入力されるたびに、上書き保存しているため、データ件数が増えてくると入力用のユーザーフォームの表示スピードが遅くなってきます。
これを回避するために、コマンドボタン(=入力用ブックから処理したい)を押したときに、「入力用のブック」の入力されたデータを「累積用のブック」のシートに移したい。
「入力用のブック」のシートからは、データを「累積用ブック」に移し保存した後に、クリアする。
「累積用のブック」のシートにはすでに保存されているデータの最終行の次の行から書き込み保存したい。
「累積用のブック」は出来れば開かずに処理して保存したい。
現在:やり方がわからないため、コピーペーストの操作で行っています。

【26176】Re:入力用のブックのシートから「累積用...
発言  かみちゃん  - 05/6/25(土) 20:14 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>詳細:「入力用のブック」にはユーザーフォームから1件入力されるたびに、上
>書き保存しているため、データ件数が増えてくると入力用のユーザーフォームの
>表示スピードが遅くなってきます。

「データ件数が増えてくると入力用のユーザーフォームの表示スピードが遅くな
る」とはどういうことなのでしょうか?
あまり関係ないように思うのですが、どういう処理をしているのでしょうか?

>これを回避するために、コマンドボタン(=入力用ブックから処理したい)を押
>したときに、「入力用のブック」の入力されたデータを「累積用のブック」のシ
>ートに移したい。
>「入力用のブック」のシートからは、データを「累積用ブック」に移し保存した
>後に、クリアする。

この部分は、マクロの記録で記録できるような気がします。

>「累積用のブック」のシートにはすでに保存されているデータの最終行の次の行
>から書き込み保存したい。

データの最終行を取得できれば、いいですよね?
過去ログなどで「最終行」を検索してみるといいと思います。

>「累積用のブック」は出来れば開かずに処理して保存したい。

「開かずに」の理由は何ですか?
開いたほうが楽だと思いますが・・・
理由によっては、違う方法で実現することもできるかもしれません。

【26177】Re:入力用のブックのシートから「累積用...
発言  ponpon  - 05/6/25(土) 20:24 -

引用なし
パスワード
   こんばんは。
入力用ブックのシートの
項目やレイアウト
累積用のブックのレイアウト(入力用ブックと同じなのかどうか)
などを詳しく説明するとレスがつきやすいと思います。

 500件/日となると、月ごとや1/4期ぐらいで、累積用のブックの
シートを変えるなどの工夫が必要ですね。

>「累積用のブック」は出来れば開かずに処理して保存したい。
DAOやADOを使えば、ふつうに開いて処理するより速くなると思います。
 ↑上級者からのレスをお待ちください。

【26179】Re:入力用のブックのシートから「累積用...
回答  kobasan  - 05/6/25(土) 20:48 -

引用なし
パスワード
   こんばんは

ここに書いてあることは、マクロ記録でだいたいの骨格は作れます。
マクロ記録をどんどんやってみて、VBAをマスターしてください。
完成はさせていませんが、参考にして、みて自分でやりたいものに作り上げください。
親切でなくてごめんなさい。

>やりたいこと:「入力用のブック」のシートに入力されたデータ(500件/日)を「累積用のブック」のシートに転送したい。


>1.コマンドボタン(=入力用ブックから処理したい)を押したときに、「入力用のブック」の入力されたデータを2.「累積用のブック」のシートに移したい。

>3.「入力用のブック」のシートからは、データを「累積用ブック」に移し保存した後に、クリアする。


>「累積用のブック」のシートにはすでに保存されているデータの最終行の次の行から書き込み保存したい。
>「累積用のブック」は出来れば開かずに処理して保存したい。

1.2.3.をマクロ記録で骨格を作ったものです。
Sheet1は元データ
Sheet2は累積用

Macro1
Macro2はマクロ記録少し変化させたもの
Macro3が最終的に使えるようにしたものです。
データはA〜F列まであるとします。


Sub Macro1()
' マクロ記録日
  'コピー
  Range("A1:A9").Select
  Selection.Copy
  '貼り付け
  Sheets("Sheet2").Select
  Range("A1").Select
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
  '---------------------------------------
  '元データを消去
  Sheets("Sheet1").Select
  Range("A1:A9").Select
  Selection.ClearContents
  '---------------------------------------
  'escでコピーモード終了
  Application.CutCopyMode = False
End Sub

Sub Macro2()
' マクロ記録Macro1を変更したもの
  'コピー
  Sheets("Sheet1").Range("A1:A9").Copy
  '貼り付け
  Sheets("Sheet2").Range("A1").PasteSpecial Paste:=xlValues
  '---------------------------------------
  '元データを消去
  Sheets("Sheet1").Range("A1:A9").ClearContents
  '
  'escでコピーモード終了
  Application.CutCopyMode = False
End Sub

Sub Macro3()
' マクロ記録Macro2を変更したもの
  '1.コピー
  Sheets("Sheet1").Range("A1:A9").Copy
  '2.貼り付け
  Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1).PasteSpecial Paste:=xlValues
  '---------------------------------------
  '3.元データを消去
  Range("A1", "F" & Range("A65536").End(xlUp).Row).ClearContents
  '
  'escでコピーモード終了
  Application.CutCopyMode = False
End Sub

以上です。がんばってください。

【26181】Re:入力用のブックのシートから「累積用...
発言  kobasan  - 05/6/25(土) 21:28 -

引用なし
パスワード
   「Book間のコピー貼り付け」を追加しておきます。
ただしBookは開いて使用します。
まずはここらからやってみてください。

Sub Macro4()
' マクロ記録日
'
  Range("A1:A17").Select
  Selection.Copy
  Windows("Book1").Activate
  Range("B2").Select
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
End Sub

Sub Macro5()
' Macro4を変化させたもの
'
  Range("A1:A17").Copy
  Windows("Book1").Activate
  Range("B2").PasteSpecial Paste:=xlValues
End Sub

Sub Macro6()
' Macro5を変化させたもの
'
  Range("A1:A17").Copy
  Workbook("Book1").Range("B2").PasteSpecial Paste:=xlValues
End Sub

【26187】Re:入力用のブックのシートから「累積用...
回答  skuroyan  - 05/6/26(日) 5:24 -

引用なし
パスワード
   ▼かみちゃん さん:
>「データ件数が増えてくると入力用のユーザーフォームの表示スピードが遅くな
>る」とはどういうことなのでしょうか?
>あまり関係ないように思うのですが、どういう処理をしているのでしょうか?

回答:「入力用のブック」にはユーザーフォームから1件入力されるたびに、上書き保存しているため(このためデータ件数が増えてくると、保存する行数が増えsaveに時間を要する、すなわち1件入力し登録ボタンを押してから、次の入力画面に変わるまでの時間がかかり、作業者が待たされる)と、5年ほど前に購入したパソコンで処理(Win98で処理スピードが遅い)しているためと思われます。


>>「累積用のブック」は出来れば開かずに処理して保存したい。
>
>「開かずに」の理由は何ですか?
>開いたほうが楽だと思いますが・・・
>理由によっては、違う方法で実現することもできるかもしれません。

回答:これも処理スピードを早くしたい(作業者を待たせないため)ために出来ないかと思いました。

【26188】Re:入力用のブックのシートから「累積用...
回答  skuroyan  - 05/6/26(日) 5:29 -

引用なし
パスワード
   ▼ponpon さん:
>入力用ブックのシートの
>項目やレイアウト
>累積用のブックのレイアウト(入力用ブックと同じなのかどうか)
>などを詳しく説明するとレスがつきやすいと思います。

回答:累積用のブックのレイアウトは、そのまま保管するだけなのでまったく同じです。

> 500件/日となると、月ごとや1/4期ぐらいで、累積用のブックの
>シートを変えるなどの工夫が必要ですね。

回答:ご指摘の通り確かにEXCELの行数制限を越えるため、シートを替える工夫も必要になってくると思います。

【26189】Re:入力用のブックのシートから「累積用...
お礼  skuroyan  - 05/6/26(日) 11:57 -

引用なし
パスワード
   ▼kobasan さん:
ありがとうございました、ファイルを開かない方法は出来ませんでしたが、何とか下記マクロでやりたいことが出来ました。

Sub Macro1()
'=====コピー================================
  Sheets("入力結果").Range("A2:F1000").Copy
'=====入力結果保存==========================
  Workbooks.Open "C:\累積.xls"
  Windows("累積.xls").Activate
  Sheets("累積結果").Range("A65536").End(xlUp).Offset(1).PasteSpecial Paste:=xlValues
  ActiveWorkbook.Save
  ActiveWorkbook.Close
'=====入力結果クリヤ========================
  Windows("入力.xls").Activate
  Sheets("入力結果").Range("A2", "F" & Range("A65536").End(xlUp).Row).ClearContents
  Application.CutCopyMode = False
  ActiveWorkbook.Save
End Sub

【26194】Re:入力用のブックのシートから「累積用...
発言  ponpon  - 05/6/26(日) 17:17 -

引用なし
パスワード
   こんにちは。

>回答:ご指摘の通り確かにEXCELの行数制限を越えるため、シートを替える工夫も必要になってくると思います。
ならば、月ごとにシートを加える一つの方法ですが、試してみてください。

累積結果のシート名を累積結果4月、累積結果5月のように月名を加えて、

 Dim A As String
 Dim B As String
と宣言して、

'=====入力結果保存==========================

  Workbooks.Open "C:\累積.xls"
    ’最後のシートから月名を格納
  A = Right(Worksheets(Worksheets.Count).Name, 2)
    ’本日の月名を格納  
  B = Month(Now) & "月"

    ’シートの月名と本日の月名が違っていたら、
  If A <> B Then
    ’シートを追加して、シート名を"累積結果+本日の月名"とする 
   Worksheets.Add after:=Worksheets(Worksheets.Count)
   ActiveSheet.Name = "累積結果" & B

    ’項目名を1列目に記入
   Range("A1").Resize(1, 6).Value = Workbooks("入力.xls") _
         .Sheets("入力結果").Range("A1").Resize(1, 6).Value
    ’データの書き込み
   Worksheets(Worksheets.Count).Range("A65536").End(xlUp) _
        .Offset(1).PasteSpecial Paste:=xlValues

    ’月名が同じなら
  Else
    ’最後のシートにデータを追加 
   Worksheets(Worksheets.Count).Range("A65536").End(xlUp) _
        .Offset(1).PasteSpecial Paste:=xlValues
   
  End If
    ’累積.xlsを上書き保存
  Workbooks("累積.xls").Close True

【26218】開いた Book を見えないようにして
発言  kobasan  - 05/6/27(月) 20:49 -

引用なし
パスワード
   ▼skuroyan さん 今晩は。

コードを作り上げて、"やればできる"と思われたのでは?

さて、折角コードを掲載れたので、

>「累積用のブック」は出来れば開かずに処理して保存したい。

ということでしたので、

開いた Book を見えないようにして、
見かけ上、Book を開いていないようにしてみました。


(ブックを開かないということは、VBAにたけた人はあまり考えないで、
見えないようにするという方法をとるみたいです??たぶん)

それから、activateはなるべく使わない方がよいということ
と Range の使い方で何カ所か気になる点がありましたので
参考にしてください。


Sub Macro1()
'================================追加
Dim MyBook As String
  Application.ScreenUpdating = False
  MyBook = ThisWorkbook.Name
  Workbooks.Open "C:\累積.xls"
  Workbooks(MyBook).Activate
'
'=====コピー================================
  With Sheets("入力結果")
    .Range("A2", "F" & .Range("A65536").End(xlUp).Row).Copy
  End With
'=====入力結果保存==========================
  Workbooks("累積").Sheets("累積結果") _
    .Range("A65536").End(xlUp).Offset(1).PasteSpecial Paste:=xlValues
  Workbooks("累積").Save
  Workbooks("累積").Close
'=====入力結果クリヤ========================
  With Sheets("入力結果")
    .Range("A2", "F" & .Range("A65536").End(xlUp).Row).ClearContents
  End With
  '
  Application.CutCopyMode = False
  Workbooks(MyBook).Save
End Sub

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