Excel VBA質問箱 IV

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

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


5881 / 13645 ツリー ←次へ | 前へ→

【48324】セル値の転記 還暦おやじ 07/4/12(木) 22:02 質問[未読]
【48325】Re:セル値の転記 Kein 07/4/12(木) 22:40 回答[未読]
【48326】Re:セル値の転記 還暦おやじ 07/4/12(木) 22:52 お礼[未読]
【48358】Re:セル値の転記 還暦おやじ 07/4/13(金) 23:13 質問[未読]
【48361】Re:セル値の転記 Kein 07/4/14(土) 1:06 発言[未読]
【48362】Re:セル値の転記 Kein 07/4/14(土) 1:12 発言[未読]
【48414】Re:セル値の転記 還暦おやじ 07/4/16(月) 22:24 お礼[未読]

【48324】セル値の転記
質問  還暦おやじ  - 07/4/12(木) 22:02 -

引用なし
パスワード
   最近VBAを勉強し始めました。
なかなかうまくいかんもんで困っております。
どうかご教授ください。

bookが20個ほどあります。


新宿店.xls

A1  B1  C1 D1  E1・・・・
1月 2月 3月 ・・・・・    12月
200 300 500 600 800・・・・ 650

八王子店.xls

A1  B1  C1 D1  E1・・・・
3月 4月 
150 120

町田店.xls

A1  B1  C1 D1  E1・・・・
2月 3月  4月 
150 130  140

A1はそれぞれ店のオープンの月になっているので違います。
八王子店はまだ2ヶ月なので後のデータがありません。
後々、5月6月・・と入力していく予定です。
町田に関しても同様です。 

それをひとつにまとめたいと思っております。

A1   B1  C1
店名  1月 2月 3月 4月  ・・・・・ 12月
新宿  200 300 500 600 800・・・・ 650
八王子      150 120
町田     150 130 140

なにかいい方法があれば
よろしくお願いいたします。

【48325】Re:セル値の転記
回答  Kein  - 07/4/12(木) 22:40 -

引用なし
パスワード
   >bookが20個ほど
これ(処理対象のブック)のみを、一つの専用フォルダーに保存して下さい。
そのフォルダーのパスを、仮に

C:\Documents and Settings\User\My Documents\ExcelFiles

とします。次に新規ブックを作成し、その先頭(左端)シートのA1:M1に
"店名","1月","2月"・・・と入力しておきます。
VBEを開いてメニューの「挿入」「標準モジュール」を選択し、挿入された
モジュールに以下のマクロを入れて下さい。

Sub MyShop_SaleData()
  Dim MyF As String
  Dim CkC As Variant
  Dim WS As Worksheet
  Dim xR As Long
  Dim C As Range
  Const Ph As String = _
  "C:\Documents and Settings\User\My Documents\ExcelFiles\"

  Application.ScreenUpdating = False
  Set WS = ThisWorkbook.Worksheets(1)
  MyF = Dir(Ph & "*.xls")
  Do Until MyF = ""
   xR = WS.Cells(65536, 1).End(xlUp).Row + 1
   WS.Cells(xR, 1).Value = Left$(MyF, Len(MyF) - 4)
   Workbooks.Open Ph & MyF
   With ActiveWorkbook
     For Each C In .Worksheets(1).Rows(1).SpecialCells(2)
      CkC = Application.Match(C.Value, WS.Range("A1:M1"), 0)
      If Not IsError(CkC) Then
        WS.Cells(xR, CkC).Value = C.Offset(1).Value
      End If
     Next
     .Close False
   End With
   MyF = Dir()
  Loop
  Application.ScreenUpdating = True: Set WS = Nothing
  MsgBox "データの転記を完了しました", 64
End Sub

定数 Ph を正確なパス(末尾は必ず"\"にする)に修正し、実行してみて下さい。
なお各店ブックのデータは、そのブックの先頭シートにあるものとしています。
もしそうなっていなければ、先頭へ移動して上書き保存しておいて下さい。

【48326】Re:セル値の転記
お礼  還暦おやじ  - 07/4/12(木) 22:52 -

引用なし
パスワード
   kein殿

早速のお返事ありがとうございました。

解読するのにすこしかかりそうです。

奮闘し、?と思ったら明日また質問させてください。

まずはお礼まで

【48358】Re:セル値の転記
質問  還暦おやじ  - 07/4/13(金) 23:13 -

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

思い通りに動き、大変感謝しております。

一行一行確認していたところ質問ができてしまいました。
よろしくお願いいたします。

1.spcialcells(2)=spcialcells(xlcelltypeconstants)という
解釈でよろしいのでしょうか?

2.最後の"データ転記終了",64の64とはどういうことなのでしょうか?

3.最初に4月5月・・と書いていました。
それを2006.4月と変更すると動いたのですが、
2006年4月と書くとデータを転記しないという
のはどういうことなのでしょうか?
完全一致を指定する0と書かれているということは
どんな文字列でもmatchしてくれるのかと思っていました。

【48361】Re:セル値の転記
発言  Kein  - 07/4/14(土) 1:06 -

引用なし
パスワード
   1 については、そのとうりです。
2 についてはMsgBox関数のヘルプを見てください。
  引数 buttons の解説で分かるはずです。
3 については良く確認してなかったのですが、日付として認識されてしまう値
  だとダメ、ということですね。"2006.4月"という値は文字列と判定されるが
  ゆえに、正しくヒットしたものと思われます。2006/4 とか 2006年4月 では
  Excelの自動認識機能によって、とうぜん日付になってしまうわけで、
  その場合は実際には、シリアル値というLong型の数値が格納されていて、
  書式によって表示される見た目が変えられているだけですから、決して
  文字列になりません。なのにMatch関数で文字列と比較させてしまったため、
  ヒットせずに返り値がエラーになったわけです。
  ちなみにMatch関数で日付同士の検索・判定をするなら、検索値をCLngで
  数値に変換して第一引数に渡せばできますが、それなら検索値も検索対象も
  「日」までを含めて記述するべきでしょう。それは少し煩わしいと思われる
  ので、やはり文字列になる値を使った方が、お手軽ではないでしょうか。

【48362】Re:セル値の転記
発言  Kein  - 07/4/14(土) 1:12 -

引用なし
パスワード
   すいませんシリアル値は実際は、時間単位までのデータを含む Double型 です。
そのうち日付のデータ範囲は整数になるので、日付同士なら Long型 に変換して
比較ができる、というわけです。

* さらにご質問がおありなら、その回答は明日の夜以降になりますのであしからず。

【48414】Re:セル値の転記
お礼  還暦おやじ  - 07/4/16(月) 22:24 -

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

ご丁寧にありがとうございました。
感謝しております。

long型などは変えずに
教えていただいたコードの一部、
CkC = Application.Match(CLng(C.Value), WS.Range("A1:M1"), 0)
でやってみるとできました。

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