• ベストアンサー

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

 エクセル2000のVBAを使用しています。 ブックAファイル名をブックBのセルに入力して、ブックAをインデックスの様な扱いのファイルを作成使用としたのですが、ブック間で変数のやり取りは出来ないと思います。できるんですか??  その為、txtファイルを変数代わりに使おうと思っているのですが、 入出力の方法が良くわかりません。  簡単にブックBのセルの値をtxtファイルに書き込んでブックAで、 そのtxtファイルを読み込む様なVBAのコード教えて下さい。 初心者ですけど・・。

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

  • ベストアンサー
  • 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
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

であればこんな感じ? INDEXファイルを Index.xls と仮定し、記入するのはIndex.xlsのSheet(1)のA列に順に記載してゆくものと決め打ちにしています。 また、Index.xlsとデータファイルは同じフォルダ内にあるものと仮定しています。 フォルダが違う場合には、ThisWorkbook.Path を利用している部分を修正する必要があります。 Function Registは、bName(=登録しようとするファイル名)が既にあるかをチェックし、新規登録を行った場合はTrue、既に登録済で何もしなかった場合はFalseを返します。 (常に新規登録しか起こり得ないのであれば、登録済みかをチェックする必要もありませんので、かなり処理をはぶくことが可能です。) Function Regist(bName As String) As Boolean Dim wb As Workbook, c As Range Dim rw As Long, bPath As String Const index = "Index.xls" '// INDEXファイルのファイル名 Application.ScreenUpdating = False '// 必要に応じて表示をOFF bPath = ThisWorkbook.Path & "\" Set wb = Workbooks.Open(bPath & index) wb.Worksheets(1).Activate rw = Cells(Rows.Count, 1).End(xlUp).Row Set c = Nothing If (rw = 1) And (Cells(1, 1) = "") Then  '//1行目も未記入(新規シート) rw = 0 Else '// 同じブック名が既にあるかをチェック Set c = Range("A1:A" & rw).Find(bName, LookIn:=xlValues, LookAt:=xlWhole) End If If c Is Nothing Then '// リンクを登録 ActiveSheet.Hyperlinks.Add Anchor:=Cells(rw + 1, 1), _ Address:=bPath & bName, TextToDisplay:=bName Regist = True Else Regist = False End If Application.DisplayAlerts = False '// 保存時の確認メッセージを回避 wb.Close (Regist) Application.DisplayAlerts = True Application.ScreenUpdating = True End Function

B_BOSS
質問者

お礼

有り難うございました。 非常に参考になり、 予定していた事が実現しました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

>ブック間で変数のやり取りは出来ないと思います。できるんですか?? 変数のやり取りというより、データの記入でよいのですよね?できますよ。 具体的に何をやりたいのか、いまひとつよくわかりませんので、以下、簡単なサンプル。 新しいブックを作成して、そのブックのシート1のA1に、自分のブック名を書き込むというものです。 セルやレンジを指定するときには、きちんと識別できるように  Workbook.WorkSheet.Range の形で指定してあげる必要があります。 Sub test() Dim filename As String Dim wb As Workbook filename = ThisWorkbook.Name Set wb = Workbooks.Add wb.Sheets(1).Cells(1, 1).Value = filename End Sub テキストファイルの読み書きも当然できますが、↑でもお望みのことができるのではないでしょうか?

B_BOSS
質問者

補足

> ありがとうございました。  でも、私の説明の仕方が少し、良くなかった様なので再度説明します。  私は製造業の課長ですが、我々の生産は受注生産で 多くの機種が受注番号を付けられ、我々のところに来て 生産が行われます。 製造課に於いては、1つの受注オーダーに於いて、1つのエクセルファイルを作ります。 その中に生産時の情報が記録として、入力されます。(1オーダー、1ファイル)) そのファイルのセルA1には、受注番号を入力しますので A1の受注番号を利用して、そのファイル自身に名前を付けて保存します。 ここまでは自分でマクロ組みました。 この様にしていくと、1ヶ月にかなりの数のファイルが出来ます。 (受注の数だけ出来る事になる。) そこでインデックスファイルを作成して、 そこに受注番号、機種名、数量 等を自動入力させて 目次の様なファイルを作りたいと言う事です。 更に、ハイパーリンクを組み込み、クリック一発で 過去の受注ファイルを開く事が出来る様にしたいのです。 (ちなみに過去の受注ファイルは、生産終了後、たびたび使用する為) 製品によっては、日をまたいで生産する製品もあるし、 又、半分だけ生産して、一週間後に再開する製品もあります。 その為、受注ファイルが名前を付けて保存する時に 同時にINDEXファイルにも登録したいのです。  そうすれば、翌日、または一週間後にも、INDEXファイルから 簡単に開く事が可能になるからです。  新規に作成した受注ファイルは、その度に名前が変わる事になる為 名前を付けて保存する際にファイル名を変数に代入しました。  その後、自動でINDEXファイルを開き、OPENイベントで 変数を指定のセルに入力しようとしたんですが、だめでした。  ちなみ、上記のコード、今からチャレンジしてみます。

全文を見る
すると、全ての回答が全文表示されます。

関連する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 よろしくお願いします。