お知恵を御貸し下さい
お知恵を御貸し下さい
過去LOG等を見ても良く理解出来なかったのでこちらへ投稿させて頂きました。
説明下手なので例を出して説明させて頂きます。
箇条書きになりますが申し訳御座いません。
①WORDを起動
②マイドキュメント内の特定の拡張子(例えばテスト.ABC)の物だけを表示させてファイルを開く
③開いたファイルから文字列をクリップボードにコピー
④WORD内で使ったクリップボードの内容(中身はテキスト)をマイドキュメントにテスト.CBA(開いたファイル名と同じ名前で拡張子だけ違う物にしたいのです)と言ったファイル名で自動的に保存
上記の様な動作を行わせたい場合はどの様にしたら良いのでしょうか?
説明下手なので例を出して説明させて頂きます。
箇条書きになりますが申し訳御座いません。
①WORDを起動
②マイドキュメント内の特定の拡張子(例えばテスト.ABC)の物だけを表示させてファイルを開く
③開いたファイルから文字列をクリップボードにコピー
④WORD内で使ったクリップボードの内容(中身はテキスト)をマイドキュメントにテスト.CBA(開いたファイル名と同じ名前で拡張子だけ違う物にしたいのです)と言ったファイル名で自動的に保存
上記の様な動作を行わせたい場合はどの様にしたら良いのでしょうか?
ようするに(マイドキュメントにある)特定の拡張子を持つファイルだけを(別の拡張子にして)コピーしたいということですよね。
Wordが関係する必要はないですよね?単にファイルコピーさえすれば済む話と理解しました。
まずマイ ドキュメントへのパスはSHGetSpecialFolderPath関数で取得できます。
特定のファイルだけを選び出すにはにはFindFirstFile関数~FindNextFile関数を用います。
(使い方は過去ログを探せばあると思います)
Targetにマイ ドキュメントへのパスがありますのでlstrcpy(Target, "\*.abc")のようにすると,
TargetはFindFirstFileの最初の引数に適合します。
FindFirstFile/FindNextFileからは個々のファイルの情報がWIN32_FIND_DATA構造体で渡されます。
その中のメンバcFileNameにファイルへのパスが含まれていますから,
これをいったん別の変数へコピーしてしまいます。そしてそれをいじって目的のファイル名にします。
PathRenameExtension関数がそのとおりのことをしてくれます。
こうすればあとはCopyFile関数でコピーできます。
あとはDestinationPath周りとCopyFileをFindFirstFile~FindNextFileのループ内に書けば良いです。
ところでSHGetSpecialFolderPathとPathRenameExtensionはABで宣言がなされていないので自分でソースに以下の宣言をコピーしてください。
Wordが関係する必要はないですよね?単にファイルコピーさえすれば済む話と理解しました。
まずマイ ドキュメントへのパスはSHGetSpecialFolderPath関数で取得できます。
コード: 全て選択
Dim Target[MAX_PATH] As Char
SHGetSpecialFolderPath(0, Target, CSIDL_PERSONAL, FALSE)
(使い方は過去ログを探せばあると思います)
Targetにマイ ドキュメントへのパスがありますのでlstrcpy(Target, "\*.abc")のようにすると,
TargetはFindFirstFileの最初の引数に適合します。
FindFirstFile/FindNextFileからは個々のファイルの情報がWIN32_FIND_DATA構造体で渡されます。
その中のメンバcFileNameにファイルへのパスが含まれていますから,
これをいったん別の変数へコピーしてしまいます。そしてそれをいじって目的のファイル名にします。
PathRenameExtension関数がそのとおりのことをしてくれます。
コード: 全て選択
Dim DestinationPath[ELM(MAX_PATH)] As Char
lstrcpy(DestinationPath, fd.cFileName) ' fdはWIN32_FIND_DATA型の変数とします
PathRenameExtension(Path, ".CBA")
あとはDestinationPath周りとCopyFileをFindFirstFile~FindNextFileのループ内に書けば良いです。
ところでSHGetSpecialFolderPathとPathRenameExtensionはABで宣言がなされていないので自分でソースに以下の宣言をコピーしてください。
[ここをクリックすると内容が表示されます]
コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "Shell32" Alias "SHGetSpecialFolderPathA" (
hwndOwner As HWND,
pszPath As *Char,
nFolder As Long,
fCreate As Long
) As Long
Const CSIDL_PERSONAL = 5
Declare Function PathRenameExtension Lib "shlwapi.dll" Alias "PathRenameExtensionA" (
pszPath As *Char,
pszExt As *Char
) As Long
少しは自分で手を加えてやる方が勉強になると思い、
違う例を挙げたのが逆に不味かったみたいですみません。
やりたいと思ってる事をそのまま記述すれば電子CADで使用する
『ネットリスト』と呼ばれる物があるのですが、
拡張子がWINDOWSでは使用しない"*.mm2"と言ったファイルなのです。
中身はごく普通のテキストファイルです。
何時もはメモ帳でファイルを開いて必要な部分だけコピーして新規作成で貼り付けを行い保存してたのですが単純作業なので、何とかこれを簡単に出来ないものかと思いプログラムに挑戦してみた次第です。
イグトランスさんの仰る様にマクロでやる方が確かに楽なのかもしれませんが、これを元にその他の物も作れる様になれたらと考えてるので出来ましたらABでお願いいたします。
違う例を挙げたのが逆に不味かったみたいですみません。
やりたいと思ってる事をそのまま記述すれば電子CADで使用する
『ネットリスト』と呼ばれる物があるのですが、
拡張子がWINDOWSでは使用しない"*.mm2"と言ったファイルなのです。
中身はごく普通のテキストファイルです。
何時もはメモ帳でファイルを開いて必要な部分だけコピーして新規作成で貼り付けを行い保存してたのですが単純作業なので、何とかこれを簡単に出来ないものかと思いプログラムに挑戦してみた次第です。
イグトランスさんの仰る様にマクロでやる方が確かに楽なのかもしれませんが、これを元にその他の物も作れる様になれたらと考えてるので出来ましたらABでお願いいたします。
.notepadでもファイル選択ダイアログのファイル名の所に
"*.mm2"を記述すればフィルタリングされます。
(本当はnotepadで開く時不便なだけなのかもしれないと思いつつ)
.ActiveBasic等の開発言語やHSP等のツールである程度処理を自動化するなら。
1.FindFirstFile/dirlist等から目的のファイルリストを作成。
2.選択されたファイル名をnotepad "*.mm2"などと実行し手動で必要な部分を
別ファイルに保存する。
又は
2.選択されたファイルを順次開きキーワードにより必要な部分を抽出して
別ファイルに保存する。
(この時抽出条件や抽出結果を確認する機能が必要になるかも知れない。)
(便利さを追求しだすと異常に機能が増える...)
.この目的ならHSP/VBS等のツールの方が簡単に目的を達成出きると思いますが
ツールに出来る事は当然開発言語でも十分に実現できます。
"*.mm2"を記述すればフィルタリングされます。
(本当はnotepadで開く時不便なだけなのかもしれないと思いつつ)
.ActiveBasic等の開発言語やHSP等のツールである程度処理を自動化するなら。
1.FindFirstFile/dirlist等から目的のファイルリストを作成。
2.選択されたファイル名をnotepad "*.mm2"などと実行し手動で必要な部分を
別ファイルに保存する。
コード: 全て選択
/*HSP3*/
notesel Bu
dirlist Bu,"*.mm2"
noteget ss,0
ss = "notepad "+ss
exec ss
2.選択されたファイルを順次開きキーワードにより必要な部分を抽出して
別ファイルに保存する。
(この時抽出条件や抽出結果を確認する機能が必要になるかも知れない。)
(便利さを追求しだすと異常に機能が増える...)
.この目的ならHSP/VBS等のツールの方が簡単に目的を達成出きると思いますが
ツールに出来る事は当然開発言語でも十分に実現できます。
Uhspさん、有難うございます。
> .notepadでもファイル選択ダイアログのファイル名の所に
> "*.mm2"を記述すればフィルタリングされます。
> (本当はnotepadで開く時不便なだけなのかもしれないと思いつつ)
これは開く際に*.mm2を入力すると言う解釈で良いのでしょうか?
だとすると普段やってるのと全く同じなので・・・
間違った解釈をしてるでしょうか?!
> .ActiveBasic等の開発言語やHSP等のツールである程度処理を自動化するなら。
> 1.FindFirstFile/dirlist等から目的のファイルリストを作成。
> 2.選択されたファイル名をnotepad "*.mm2"などと実行し手動で必要な部分を
> 別ファイルに保存する。
>
載せて頂いたコードはHSP用でしょうか?
AB用であれば実行可能なコードを出来ればお願いしたいのですが。
> .この目的ならHSP/VBS等のツールの方が簡単に目的を達成出きると思いますが
> ツールに出来る事は当然開発言語でも十分に実現できます。
すいません、HSP/VBSについては全く知らないのでABでの実現方法を出来たらお願いしたいのですが・・・
> .notepadでもファイル選択ダイアログのファイル名の所に
> "*.mm2"を記述すればフィルタリングされます。
> (本当はnotepadで開く時不便なだけなのかもしれないと思いつつ)
これは開く際に*.mm2を入力すると言う解釈で良いのでしょうか?
だとすると普段やってるのと全く同じなので・・・
間違った解釈をしてるでしょうか?!
> .ActiveBasic等の開発言語やHSP等のツールである程度処理を自動化するなら。
> 1.FindFirstFile/dirlist等から目的のファイルリストを作成。
> 2.選択されたファイル名をnotepad "*.mm2"などと実行し手動で必要な部分を
> 別ファイルに保存する。
>
コード: 全て選択
> /*HSP3*/
> notesel Bu
> dirlist Bu,"*.mm2"
> noteget ss,0
> ss = "notepad "+ss
> exec ss
>
AB用であれば実行可能なコードを出来ればお願いしたいのですが。
> .この目的ならHSP/VBS等のツールの方が簡単に目的を達成出きると思いますが
> ツールに出来る事は当然開発言語でも十分に実現できます。
すいません、HSP/VBSについては全く知らないのでABでの実現方法を出来たらお願いしたいのですが・・・
どんなプログラミング言語を使っても同じことをやろうとすると似たようなコードになります。
HSPはやったことがないので山勘ですがABでは次のようなコードになると思います。
あいにく私のマイドキュメントには拡張子mm2なるファイルはないので,
代わりにtxtファイルをメモ帳で起動するように変更してあります。
HSPはやったことがないので山勘ですがABでは次のようなコードになると思います。
コード: 全て選択
#strict
Dim Target[MAX_PATH] As Char
SHGetSpecialFolderPath(0, Target, CSIDL_PERSONAL, FALSE)
SetCurrentDirectory(Target)
lstrcat(Target, "\*.txt")
Dim fd As WIN32_FIND_DATA
Dim hFind As HANDLE
hFind = FindFirstFile(Target, fd)
Do
Exec "notepad", fd.cFileName
Loop While FindNextFile(hFind, fd)
FindClose(hFind)
代わりにtxtファイルをメモ帳で起動するように変更してあります。
ActiveBasicで似せるとこんな感じでしょうか?。
RADでリストボックスとボタンコントロールを貼り付け
ボタンコントロールに下記のコードとグローバル領域にDeclear・Constを
貼り付けてください。
RADでリストボックスとボタンコントロールを貼り付け
ボタンコントロールに下記のコードとグローバル領域にDeclear・Constを
貼り付けてください。
コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32.dll" _
Alias "SHGetSpecialFolderPathA" ( _
hwndOwner as Long,lpszPath as String,nFolder as Long,
fCreate as Long) as Long
Const CSIDL_PERSONAL = &H5
Sub MainWnd_CommandButton1_Click()
Dim Dn as String
Dim Nn as Long
Dim Fn as String
Dn = ZeroString(MAX_PATH)
SHGetSpecialFolderPath(0,Dn,CSIDL_PERSONAL, FALSE)
SetCurrentDirectory(Dn)
SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_DIR,&H0,"*.*")
Nn = SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETCOUNT,0,0)
Fn = ZeroString(MAX_PATH)
If (Nn) Then
SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETTEXT,0,StrPtr(Fn)) '0-Nn=FileName
Exec "notepad",Fn
End If
End Sub
イグトランスさん、コードを有難う御座います。
早速試してみたのですが”SHGetSpecialFolderPath”でエラーになってしまったので、
SetCurrentDirectoryでその他のフォルダを指定後
"\*.txt"→"*.txt"に変更し動かしてみました。
その結果指定したフォルダにある全てのtxtファイルが開かれてしまったのですが・・・
>
早速試してみたのですが”SHGetSpecialFolderPath”でエラーになってしまったので、
SetCurrentDirectoryでその他のフォルダを指定後
"\*.txt"→"*.txt"に変更し動かしてみました。
その結果指定したフォルダにある全てのtxtファイルが開かれてしまったのですが・・・
>
コード: 全て選択
#strict
>
> Dim Target[MAX_PATH] As Char
> SHGetSpecialFolderPath(0, Target, CSIDL_PERSONAL, FALSE)
> SetCurrentDirectory(Target)
> lstrcat(Target, "\*.txt")
>
> Dim fd As WIN32_FIND_DATA
> Dim hFind As HANDLE
> hFind = FindFirstFile(Target, fd)
> Do
> Exec "notepad", fd.cFileName
> Loop While FindNextFile(hFind, fd)
> FindClose(hFind)
イグトランスさんのコードを実行した結果が期待するもので無い場合
私は解釈をあやまっています。
趣旨は"*mm2"のファイルをnotepadで開いて手動で必要部分を別ファイル
に保存するのに"*.mm2"を簡単に選別・取得したいでしょうか?。
一応ActiveBasicの操作方法。
1.projecteditor.exe を起動する。
2.「ファイル」「新規作成」「プロジェクト」を選択。
3.「プロジェクト名」「ディレクトリ」を入力「次へ」。
4.「次へ」「完了」。
5.初期画面の「コントロール」5っ目の「リストボックス」をクリック。
6.ウインドウ画面の適当な位置でクリック&ドラッグ(サイズ調整)。
7.「コントロール」2段1っ目の「ボタン」をクリック。
8.ウインドウ画面の適当な位置でクリック&ドラッグ(サイズ調整)。
9.ウインドウ画面に配置した「ボタン」をダブルクリック。
10.切り替わったコード編集画面のSub MainWnd_CommandButton1_Click()の
コードを入れ替える。
11.Declare Function SHGetSpecialFolderPath...とConst CSIDL_PERSONALを
最下行の余白に貼り付ける。
12.メニューバー「!」で実行しボタンをクリック。
なおイグトランスさんのコードも11.を行えば動作すると思います。
(マイドキュメントの位置を補間しているだけなので既知のディレクトリなら不要)
さらにマスクが"*.*"なのでディレクトリにファイルがあれば何でも
先頭のファイルをnotepadで開いてしまいます、必要なら"*.mm2"に変更して
下さい。
私は解釈をあやまっています。
趣旨は"*mm2"のファイルをnotepadで開いて手動で必要部分を別ファイル
に保存するのに"*.mm2"を簡単に選別・取得したいでしょうか?。
一応ActiveBasicの操作方法。
1.projecteditor.exe を起動する。
2.「ファイル」「新規作成」「プロジェクト」を選択。
3.「プロジェクト名」「ディレクトリ」を入力「次へ」。
4.「次へ」「完了」。
5.初期画面の「コントロール」5っ目の「リストボックス」をクリック。
6.ウインドウ画面の適当な位置でクリック&ドラッグ(サイズ調整)。
7.「コントロール」2段1っ目の「ボタン」をクリック。
8.ウインドウ画面の適当な位置でクリック&ドラッグ(サイズ調整)。
9.ウインドウ画面に配置した「ボタン」をダブルクリック。
10.切り替わったコード編集画面のSub MainWnd_CommandButton1_Click()の
コードを入れ替える。
11.Declare Function SHGetSpecialFolderPath...とConst CSIDL_PERSONALを
最下行の余白に貼り付ける。
12.メニューバー「!」で実行しボタンをクリック。
なおイグトランスさんのコードも11.を行えば動作すると思います。
(マイドキュメントの位置を補間しているだけなので既知のディレクトリなら不要)
さらにマスクが"*.*"なのでディレクトリにファイルがあれば何でも
先頭のファイルをnotepadで開いてしまいます、必要なら"*.mm2"に変更して
下さい。
> その結果指定したフォルダにある全てのtxtファイルが開かれてしまったのですが・・・
はい,そのように作ってあります。
あれはその直前のUhspさんのHSPのコードを(前に書いたとおり山勘ですが)ABに移してみただけのものです。
ではこうするとKAZUの望む動作になりますと言いたいところですが,いまいちわかりません。
もっと詳しくどういった動作になってほしいか書いてもらえればアドバイスのやりようもあるのですが……。
SHGetSpecialFolderPathのエラーですが,私の最初のレスにも書いたこれをコードに含めてください。
はい,そのように作ってあります。
あれはその直前のUhspさんのHSPのコードを(前に書いたとおり山勘ですが)ABに移してみただけのものです。
ではこうするとKAZUの望む動作になりますと言いたいところですが,いまいちわかりません。
もっと詳しくどういった動作になってほしいか書いてもらえればアドバイスのやりようもあるのですが……。
SHGetSpecialFolderPathのエラーですが,私の最初のレスにも書いたこれをコードに含めてください。
コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "Shell32" Alias "SHGetSpecialFolderPathA" (
hwndOwner As HWND,
pszPath As *Char,
nFolder As Long,
fCreate As Long
) As Long