みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイル名のわからない複数のファイルをひとつにまとめる

エクセル2000で以下のマクロを作成したいです。

1.フォルダ内のCSVファイルを開き、中のデータをひとつにまとめる。
(フォルダ名とファイル名、ファイル数はその時によって変わってきます。ファイル数はだいたい10個くらいです。ひとつのデータは20列50行くらいで列の項目を基準にまとめたいです。)

2.列を1列目に挿入し、2列目と3列目のデータを1列目に統合する。

3.1列目のデータを使用し、重複を調べる。重複がある場合はどちらかひとつを削除する。(できれば4列目のデータを比較し数値が少ないほうを削除したいです。)


まだ途中までですが、マクロ作成してみました。
わたしとしては、フォルダ内のCSVファイルを開いてセルA1からデータの入った範囲をコピーし、testエクセルファイルのアクティブセルに貼り付け
↓↓↓
次のファイルのデータをその下に貼り付けたいのでtestファイルのデータが入ったセルの下を選択し、ファイルを開くへ繰り返し。

のつもりなのですが…、うまく作動しません。
マクロのテキストを片手にネットでも検索しながら作ったのですが、まだ記述の仕方などがわかってなくどこがおかしいのかもわかりません。

わかる方がいたらよろしくお願いします!
-----------------------------------
Sub ファイルのデータを統合()

Dim filename As String
Dim openedbook As Workbook
Dim isbookopen As Boolean
Dim myworksheet As Worksheets
Dim myrange As Range

filename = Dir(ThisWorkbook.Path & "\*.csv")

Do While filename <> ""
isbookopen = False
For Each openedbook In Workbooks
If openedbook.Name = filename Then
isbookopen = True

Exit For
End If
Next

Range("A1").CurrentRegion.Copy Destination:=Workbooks("test.xls").Worksheets("sheet1").ActiveCell
Workbooks("test.xls").Worksheets("sheet1").Range("A1").End(xlDown).Offset(1).Select

If isbookopen = False Then
Workbooks.Open (ThisWorkbook.Path & "\" & filename)
End If
filename = Dir()
Loop
End Sub

投稿日時 - 2007-03-30 21:06:12

QNo.2880339

すぐに回答ほしいです

質問者が選んだベストアンサー

1.フォルダを取得し、どのCSVファイルをまとめるのか選択
  できるようにする。
2.CSVの操作
(1)CSVをひとつにまとめたい
(2)ある項目の列をKEY列としてKEY列を基準に重複しないように
 したい。
という要件でよろしいでしょうか?

まず、1.については次のようにしてはいかがでしょうか?
メインメニューというシートをEXCELに一つ作成します。
次に「メインメニュー」のシートにボタン「CSV一括まとめ処理」
という名前で作成します。
VBAの画面に移り。
「メインメニュー」Object を選択します。

SUB CSV一括まとめ処理ボタン_click()
end sub

と表示していると思います。
そこに コードを記入します。
CSV一括まとめ処理ボタン_click() 処理には
画面(フォーム)呼び出すコードだけを記入します。

CSV一括まとめ処理フォーム.Show

でフォームですが プロジェクトツリーにてユーザーフォームを挿入します。

画面には テキストボックス(dirText)
とフォルダ選択ダイアログ起動ボタン
と リストボックス(dirlistBox)
ボタン(処理実行ボタン)
の4個のオブジェクトを配置します。

でプログラムですが文字数(800文字)以内には入りきりませんので
簡単に申し上げます。
まず。フォルダの取得は左記のDirtextbox に入力するか
フォルダ選択ダイアログ起動ボタンによるものとします。
フォルダ選択ダイアログは 以下のコードで簡単に取得できます。

Dim Fs as Object
DIm Fd as Object
SET FS = CreateObject("Shell.Application")
SET FD=fs.BrowsForFolder(0,"フォルダを選択してください。",&h1,&h0)

Csvのファイル名については
 FSOを用います。 下記
Dim Fs as Object
DIm Corfiles as Object
Dim ObjFolder
Dim StrFile as string
Dim Cnm as string
SET FS = CreateObject("scripting.FilesystemobJect")
SET ObjFolder = FS.Getfolder(~指定されたパス)
SET ObjFolder = ObjFolder.files
StrFile =EMPTY
Cnm=Empty
For each ObjFiles In Corfiles
  StrFile = strFile & Cnm & Objfile.Name
  Cnm=","
Next

あとは取得したファイル名を split関数で 配列変数に変換し、
その値を リストボックス Dirlist の選択値としてデータ
を追加します。
で1、の要件はこれで終わりです。
続きがあります。

投稿日時 - 2007-03-30 23:03:32

お礼

回答ありがとうございます!
NOBNNNさんの回答を参考にテキストなどを見ながら作成してみたのですが…、
すみません、VBA超初心者で基本的な知識が足りないため詰まってしまいました。。。
フォームを作成までは出来たのですが、フォルダ選択がわかりません。
Dim Fs as Object
DIm Fd as Object
SET FS = CreateObject("Shell.Application")
SET FD=fs.BrowsForFolder(0,"フォルダを選択してください。",&h1,&h0)
↑コードをフォルダ選択ボタン(CommandButton1,Click)にコピペしたのですが、実行してみると
「実行時エラー'438'オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
と出てきてしまいます。
明日1日使って勉強しようと思いますが、よろしければ詳しくおしえていただけないでしょうか?

投稿日時 - 2007-03-31 23:53:12

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>>SET FD=fs.BrowsForFolder(0,"フォルダを選択してください。",&h1,&h0)
>>↑コードをフォルダ選択ボタン(CommandButton1,Click)にコピペしたのですが、実行してみると
>>「実行時エラー'438'オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
>>と出てきてしまいます。
_______________________________________________________________
についてお答えします。
SET FD=fs.BrowsForFolder の パンチミスです。
正しくは
SET FD=fs.BrowseForFolder
でした。
ちなみに 
SET FD=fs.BrowseForFolder(0,"フォルダを選択してください。",&h1,"C:\")
とすると最初に表示されるディレクトリは C:\ になります。

詳細はマイクロソフトの
http://www.microsoft.com/japan/technet/scriptcenter/scripts/storage/folders/stfovb01.mspx
を参照してください。
Windows スクリプトについては
スクリプト センター
http://www.microsoft.com/japan/technet/scriptcenter/default.mspx
を見るとより理解できると思います。

以上です。

参考URL:http://www.microsoft.com/japan/technet/scriptcenter/scripts/storage/folders/stfovb01.mspx

投稿日時 - 2007-04-01 02:30:37

お礼

ありがとうございます!!
ゴールが見えてきたような気がします。がんばります。

投稿日時 - 2007-04-01 12:07:56

ANo.2

NO1の続き
フォーム上で、リストボックスが選択され。処理実行ボタンが押されたなら。
リストボックスの選択されているアイテムがなくなるまでループします。
ここで 本来の処理の2のCSVの処理について説明します。
まず、CSV ファイルやExcel シートは ADOを用いることにより
テキスト形式のファイルにも同じようにSQLのクエリが使えます。
Google などで キーワード「ADO テキストデータ アクセス方法」
で検索してください。
なお、UDL を用いることによりディレクトリをMDBとみなし、
CSVファイルをテーブルとみなすようにできるようです。
またExcel シートも MDBとみなし SQLのクエリが使えます。
Google などで キーワード「ADO を使用して Excel ワークシートにクエリを実行する」 マイクロソフトの技術情報に掲載されています。
で検索してください。

テキスト形式についいてはまだ私も実験段階ですので詳細はお答えできませんが。Excel についてはある程度実験してみました。

今回は CSV ファイルを SQL で抽出するようにするにあたって
まず csvファイルを一適当なワークディレクトリを作成し、そちらに
このプログラムでXLSシートに変換します。ただしexelのBOOKは
一個にしてシートを追加する方法です。
それらを ADO接続で開き、
SQL で 次のようにすれば重複しないようにできます。
SELECT キー項目1 FROM [CSVファァイル名のシート名1$]
    [CSVファァイル名のシート名2$]
     Group By キー項目1

過去レスにもあります。
このサイトのQNo.2858699 高速で重複データを削除するには?
に書かれています。

投稿日時 - 2007-03-30 23:50:08

あなたにオススメの質問