• ベストアンサー

VBA でテキストファイルに読み書き

OtenkiAmeの回答

  • ベストアンサー
  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.3

こんにちは。 補足の内容を拝見いたしました。 > そこでインデックスファイルを作成して、 > そこに受注番号、機種名、数量 等を自動入力させて > 目次の様なファイルを作りたいと言う事です。 > 更に、ハイパーリンクを組み込み、クリック一発で > 過去の受注ファイルを開く事が出来る様にしたいのです。 下記のコードは、関係企業から 「部品ごとに分けられたファイルのリストを作りたい」 との相談を受けて電話でのやりとりで作成したコードです。 質問者さんが意図した内容の処理に似てると思いましたので コメントを読みながら処理の参考にしてみてください。 なお、私は現物のファイルも見ていませんし、現場にも出ていませんが、 ちゃんと目的の処理が実行されていると報告を受けています。 頭の中では、処理の内容が整理されていると思いましたので、 処理の手順を書き出して、その手順に従ってコードを組めば 意図した内容の処理ができると思います。 頑張ってください。 Sub Sample() Dim OldSheetsCount As Long Dim OpenFile As Variant, myBookName As String, _   myPath As String, myFile As String, myFileName As String, _   NewBook As Workbook, ListSht As Worksheet, _   OpenBook As Workbook, OpenSht As Worksheet, _   Target As Range, i As Long '読み込むフォルダを指定する OpenFile = Application.GetOpenFilename( _   FileFilter:="エクセル ファイル (*.xls), *.xls", _   Title:="部品コードのブックを一つ選択して[開く]をクリックしてください。", _   MultiSelect:=False) 'キャンセルされたら終了 If OpenFile = False Then MsgBox "処理を中止します。": Exit Sub '画面更新を止める Application.ScreenUpdating = False 'キャンセルされなかったら処理を継続 '新規シートを一枚にセットして新規ブックを作る With Application   OldSheetsCount = .SheetsInNewWorkbook   .SheetsInNewWorkbook = 1   Set NewBook = .Workbooks.Add   .SheetsInNewWorkbook = OldSheetsCount End With '記録用ワークシート Set ListSht = NewBook.Worksheets(1) '項目名の記入 With ListSht.Range("A1:C1")   .Value = Array("部品コード", "型式名", "登録ブック名")   .Interior.ColorIndex = 6   .HorizontalAlignment = xlCenter End With 'ウィンドウ枠の固定 Application.GoTo Reference:=ListSht.Range("A2") ActiveWindow.FreezePanes = True 'このブック名 myBookName = ThisWorkbook.Name 'ドライブとパスの変更 myPath = Left(OpenFile, Len(OpenFile) - InStr(1, StrReverse(OpenFile), "\")) ChDrive myPath ChDir myPath 'Dir関数によりフォルダ内のすべてのブックに対して繰り返し myFile = Dir("*.xls") Do While myFile <> ""   '自ブックでない時   If myFile <> myBookName Then     '読み取り専用で開く     Set OpenBook = Workbooks.Open(Filename:=myFile, ReadOnly:=True)     '開いたブックの最初のシート     Set OpenSht = OpenBook.Worksheets(1)     With ListSht       'シートから"型式名"を探す       On Error Resume Next       Set Target = OpenSht.Cells.Find(What:="型式名", _         After:=OpenSht.Range("A1"), LookIn:=xlFormulas, _         LookAt:=xlPart, SearchOrder:=xlByRows)       On Error GoTo 0       '"型式名"があったら       If Not Target Is Nothing Then         'カウンタリセット         i = 1         Do           'すべての型式名を取得してシートに書き込む           With .Range("B" & .Rows.Count).End(xlUp).Offset(1)             .NumberFormat = "@"             .Value = Target.Offset(i).Value           End With           'ハイパーリンクを設定する           .Hyperlinks.Add _             Anchor:=.Range("C" & .Rows.Count).End(xlUp).Offset(1), _             Address:=OpenBook.FullName, TextToDisplay:=OpenBook.Name           'カウンタ加算           i = i + 1         Loop Until Target.Offset(i).Value = ""         'ブック名を部品コードとしてシートに書き込む         With .Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(i - 1)           .NumberFormat = "@"           .Value = Replace(myFile, ".xls", "")         End With       End If     End With     '開いたブックを閉じる     OpenBook.Close Savechanges:=False     Set OpenSht = Nothing     Set OpenBook = Nothing   End If   '次のブック   myFile = Dir() Loop '↑ここまで繰り返し 'アクティブセル領域に対し、列幅自動調整、部品コード順に並べ替え With ListSht.Range("A1").CurrentRegion   .EntireColumn.AutoFit   .Sort Key1:=.Parent.Parent.Parent.Range("A2"), Order1:=xlAscending, _     Header:=xlYes, OrderCustom:=1, MatchCase:=False, _     Orientation:=xlTopToBottom, SortMethod:=xlPinYin   'もし書き込みデータがなかったらブックを閉じる   If .Cells.Count = 3 Then     Application.DisplayAlerts = False     NewBook.Close Savechanges:=False     Application.DisplayAlerts = True   End If End With 'シート名を現在の日付& 時刻にする ListSht.Name = Format(Now, "yyyy年mm月dd日hh時mm分ss秒") '画面更新を有効 Application.ScreenUpdating = True Set ListSht = Nothing Set NewBook = Nothing End Sub

B_BOSS
質問者

お礼

有り難うございました。 非常に参考になり、思った事が 実現しました。 本当に有り難うございました。

関連するQ&A

  • VBAで

    VBAで モジュールAで定義された変数を、モジュールBに引継ぐ事はできますか? モジュールAである値の入っているセルを検索し、その行番号を変数 HitRowNo に入れます。 この変数 HitRowNo をモジュールBでも使いたいんですが、変数(の値?)を引継ぐことは可能ですか? 質問の意味がわかりずらいかもしれませんが、よろしくお願いします。

  • VBAを使用して、ブックからブックを開く

    Excel2000を使用しております。 VBAを使用してA、B、Cの三つのBookを作成しました。 上記3ッのファイルとは別にINDEX用のBookを作成し、 INDEXから、A、B、C、のファイル名を指定し、ファイルを 開ける様にしました。    A、B、Cのいずれかのファイルを開いた後、INDEX用の BOOKを自動で閉じたいのですがうまく行きません。  どなたかご教授願います。 A、B、CにOpenEventを設定し、インデックス用BOOKを閉じようと すると、閉じる事は可能なのですが、それ以降のOpenEventのマクロが 進みません。 逆にINDEX用のBOOKにCloseを入れても閉じてくれません。 INDEXのCloseはA、B、CのファイルをOpenの後にCloseを 入れてます。  どなたかご教授願います。

  • VBAで、アクティブなBOOKのファイル名を取得し

    エクセルのVBAを使用して、選択されている、BOOKのファイル名を取得し、下記のように編集してA1セルに入れたいのですが、可能でしょうか? BOOKのファイル名が「大阪_たこ焼き_1234.xls」の場合 大阪_と.xlsをは省いて、「たこ焼き_1234」がA1セルに入るようにしたい。

  • Excel VBA 初心者です。 作成中のマクロわからないところ

    VBA初心者です。もしセルA1の値がAでセルB1の値がGでセルC1の値にJを含むなら、 セルD1の値を変数i に入れる。 上記を10行目まで繰り返す。 というマクロを作りたいのですが、行き詰ってます。 よろしくお願いします。

  • EXCEL VBAについて

    VBAでCSVファイルをテンプレートのBBOKに読込むコードを 作り、CSVファイルから読込んだBOOK1データを集計する BOOK2を作成しています。 BOOK1・11/21・・・11/21・・・11/22・・・11/23と続きます      A     B     C      D 1  ID     店名   売上    日付 2 1104567   渋谷店  190,809   11/21 3 1102031   新宿店  209,808   11/21 4 1103450   横浜店  108,765   11/21 BOOK2・集計      A    B    C       D       E 1  ID   店名   11/21    11/22     11/23 2 1104567  渋谷店  190,809   203,487 3 1102031  新宿店  209,808   340,876 4 1103450  横浜店  108,765   547,627 ※BOOK1とBOOK2のIDの並び順は一致していません。 上記のBOOK1のデータをBOOK2に読込ませたいと考えています。 VLOOKUPやINDEX関数を使用しようかと考えたのですが、日付毎に ファイル名が違うのと、集計のファイルには外部参照をさせたくないと 考えています。 VBAで作成したいコードはBOOK1からBOOK2の日付のセルにIDを検索条件として日付毎のファイルを読込ませたいです。 フォームで日付を入力し、コピーするBOOK2のセルを指定後、BOOK1を選択するためにダイアログボックスを出したいです。 BOOK2のIDを検索条件としてBOOK1から一致する売上セルを抽出するコードだけでもわかれば何とか作成できそうなのですが、 ご教授いただけませんでしょうか?

  • VBA コピー&ペースト

    次の作業をVBAでマクロを組みたいのですが、どのような構文にすればよいでしょうか。VBA初心者のため、お知恵を拝借させてください。 [目的] 1.ブックA(コピー先)に設定したハイパーリンク先のブックB(コピー元)へジャンプ 2.ブックBへジャンプ後、特定のセルの値をコピー 3.コピーした値をブックAの特定セルへペースト 4. 1.~3.の作業をリピート 対象は、上の作業が未完(ブックAのペースト先のセルがブランク)のもの [詳細] ・ブックB(リンク先)の保存先はサーバー ・リンク先はブックBの特定のシート ・ブックAで設定したハイパーリンクのセルの値がリンク先のシート名 ・ブックBは複数、リンク先のシートも複数(ハイパーリンクごとにリンク先が異なる) ・ブックBにはマクロが設定、開くたびにマクロ有効無効のメッセージ(Excel2003のため) ・コピペする項目は3つ ・ブックA,Bともに開いた状態で、2.~4.のリピートというマクロでも構いません。 以上ですが、他に情報が必要でしたらお申しつけください。 よろしくお願いいたします。

  • エクセルVBAで、PDFファイルを開きたい

    セルに入力した値のブック(xls)を開く場合、 以下となりますが、↓ Sub セルに入力したブック名のブックを開く() ブック名 = Cells(1, 2) 'B1セルの値を取り出す Workbooks.Open Filename:=ブック名 & ".xls" '指定されたブックを開く End Sub これでPDFファイルを開きたいです。 記述をどうしたらよいでしょうか。 目的はPDFファイルの検索/照会をxlsにてしたいのです。 お手数ですがお願いいたします。

  • Excel-VBA rangeプロパティの使い方について

    Excel-VBA rangeプロパティの使い方について VBA初心者です。いろいろ調べたのですが、分からないので教えてください。 ThisWorkbookのSheet1のA1セルに、aというファイルのaというシートの特定のセルの値をコピーしたいです。 コピーする値のセルは、ThisWorkbookで入力した値を基に変数で記述したいです。 例えば、ThisWorkbookのSheet1のC2セルに「D1」と記載していたとして、その値を変数として設定して、最終的にaというファイルのaというシートの「D1」セルをThisWorkbookのA1セルに貼り付けるのが目的です。 この場合の、下記のhensuu = の設定方法について、ご教授願います。 hensuu = ThisWorkbook.Sheets("Sheet1").Range(“A1”)= Workbooks(a).Sheets(a).Range(hensuu)

  • EXCEL2010 VBA 変数への代入

    EXCEL2010のVBAを使用しています。 処理で繰り返しの処理があります。 繰り返しのたびに変数Aに変数A+セルの番地(A1等)を代入していきたいのですがうまくいきませんどうすればよいでしょうか? 説明が下手ですみません。 ようするに変数の中の値を上書きせずに、現在の値を後ろに追加したいということです。 (例) 変数Bは最初は「1」 繰り返し1回目  変数A =変数A&Cells(1,変数B)   ’変数Bは繰り返しのたびに1ずつ増えます 繰り返し2回目  変数A =変数A&Cells(1,変数B) 一回目は変数AにはA1が入る 2回目の処理時にはA1B1というふうになり、上書きされず追加で代入される。 というようなイメージです。

  • Excel VBA 値取得について

    お世話になります。 どなたかお力をお貸しください。 Excel2003 VBAでプログラムを組んでおり、エクセルのシートをデータベース代わりに利用しています。 複数のブック散乱している10万個近くのテキストボックスの値を、 「A」というブックの「シート1」のセルに格納して行きたいと思っております。 値の格納方法としては、「A」ブックの「シート1」の セルA1からA2、A3…A列最終行(6万強)まで縦の並びにデータを格納していきます。 ただし、「シート1」に格納したい値は10万個近くあるので、 A列だけでは足りなくなります。 A列の最終行まで値を格納し終えたら、自動的にB列に移動して、 セルB1からB2、B3…B列最終行(6万強)という遷移させていきたいのです。 A列のみに格納していくのであれば、理解できるのですが、 自動遷移がわかりません。 For i = 0 To 最終行(6万強) シート1.Range("A" & i) = 参照元 Next i よろしくお願いします。