Excel VBA質問箱 IV

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

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


5142 / 13644 ツリー ←次へ | 前へ→

【52339】ファイルの生成 kim 07/11/9(金) 11:23 質問[未読]
【52345】Re:ファイルの生成 neptune 07/11/9(金) 18:45 回答[未読]
【52364】Re:ファイルの生成 kim 07/11/10(土) 23:37 質問[未読]
【52371】Re:ファイルの生成 neptune 07/11/11(日) 12:49 発言[未読]
【52366】Re:ファイルの生成 かみちゃん 07/11/10(土) 23:59 発言[未読]
【52377】Re:ファイルの生成 kim 07/11/11(日) 14:44 質問[未読]
【52378】Re:ファイルの生成 とおりすがり 07/11/11(日) 15:33 発言[未読]
【52379】Re:ファイルの生成 neptune 07/11/11(日) 18:46 回答[未読]
【52382】Re:ファイルの生成 kim 07/11/11(日) 22:08 質問[未読]
【52389】Re:ファイルの生成 neptune 07/11/12(月) 14:17 発言[未読]
【52390】Re:ファイルの生成 ichinose 07/11/12(月) 17:46 発言[未読]
【52395】Re:ファイルの生成 kim 07/11/12(月) 19:04 お礼[未読]
【52393】Re:ファイルの生成 kim 07/11/12(月) 18:43 お礼[未読]
【52403】Re:ファイルの生成 neptune 07/11/13(火) 10:45 発言[未読]
【52404】Re:ファイルの生成 kim 07/11/13(火) 12:27 お礼[未読]

【52339】ファイルの生成
質問  kim  - 07/11/9(金) 11:23 -

引用なし
パスワード
   Excel VBA からテキストファイルを生成しようとしています。
生成元のファイルは、Excelファイル内にオブジェクト等の形
で持つようにしたいと考えています。

何らかのイベント発生後、Excelファイル内で持っている
テキストファイル情報を新規にテキストファイルとして出力
させたいのですが、方法が分かりません。

このような方法をご存知の方がいましたら教えてください。
よろしくお願いいたします。

【52345】Re:ファイルの生成
回答  neptune  - 07/11/9(金) 18:45 -

引用なし
パスワード
   ▼kim さん:
>Excel VBA からテキストファイルを生成しようとしています。
>生成元のファイルは、Excelファイル内にオブジェクト等の形
>で持つようにしたいと考えています。
すみません。私には意味が解りません。

>何らかのイベント発生後、Excelファイル内で持っている
>テキストファイル情報を新規にテキストファイルとして出力
>させたいのですが、方法が分かりません。
テキストファイル情報とは何か私にはわかりませんが、
最近のLogでは以下で文字列をテキストファイルとして出力しています。
h t tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=52163;id=excel

又は、
OpenステートメントのHelpを見て下さい。使用例があります。
その上で解らなければ何が解らないかを質問してください。

【52364】Re:ファイルの生成
質問  kim  - 07/11/10(土) 23:37 -

引用なし
パスワード
   すみません。説明不足でした。

・[挿入]→[オブジェクト]→[ファイルから]→ テキストファイルを挿入
・Excel VBA にて、Excelファイルに挿入してあるテキストファイルをオープン
 してファイルの内容を読み込んで、新たなファイル名で出力する。

本Excel VBA は複数ユーザに配布しようと考えており、外部のファイルをオー
プンする方法ではなく、ファイルをExcelファイルに組み込んだ形にしたいと
思っています。

(紹介いただいたLogは所望の処理とは少々異なる?ようでした。)

以上、よろしくお願いいたします。

【52366】Re:ファイルの生成
発言  かみちゃん  - 07/11/10(土) 23:59 -

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

>Excel VBA からテキストファイルを生成しようとしています。

この部分はできます。

>生成元のファイルは、Excelファイル内にオブジェクト等の形
>で持つようにしたいと考えています。
>
>何らかのイベント発生後、Excelファイル内で持っている
>テキストファイル情報を新規にテキストファイルとして出力
>させたい

私もこの部分が何のためにそのようなことをしたいのかが理解できません。
もう少し具体的に何がしたいのか説明していただけませんか?
「テキストファイル情報」という意味も何を指しているのか、わかりづらいです。

【52371】Re:ファイルの生成
発言  neptune  - 07/11/11(日) 12:49 -

引用なし
パスワード
   ▼kim さん:
こんにちは

>・[挿入]→[オブジェクト]→[ファイルから]→ テキストファイルを挿入
>・Excel VBA にて、Excelファイルに挿入してあるテキストファイルをオープン
> してファイルの内容を読み込んで、新たなファイル名で出力する。
どの道一度は何らかの形で開かなければなりません。
マクロの記録はとってみましたか?
(・・・・出来るかどうかは未確認ですが)

>本Excel VBA は複数ユーザに配布しようと考えており、外部のファイルをオー
>プンする方法ではなく、ファイルをExcelファイルに組み込んだ形にしたいと
>思っています。
embedしていると言うことですね。

>(紹介いただいたLogは所望の処理とは少々異なる?ようでした。)
全く同じものは無いですよ。あなたの為に作ったものではないのですから。
参考にして改造したらどうですかと言うことです。

>以上、よろしくお願いいたします。
だから、何が解って何が解らないのでしょうか?
私は丸投げには応じませんので悪しからず。

【52377】Re:ファイルの生成
質問  kim  - 07/11/11(日) 14:44 -

引用なし
パスワード
   知りたいことは、オブジェクトとして挿入したテキストファイルを
オープンする方法です。

【52378】Re:ファイルの生成
発言  とおりすがり  - 07/11/11(日) 15:33 -

引用なし
パスワード
   VBA質問箱基本ポリシー
http://www.vbalab.net/bbspolicy.html

>何をやったか書いてください
>おそらくあなたは、色々なことを試してできなかった末にここに質問を書くのでしょう。
>しかし回答者は、あなたが今まで何をやってきたか、何を知っていて何を知らないかわかりません。
>今まで試したこと、やろうと思ったけどやり方がわからなかったことなどをできるだけ詳しく書いてください。

【52379】Re:ファイルの生成
回答  neptune  - 07/11/11(日) 18:46 -

引用なし
パスワード
   ▼kim さん:
>知りたいことは、オブジェクトとして挿入したテキストファイルを
>オープンする方法です。
  Dim obj As OLEObject
  
  Set obj = 好きなoleobjectを代入    
  obj.Verb   '開く

【52382】Re:ファイルの生成
質問  kim  - 07/11/11(日) 22:08 -

引用なし
パスワード
   ▼とおりすがり さん:
すみません。基本方針をよく読んでいませんでした。
こちらで試したことを書きます。

▼neptune さん:
ご回答ありがとうございます。
ですが、私の説明が言葉足らずであった為、今一度
試したこととやりたいことを整理して書きます。
(お手数おかけしてすみませんでした。)


■試したこと
1.[挿入]→[オブジェクト]→[ファイルから]→ テキストファイルを挿入
2.マクロの記録開始
3.挿入したオブジェクトをダブルクリック
 (→メモ帳でファイルがオープンされた)
4.メモ帳にてファイルの1行目をコピー
5.マクロの記録終了

マクロの記録には下記のコードしかありませんでした。

  ActiveSheet.Shapes("Object 1").Select
  Selection.Verb Verb:=xlPrimary

■やりたいこと
上記の4.でファイルの1行目を文字列(String型)のデータ
として取得したいのです。
Excelに挿入したオブジェクトに対して、TextStream型の
ReadLineようなイメージでファイルの内容を取得したい
のですが、いい方法はないでしょうか?

 ↓

(イメージ)
  Dim fso As New FileSystemObject
  Dim f As File
  Dim st As TextStream
  Dim buf As String

  Set f = fso.GetFile("新規ファイル.txt")
  Set st = f.OpenAsTextStream(ForReading)

  buf = st.ReadLine()

【52389】Re:ファイルの生成
発言  neptune  - 07/11/12(月) 14:17 -

引用なし
パスワード
   ▼kim さん:
こんにちは

>▼neptune さん:
>ご回答ありがとうございます。
>ですが、私の説明が言葉足らずであった為、今一度
>試したこととやりたいことを整理して書きます。
>(お手数おかけしてすみませんでした。)
今度は誰が読んでもよく解ると思います。

>
>■試したこと
>1.[挿入]→[オブジェクト]→[ファイルから]→ テキストファイルを挿入
>2.マクロの記録開始
>3.挿入したオブジェクトをダブルクリック
> (→メモ帳でファイルがオープンされた)
>4.メモ帳にてファイルの1行目をコピー
>5.マクロの記録終了
>
>マクロの記録には下記のコードしかありませんでした。
>
>  ActiveSheet.Shapes("Object 1").Select
>  Selection.Verb Verb:=xlPrimary
>
>■やりたいこと
>上記の4.でファイルの1行目を文字列(String型)のデータ
>として取得したいのです。
>Excelに挿入したオブジェクトに対して、TextStream型の
>ReadLineようなイメージでファイルの内容を取得したい
>のですが、・・・
少し検証してみました。

可不可は別として、思いつく方法としては
・上記の手操作をVBAで作る。これはAPIゴリゴリになります。
 (ちょっと試したけど、メモ帳の文字列データ取得で躓いてます。)
・ExcelBookをバイナリで読んで、そのファイルの文字列データを抜き取る
という方法が思いつきます。
 これはまだ試していません。・・多分試さないでしょう。

どちらにしても結構難易度高い(自分なりに自由にVBAを操れるスキルが必要と思う)です。

>いい方法はないでしょうか?
私の知識不足かもしれませんが、普通にFSOや、Openステートメントを
使うような簡単な方法は無いと思います。

もし、私が興味で作っても恐らくご自分でメンテナンスが出来ずに
困ると思いますので、別途ファイルを分けるか、Textをセルに入力して
配布する方法も検討する事をお勧めします。

【52390】Re:ファイルの生成
発言  ichinose  - 07/11/12(月) 17:46 -

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

私も

>>いい方法はないでしょうか?
>別途ファイルを分けるか、Textをセルに入力して
>配布する方法も検討する事をお勧めします。

に賛成です。何故、テキストをわざわざOLEにしなければならないのかも
知りたいところです。

操作が簡単だからですか?
でも、シートに取り込むのだって「外部データの取り込み」で簡単に出来ますよね?

疑問です・・・・。
が、以下のサンプルコードで簡単なテキストファイルではうまく作動しています。


あくまでも新規ブックの標準モジュールに

'===================================================
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function SetActiveWindow Lib "user32" (ByVal hWnd As Long) As Long
'===================================================
Sub test()
  Dim olenm As String
  Dim ole As OLEObject
  Dim hWnd1 As Long
  Dim hWnd2 As Long
  Dim shll As Object
  olenm = mk_sample_ole
  MsgBox "サンプルOLEを作成しました" & vbCrLf & _
      "これから、OLEの中のテキストをセルに表示します"
  Set shll = CreateObject("Wscript.Shell")
  shll.AppActivate Application.Caption
  Set ole = ActiveSheet.OLEObjects(olenm)
  hWnd1 = GetActiveWindow
  Application.DisplayAlerts = False
  ole.Verb xlVerbPrimary
  hWnd2 = hWnd1
  Do Until hWnd1 <> hWnd2
   Sleep 1000
   hWnd2 = GetActiveWindow
   Loop
  Call SetActiveWindow(hWnd2)
  shll.SendKeys "^A"
  shll.SendKeys "^C"
  DoEvents
  shll.AppActivate Application.Caption
  Range("a1").Select
  ActiveSheet.Paste
  SetActiveWindow hWnd2
  shll.SendKeys "%FX"
  Set shll = Nothing
End Sub
'===================================================
Function mk_sample_ole()
'サンプルとして、テキストファイルを作成し、
'アクティブシートにoleオブジェクトを作成する
  Dim g0 As Long
  Dim fno As Long
  fno = FreeFile
  Open ThisWorkbook.Path & "\olesamp.txt" For Output As #fno
  For g0 = 1 To 26
    Print #fno, String(30, Chr(g0 + 64))
    Next
  Close #fno
  DoEvents
  ActiveSheet.Range("F10").Select
  With ActiveSheet.OLEObjects.Add(Filename:= _
    ThisWorkbook.Path & "\olesamp.txt", Link:=False, _
    DisplayAsIcon:=False)
    mk_sample_ole = .Name
    End With
End Function


上記のコードを含むブックを必ず保存した後にプロシジャーtestを実行してみてください。

サンプルテキストファイル(olesamp.txt)を当該ブックと同じフォルダに作成し、
そのテキストファイルからoleオブジェクトを作成します。

このサンプルoleObjectから、テキストをアクティブシートのセルa1にコピーします。


試してみてください。


これは、あくまでサンプルです。

冒頭で述べたとおり、仕様の変更を検討してみてください。

【52393】Re:ファイルの生成
お礼  kim  - 07/11/12(月) 18:43 -

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

ご回答ありがとうございます。

>私の知識不足かもしれませんが、普通にFSOや、Openステートメントを
>使うような簡単な方法は無いと思います。
>
>もし、私が興味で作っても恐らくご自分でメンテナンスが出来ずに
>困ると思いますので、別途ファイルを分けるか、Textをセルに入力して
>配布する方法も検討する事をお勧めします。

了解しました。
難易度的にわたしには厳しいので、ご提案いただいた
Textをセルに入力する方法で進めたいと思います。

質問の仕方やマナー等も勉強になりました。
ご対応感謝いたします。

【52395】Re:ファイルの生成
お礼  kim  - 07/11/12(月) 19:04 -

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

ご回答ありがとうございます。

>>別途ファイルを分けるか、Textをセルに入力して
>>配布する方法も検討する事をお勧めします。
>
>に賛成です。何故、テキストをわざわざOLEにしなければならないのかも
>知りたいところです。
>
>操作が簡単だからですか?

単にテキスト変更時のメンテナンスが簡単かなと思えたので。。。

>でも、シートに取り込むのだって「外部データの取り込み」で簡単に出来ますよね?

ご指摘の通りだと思います。
試したところ、簡単にできました。
(この方法は頭の中にありませんでした。。。)

>が、以下のサンプルコードで簡単なテキストファイルではうまく作動しています。
>

(略)

>上記のコードを含むブックを必ず保存した後にプロシジャーtestを実行してみてください。
>
>サンプルテキストファイル(olesamp.txt)を当該ブックと同じフォルダに作成し、
>そのテキストファイルからoleオブジェクトを作成します。
>
>このサンプルoleObjectから、テキストをアクティブシートのセルa1にコピーします。
>
>
>試してみてください。
>
>
>これは、あくまでサンプルです。
>
>冒頭で述べたとおり、仕様の変更を検討してみてください。

サンプルを試させていただきました。
ありがとうございます。

ただ、自分の実力ではこれをメンテナンスするのは厳しいので
ご提案の通り「外部データの取り込み」を行う方法に仕様を変更いたします。
ご対応ありがとうございました。

【52403】Re:ファイルの生成
発言  neptune  - 07/11/13(火) 10:45 -

引用なし
パスワード
   ▼kim さん:
解決後みたいですが失礼します。もう見ないかな?

昨日Textの読み込み部分で躓いていたところが昨日解決しました。
・・・・出来るはずなのに出来ないのは悔しいからやってしまった。
APIゴリゴリと書きましたが、そんな事は無かったですね。ゴリぐらい?

サンプル程度ですが、UPしておきます。
解るようになったらおいしい所をとって利用して下さい。
CommandButton1_Clickを改造する事で当初ご希望の事は
出来ると思います。・・・多分です。検証はしてません。

準備:
・新規UserFormを追加
・UserFormにTextBoxを1個、CommandButtonを1こ追加
・以下をUserFormにコピペ
※適当なテキストをメモ帳で開いておく。
・CommandButtonクリックでメモ帳の内容を取得する。
一応動作確認してます。

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        lParam As Any) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
        (ByVal hWnd1 As Long, _
        ByVal hWnd2 As Long, _
        ByVal lpsz1 As String, _
        ByVal lpsz2 As String) As Long

Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Const classname As String = "Notepad"
Private Const EditClassName As String = "Edit"


Private Sub CommandButton1_Click()
Dim hOwner As Long
Dim sBuf As String
  'メモ帳のHWND取得
  hOwner = FindWindow(classname, vbNullString)
  sBuf = GetEditData(hOwner)
  Me.TextBox1.Text = sBuf
End Sub

'任意のメモ帳のTextを取得する
'このFunctionを適当に改造するとExcelがお亡くなりになりますから
'理解しないうちは改造しないように。
Private Function GetEditData(phWnd As Long)
Dim hChild As Long
Dim ret As Long, lLen As Long
Dim sBuf As String
Dim bytBuf() As Byte

  'EditのHWND取得
  hChild = FindWindowEx(phWnd, 0&, EditClassName, vbNullString)
  lLen = SendMessage(hChild, WM_GETTEXTLENGTH, 0, 0)
  lLen = lLen + 1
  ReDim bytBuf(lLen)
  'byteで取得するのが味噌だった。???
  ret = SendMessage(hChild, WM_GETTEXT, lLen, bytBuf(0))
  If ret <> 0 Then
    sBuf = StrConv(bytBuf, vbUnicode)
  Else
    sBuf = ""
  End If
  GetEditData = sBuf
End Function

Private Sub UserForm_Initialize()
  Me.TextBox1.MultiLine = True
  Me.TextBox1.ScrollBars = fmScrollBarsBoth
  Me.CommandButton1.Caption = "任意のメモ帳のTextを取得する"
End Sub

【52404】Re:ファイルの生成
お礼  kim  - 07/11/13(火) 12:27 -

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

サンプルありがとうございます。
後学のために活用させていただきます。
(わたしはAPIの知識が乏しいので参考になります。)

丁寧なご対応ありがとうございました。

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