Word VBA質問箱 IV

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

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


44 / 45 ページ ←次へ | 前へ→

【41】Wordのウィンドウを整列させる
質問  WhiteRabbit  - 03/5/19(月) 12:06 -

引用なし
パスワード
   お世話になっています。

Word文書のウインドウを整列させる方法を教えてください。
タスクバーのショートカットメニューに「重ねて表示」「上下に並べて表示」「左右に並べて表示」がありますが、Word以外のウィンドウがあった場合これも含まれてしまいますので、除外したいのです。
Word以外のウィンドウを最小化してから、タスクバーのショートカットメニューの実行をすればいいのですが、VBAで操作する方法がわかりません。
よろしくお願いします。
・ツリー全体表示

【40】Re:リストボックス内を並べ替え
お礼  WhiteRabbit  - 03/5/16(金) 21:18 -

引用なし
パスワード
   ▼らいでん さん:
こんばんは。返信ありがとうございます。

>こんにちは。
>ご提示のデータですと
>
>Sub TempTable()
> Dim TmpTb As Table
> Dim myArray() As Variant
> Dim lngCol As Long
> Dim strCell As String
> Dim i As Long
> 
> Set TmpTb = ThisDocument.Tables(1)
> 'ソート処理
> '見出しは対象外,2列目,JISコードを基準,昇順
> TmpTb.Sort ExcludeHeader:=False, FieldNumber:="列 2", SortFieldType:= _
>  wdSortFieldJapanJIS, SortOrder:=wdSortOrderAscending
> 
> lngCol = TmpTb.Rows.Count - 1
> ReDim myArray(lngCol, 1)
> 
> For i = 0 To lngCol
>  '一列目のデータを配列に格納
>  strCell = TmpTb.Cell(i + 1, 1).Range.Text
>  myArray(i, 0) = Left(strCell, Len(strCell) - 2)
>  '二列目のデータを配列に格納
>  strCell = TmpTb.Cell(i + 1, 2).Range.Text
>  myArray(i, 1) = Left(strCell, Len(strCell) - 2)
> Next
> 
> With UserForm1.ListBox1
>  .ColumnCount = 2
>  .List = myArray
>  .ListIndex = 0
>  .ColumnWidths = "20;40"
> End With
> UserForm1.Show
> 
> Set TmpTb = Nothing
>End Sub
>
>こういったところでしょうか。

サンプルコードありがとうございます。うまく作動しました。

>Excelですとご存知の通りUsedRangeそのものが配列として取り扱えますが
>Wordの表(セル)では、改行情報やセル区切りといったWord固有の情報が
>存在しますのでこの情報を切り捨てるという処理が必要になります。

>ですのでExcelと同じような使い勝手のよさを期待されると辛いものが
>あります。

ExcelVBA自体もよくわかってませんがWordの方もなかなか難しいのですね。

>>作業用のシートを適宜追加し
>と仰っていますので、多分
>リストボックスのデータを一旦表に書き出す→ソート処理→配列変数格納
>→表の削除、または作業用文書の削除
>といった一連の処理を考えておられるのでしたら、更なる工夫が必要に
>なるでしょう。

まさにそんなところですね。ちょっと勿体ない感じはしますが、ありものでできるのは捨てがたいですね。

>この点
>>他のサイトを検索したら配列変数にとりこんでからのソートで対応
>こちらのアルゴリズムと天秤にかけて考える必要がありそうですね。

いろいろと教えていただき勉強になります。
また質問すると思いますが今後もよろしくお願いします。
・ツリー全体表示

【39】Re:リストボックス内を並べ替え
回答  らいでん  - 03/5/16(金) 16:15 -

引用なし
パスワード
   こんにちは。
ご提示のデータですと

Sub TempTable()
 Dim TmpTb As Table
 Dim myArray() As Variant
 Dim lngCol As Long
 Dim strCell As String
 Dim i As Long
 
 Set TmpTb = ThisDocument.Tables(1)
 'ソート処理
 '見出しは対象外,2列目,JISコードを基準,昇順
 TmpTb.Sort ExcludeHeader:=False, FieldNumber:="列 2", SortFieldType:= _
  wdSortFieldJapanJIS, SortOrder:=wdSortOrderAscending
 
 lngCol = TmpTb.Rows.Count - 1
 ReDim myArray(lngCol, 1)
 
 For i = 0 To lngCol
  '一列目のデータを配列に格納
  strCell = TmpTb.Cell(i + 1, 1).Range.Text
  myArray(i, 0) = Left(strCell, Len(strCell) - 2)
  '二列目のデータを配列に格納
  strCell = TmpTb.Cell(i + 1, 2).Range.Text
  myArray(i, 1) = Left(strCell, Len(strCell) - 2)
 Next
 
 With UserForm1.ListBox1
  .ColumnCount = 2
  .List = myArray
  .ListIndex = 0
  .ColumnWidths = "20;40"
 End With
 UserForm1.Show
 
 Set TmpTb = Nothing
End Sub

こういったところでしょうか。

Excelですとご存知の通りUsedRangeそのものが配列として取り扱えますが
Wordの表(セル)では、改行情報やセル区切りといったWord固有の情報が
存在しますのでこの情報を切り捨てるという処理が必要になります。

ですのでExcelと同じような使い勝手のよさを期待されると辛いものが
あります。

>作業用のシートを適宜追加し
と仰っていますので、多分
リストボックスのデータを一旦表に書き出す→ソート処理→配列変数格納
→表の削除、または作業用文書の削除
といった一連の処理を考えておられるのでしたら、更なる工夫が必要に
なるでしょう。

この点
>他のサイトを検索したら配列変数にとりこんでからのソートで対応
こちらのアルゴリズムと天秤にかけて考える必要がありそうですね。
・ツリー全体表示

【38】Re:ユーザーフォームに最大化最小化ボタン
お礼  WhiteRabbit  - 03/5/16(金) 11:54 -

引用なし
パスワード
   ▼H. C. Shinopy さん:
>私の環境はWinXP・Word2002ですが、
>(震度2の地震でHDが壊れ、それを機会にアップグレードしました。
>PCを購入して5カ月後の災難でした。)
>Word VBAで大きな仕様変更はない模様です。
>
>ユーザーフォームでのマウスのドラッグによる移動の件ですが、
>動かないですか???
>コマンドボタンなどコントロール群を配置する部分を
>ドラッグしていませんか?
>
>タイトルバーの部分をマウスでドラッグしてみて下さい。

こんにちは。いつも返信ありがとうございます。
タイトルバーの部分をマウスでつかんで移動しても移動できないのです。
どうも現象が出るのは2番目のサンプルコード(最大化のプロシージャ)を組み込んだ場合に発生するようです。これを削除すればうまくいきました。
・ツリー全体表示

【37】Re:ユーザーフォームに最大化最小化ボタン
回答  H. C. Shinopy  - 03/5/15(木) 22:20 -

引用なし
パスワード
   私の環境はWinXP・Word2002ですが、
(震度2の地震でHDが壊れ、それを機会にアップグレードしました。
PCを購入して5カ月後の災難でした。)
Word VBAで大きな仕様変更はない模様です。

ユーザーフォームでのマウスのドラッグによる移動の件ですが、
動かないですか???
コマンドボタンなどコントロール群を配置する部分を
ドラッグしていませんか?

タイトルバーの部分をマウスでドラッグしてみて下さい。
・ツリー全体表示

【36】Re:リストボックス内を並べ替え
質問  WhiteRabbit  - 03/5/15(木) 15:27 -

引用なし
パスワード
   ▼らいでん さん:

こんにちは、

>>Excelでは作業用のシートを適宜追加しSortメソッドで並べ替えが可能ですがWordには
>>シートの概念がないのでそうはいかない、という意味で書いたので実際にExcelシートを
>>流用するということではありません。
>
>私はExcelシートを流用しようという事は考えておりませんよ。
>リストボックスに取り込むべきデータの所在をお聞きしたかったのです。
>こちらはWord掲示板ですので、データはWord文書上に存在するのだと考えるのが自然
>だと思ったのですが?
>
>>やりたかったのは文書内の表の並べ替えをしたいのではなくてリストボックス内のデー
>>タを並べ替えたいのです。
>
>はい、了解していますよ。
>Wordでも表のソート機能を使って配列に取り込めば良いと考えたのですが?
>Excelでも
>>Excelでは作業用のシートを適宜追加しSortメソッドで並べ替えが可能ですが
>と仰っていますように、データの並び替えをされているのですから同じ事ですよね。

そういわれますとそうですね。納得です。
その方法でも試してみることにします。
WORDの表を配列に取り込む場合、具体的にどういうコードになりますでしょうか?」

表は2列×任意の複数行とします。
index    data
1    あああ
2    いいい
3    ううう
..
・ツリー全体表示

【35】Re:ユーザーフォームに最大化最小化ボタン
質問  WhiteRabbit  - 03/5/15(木) 15:15 -

引用なし
パスワード
   ▼H. C. Shinopy さん:

こんにちは。ご丁寧な返信ありがとうございます。
紹介していただいた書籍は、参照させていだくこともあるかもしれませんので書き留めておきますね。

>「どういう・どのように」に付いて
>API関数については、VBAの関数にない(あればAPIは必要ないので、当然ですが)
>OS寄りの処理ができる関数と思って下さい。
>(DLL<動的結合ライブラリ>から、関数の形で処理を呼び出します。)
>API関数は、Declareステートメントでプロシージャの前に書き込むと
>(あるいは新たに標準モジュールを挿入して、そこに書き込むと)、
>通常のFunctionプロシージャと同じように
>VBAのプロシージャから呼び出すことができます。

標準の関数ではないのですね。なんとなくわかりました。
#素人には手強いということが(笑)

>VBAでの作譜では、現実の作業に対処するため、APIに関連するものは
>できたものをコピーして貼り付けというのが通常であり、
>掲示板上にコードを載せたいのは山々ですが、
>しかし、著作権上の問題があり、この本も「転載することを禁止」と
>誠にご尤もなことですので、↓で御容赦ください。
>
>御質問の「ユーザーフォームに最大化・最小化ボタンを付加し、
>リサイズを可能にする」に付いて使う関数は、次の4つです。
>
>クラス名またはキャプションタイトルを与えて
>ウィンドウハンドルを取得する関数:FindWindowA
>ウィンドウに関する情報を取得する関数:GetWindowLongA
>ウィンドウの属性を変更する関数:SetWindowLongA
>ウィンドウのメニューバーを再描画する関数:
>User32.dllに媒介変数を指定したものを使用
>
>使い方に付いて
>実際のVBAでは、例として(途中は・・・で隠して)次のようになります。
>[標準モジュール]では、次のように書き込みます。
>Public Const GWL_STYLE = -16&      'ウィンドウスタイルを取得する
>・・・
>・・・
>'クラス名またはキャプションタイトルを与えて
>'ウィンドウハンドルを取得する関数の宣言
>Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
>  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
>・・・
>Declare ・・・
>・・・
>' ここから下が、これまで作ってきたプロシージャ
>Sub UserForm1Run()
>' ユーザーフォームを表示
> UserForm1.Show
>End Sub
>
>Sub ・・・
>・・・
>End Sub
>・・・
>・・・
>
>[ユーザーフォーム]では、次のように書き込みます。
>Private Sub UserForm_Initialize()
>' ユーザーフォームに最大化・最小化ボタンを付加する処理
>  Dim ・・・
>  myHwnd = FindWindow(myClassName, Me.Caption)
>  lngNewLong = GetWindowLong(myHwnd, GWL_STYLE)
>  ・・・
>End Sub
>
>↑と、このようになります。これを「・・・」を含めて全部書けば、
>処理が可能なわけです。
>しかし、自前で全部調べて作るとなると…気が遠くなります。
>
>立ち読みできなかった件に付いて
>他の書籍では、APIを話題に取り上げているのは
>現在のところ、次の1冊だけと言っていいと思います。
>(それ以外は、C言語用で参考になりません。
>但し、Excel VBAの書籍で同じ話題を扱っているものがあれば、
>使い回しができるはずです。)
>『Excel VBAによるWin32 APIプログラミング入門』
>著者:大村あつし
>出版社:エーアイ出版
>ISBN:4871938905
>サイズ:単行本
>発行年月: 2002年 04月
>価格: 2680円+悪税
>「第8章 ウィンドウの操作」の
>「UserForm2 ユーザーフォームに最大化・最小化ボタンを付加し、
>リサイズを可能にする」
>
>私が本屋を見て歩いた限りでは、紹介した書籍は、
>大型書籍店・電気店直営本屋で扱っています。
>(勿論、どの本屋も取り寄せ購入は可能です。)
>図書館で扱っていれば、立ち読みした上、合法的にコピーできますが、
>どうも図書館では、電算分野の書籍はすぐに内容が古くなるためか
>余り扱わないようです。
>また、図書館によっては確固たる方針として
>この分野の書籍を他館に完全に一任し、
>自館に置かないとしている場合があります。
>図書館に購入を請求できる場合もあるようですが、
>出版社と水面下で係争中の模様で、総ての館でできるわけではありません。
>(電算機の発達で紙媒体業者が衰退産業になってしまっている上、
>図書館が新刊本を貸し出すため、本屋の売上が激減している現実があります。)
>
>それにしても、僅か数頁を読むために、
>厚い本を1冊丸ごと買うのは誠に勿体ない話で、
>そのための掲示板なのですが…この板上ではお役に立てず残念です。
>
>おっと! ここまで書いた所で、検索して見たら、
>サイト上にコードを載せている方を発見しました。
>まずは、一覧して下さい。
>K窓 http://homepage2.nifty.com/kmado/
> Excel技 マクロ編 http://homepage2.nifty.com/kmado/ke_m8.htm
> 『E00M074(Excel2000)
> 項目 UserFormのウィンドウスタイルを変更する
> 内容説明 UserFormのウィンドウスタイル(属性)を
> 変更する方法を示します。
> その1)ユーザーフォームに最大化最小化ボタンを付け、
> 又サイズ変更可能にする』

上のWebサイトのサンプルコード、いまだちんぷんかんぷんですが、動かしてみたところ、最大化最小化はばっちりうまくいきました。研究してなんとか使用できるようにしてみようと思います。
あと一点よろしいでしょうか。サンプルコードではユーザーフォームを標準サイズにした際にマウスで移動することができないようです。
これはなんとかなるものでしょうか?

遅ればせながら当方の環境はWindows2000&Word2000です。

よろしくお願いします。
・ツリー全体表示

【34】Re:ユーザーフォームに最大化最小化ボタン
回答  H. C. Shinopy  - 03/5/14(水) 11:22 -

引用なし
パスワード
   「どういう・どのように」に付いて
API関数については、VBAの関数にない(あればAPIは必要ないので、当然ですが)
OS寄りの処理ができる関数と思って下さい。
(DLL<動的結合ライブラリ>から、関数の形で処理を呼び出します。)
API関数は、Declareステートメントでプロシージャの前に書き込むと
(あるいは新たに標準モジュールを挿入して、そこに書き込むと)、
通常のFunctionプロシージャと同じように
VBAのプロシージャから呼び出すことができます。

VBAでの作譜では、現実の作業に対処するため、APIに関連するものは
できたものをコピーして貼り付けというのが通常であり、
掲示板上にコードを載せたいのは山々ですが、
しかし、著作権上の問題があり、この本も「転載することを禁止」と
誠にご尤もなことですので、↓で御容赦ください。

御質問の「ユーザーフォームに最大化・最小化ボタンを付加し、
リサイズを可能にする」に付いて使う関数は、次の4つです。

クラス名またはキャプションタイトルを与えて
ウィンドウハンドルを取得する関数:FindWindowA
ウィンドウに関する情報を取得する関数:GetWindowLongA
ウィンドウの属性を変更する関数:SetWindowLongA
ウィンドウのメニューバーを再描画する関数:
User32.dllに媒介変数を指定したものを使用

使い方に付いて
実際のVBAでは、例として(途中は・・・で隠して)次のようになります。
[標準モジュール]では、次のように書き込みます。
Public Const GWL_STYLE = -16&      'ウィンドウスタイルを取得する
・・・
・・・
'クラス名またはキャプションタイトルを与えて
'ウィンドウハンドルを取得する関数の宣言
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
・・・
Declare ・・・
・・・
' ここから下が、これまで作ってきたプロシージャ
Sub UserForm1Run()
' ユーザーフォームを表示
 UserForm1.Show
End Sub

Sub ・・・
・・・
End Sub
・・・
・・・

[ユーザーフォーム]では、次のように書き込みます。
Private Sub UserForm_Initialize()
' ユーザーフォームに最大化・最小化ボタンを付加する処理
  Dim ・・・
  myHwnd = FindWindow(myClassName, Me.Caption)
  lngNewLong = GetWindowLong(myHwnd, GWL_STYLE)
  ・・・
End Sub

↑と、このようになります。これを「・・・」を含めて全部書けば、
処理が可能なわけです。
しかし、自前で全部調べて作るとなると…気が遠くなります。

立ち読みできなかった件に付いて
他の書籍では、APIを話題に取り上げているのは
現在のところ、次の1冊だけと言っていいと思います。
(それ以外は、C言語用で参考になりません。
但し、Excel VBAの書籍で同じ話題を扱っているものがあれば、
使い回しができるはずです。)
『Excel VBAによるWin32 APIプログラミング入門』
著者:大村あつし
出版社:エーアイ出版
ISBN:4871938905
サイズ:単行本
発行年月: 2002年 04月
価格: 2680円+悪税
「第8章 ウィンドウの操作」の
「UserForm2 ユーザーフォームに最大化・最小化ボタンを付加し、
リサイズを可能にする」

私が本屋を見て歩いた限りでは、紹介した書籍は、
大型書籍店・電気店直営本屋で扱っています。
(勿論、どの本屋も取り寄せ購入は可能です。)
図書館で扱っていれば、立ち読みした上、合法的にコピーできますが、
どうも図書館では、電算分野の書籍はすぐに内容が古くなるためか
余り扱わないようです。
また、図書館によっては確固たる方針として
この分野の書籍を他館に完全に一任し、
自館に置かないとしている場合があります。
図書館に購入を請求できる場合もあるようですが、
出版社と水面下で係争中の模様で、総ての館でできるわけではありません。
(電算機の発達で紙媒体業者が衰退産業になってしまっている上、
図書館が新刊本を貸し出すため、本屋の売上が激減している現実があります。)

それにしても、僅か数頁を読むために、
厚い本を1冊丸ごと買うのは誠に勿体ない話で、
そのための掲示板なのですが…この板上ではお役に立てず残念です。

おっと! ここまで書いた所で、検索して見たら、
サイト上にコードを載せている方を発見しました。
まずは、一覧して下さい。
K窓 http://homepage2.nifty.com/kmado/
 Excel技 マクロ編 http://homepage2.nifty.com/kmado/ke_m8.htm
 『E00M074(Excel2000)
 項目 UserFormのウィンドウスタイルを変更する
 内容説明 UserFormのウィンドウスタイル(属性)を
 変更する方法を示します。
 その1)ユーザーフォームに最大化最小化ボタンを付け、
 又サイズ変更可能にする』
・ツリー全体表示

【33】Re:リストボックス内を並べ替え
回答  らいでん  - 03/5/14(水) 0:16 -

引用なし
パスワード
   らいでんです。

>Excelでは作業用のシートを適宜追加しSortメソッドで並べ替えが可能ですがWordには
>シートの概念がないのでそうはいかない、という意味で書いたので実際にExcelシートを
>流用するということではありません。

私はExcelシートを流用しようという事は考えておりませんよ。
リストボックスに取り込むべきデータの所在をお聞きしたかったのです。
こちらはWord掲示板ですので、データはWord文書上に存在するのだと考えるのが自然
だと思ったのですが?

>やりたかったのは文書内の表の並べ替えをしたいのではなくてリストボックス内のデー
>タを並べ替えたいのです。

はい、了解していますよ。
Wordでも表のソート機能を使って配列に取り込めば良いと考えたのですが?
Excelでも
>Excelでは作業用のシートを適宜追加しSortメソッドで並べ替えが可能ですが
と仰っていますように、データの並び替えをされているのですから同じ事ですよね。
・ツリー全体表示

【32】Re:ユーザーフォームに最大化最小化ボタン
お礼  WhiteRabbit  - 03/5/13(火) 15:19 -

引用なし
パスワード
   ▼H. C. Shinopy さん:
>API関数を使って、最大化・最小化ボタンを
>ユーザーフォームに表示することが可能です。
>Excel VBAのコードがそのまま使えます。
>
>下記の本に事例が載っています。
>ExcelとWordの両方のVBEを起動し、
>コードをコピーして貼り付けしてみたところ、
>動作することを確認しました。
>
>『ExcelVBA 実用サンプルコレクション』
>著者 プロジェクトA 渡辺ひかる
>監修 プロジェクトA 大村あつし
>ISBN 4-7973-2087-7
>出版社 ソフトバンクパブリッシング
>価格 3000円+悪税
>
>「Section Q 外部プログラムを利用する。」の中の
>「Tips Q-060 ユーザーフォームに最大化・最小化ボタンを付加し、
>リサイズを可能にする」
>
>御参考までに。

レスが遅れましてすみません。あまりに反応が無いので半ば諦めていました。
それと書籍のご紹介ありがとうございます。
しかし、近隣の本屋さんには置いていないようで、立ち読みもできません。
差しさわりの無い程度で、どのようにしたらよいのか教えてくださいませんでしょうか?
それとAPI関数というのは何でしょうか?
どういう関数をどのように使えばいいのかわかるとありがたいです。
よろしくお願いします。
・ツリー全体表示

【31】Re:リストボックス内を並べ替え
お礼  WhiteRabbit  - 03/5/13(火) 15:14 -

引用なし
パスワード
   ▼らいでん さん:
レスありがとうございます。返信がおくれましてすみません。
あまりに反応ないので半ば諦めておりました。

>>リストボックスの項目を追加セットする際に
>
>追加セット?・・ってどういったことでしょうね?
>単にAddItemするという事とは違うのですか?

分かりづらくてすみません。AddItemでもいいんですが、Listプロパティに指定するデータをどうにかできないかと考えていました。

>>Excelだとシートの並べ替えで済むのですが
>
>シートの並び替えですか?シートの順を並び替えてどうするのでしょう?
>多分Wordで表内データの並び替えを行って、そのデータをリストボックス
>に取り込みたい、という事だと想像しましたが?

Excelを引き合いに出したのがまずかったかもしれません。
Excelでは作業用のシートを適宜追加しSortメソッドで並べ替えが可能ですがWordにはシートの概念がないのでそうはいかない、という意味で書いたので実際にExcelシートを流用するということではありません。

やりたかったのは文書内の表の並べ替えをしたいのではなくてリストボックス内のデータを並べ替えたいのです。
※このリストボックスには「使用用語」のリストみたいな用途で適宜用語が追加されます。

並べ替えについては他のサイトを検索したら配列変数にとりこんでからのソートで対応できそうだということは判りました。この方法で取り組み中ですが、もし他に簡単な方法がありましたらご教示ください。
・ツリー全体表示

【30】Re:shellの終了と同期させるには? 追...
回答  H. C. Shinopy  - 03/5/11(日) 8:22 -

引用なし
パスワード
   先にVBScriptでの処理を書き込みしましたが、
Word VBAで処理する方法があることが判りました。
(不勉強で、すみません。)

後日、Excel VBAの本を見ていたら、使えそうなコードを発見しました。
(メモ帳を起動して、その終了を待つというものでした。)
それを使い回そうとしたのですが、いろいろ試した結果、
下記のコードとなりました。

1.デスクトップにABC.batがあるものとします。
  (この処理でABCo.txtが出力されるものとします。)

2.VBE上から[ツール]の[参照設定...]で、
  [Windows Script Host Object Model]をチェックして下さい。

3.「ChDir …」で「ABC.bat」のあるフォルダを指定します。
  これを指定しない場合、マイドキュメントの中を見にいくようです。

Sub AbcVBA()
  '参照設定:Windows Script Host Object Model
  Dim myWsh As IWshRuntimeLibrary.WshShell
  Set myWsh = CreateObject("Wscript.Shell")
  '
  ChDir "C:\Documents and Settings\User\デスクトップ"
  myWsh.Run "ABC.bat", 1, True
  '
  MsgBox "ABC.batが終了しました。"
  Documents.Open "C:\Documents and Settings\User\My Documents\ABCo.txt"
  Set myWsh = Nothing
End Sub
[終わり]
・ツリー全体表示

【29】Re:ユーザーフォームに最大化最小化ボタン
回答  H. C. Shinopy  - 03/5/10(土) 9:04 -

引用なし
パスワード
   API関数を使って、最大化・最小化ボタンを
ユーザーフォームに表示することが可能です。
Excel VBAのコードがそのまま使えます。

下記の本に事例が載っています。
ExcelとWordの両方のVBEを起動し、
コードをコピーして貼り付けしてみたところ、
動作することを確認しました。

『ExcelVBA 実用サンプルコレクション』
著者 プロジェクトA 渡辺ひかる
監修 プロジェクトA 大村あつし
ISBN 4-7973-2087-7
出版社 ソフトバンクパブリッシング
価格 3000円+悪税

「Section Q 外部プログラムを利用する。」の中の
「Tips Q-060 ユーザーフォームに最大化・最小化ボタンを付加し、
リサイズを可能にする」

御参考までに。
・ツリー全体表示

【28】Re:リストボックス内を並べ替え
発言  らいでん  - 03/5/4(日) 1:42 -

引用なし
パスワード
   レスつかないですね。

>リストボックスの項目を追加セットする際に

追加セット?・・ってどういったことでしょうね?
単にAddItemするという事とは違うのですか?

>Excelだとシートの並べ替えで済むのですが

シートの並び替えですか?シートの順を並び替えてどうするのでしょう?
多分Wordで表内データの並び替えを行って、そのデータをリストボックス
に取り込みたい、という事だと想像しましたが?

あまり感覚的な言葉を使わない方が宜しいかと。
・ツリー全体表示

【26】ユーザーフォームに最大化最小化ボタン
質問  WhiteRabbit  - 03/4/28(月) 17:25 -

引用なし
パスワード
   こんにちは。
ユーザーフォームに最大化最小化ボタンを付けることは可能なのか教えてください。
・ツリー全体表示

【25】Re:shellの終了と同期させるには?
回答  H. C. Shinopy  - 03/4/27(日) 23:32 -

引用なし
パスワード
   どういう状況下(環境・処理全体…)での処理なのか判りませんが、
御質問の判らん部分は独断と偏見で解釈し、返信させて頂きます。
万一、的ハズレな回答でしたら、ガセネタの1つとして、
読み飛ばして頂くことで、お許し下さい。

さて、Shell関数について、VBE上からヘルプを見ると:
xxxの値については「指定したプログラムが問題なく実行できると、プログラムのタスク ID が返されます。タスク ID は、実行中のプログラムを識別する重複しない番号です。指定されたプログラムが実行できないと、エラーが発生します。」
また「タスク ID は、実行中のプログラムを識別する重複しない番号です。実行可能プログラムを実行し、実行が完了するとプログラムのタスク ID を示すバリアント型 (内部処理形式 Double の Variant) の値を返します。プログラムの実行に問題が発生した場合は、0 を返します。」とあります。

Sendkeys関数のヘルプに使用例があり、「電卓をアクティブにします。」処理で(タイトル バーのタイトルを指定する代わりに)タスクIDを指定しています。
Sub CalcX()
 Dim ReturnValue, I
 ReturnValue = Shell("CALC.EXE", 1)  ' 電卓を実行します。
 AppActivate ReturnValue        ' 電卓をアクティブにします。
 For I = 1 To 20            ' ループ カウンタを設定します。
  SendKeys I & "{+}", True      ' 電卓にキー コードを転送して、
 Next I                ' I の値に 1 を加算します。
 SendKeys "=", True          ' 和を求めます。
 SendKeys "%{F4}", True        ' Alt + F4 キーを転送して電卓を終了します。
End Sub

同期については「・・・ メモ 既定の設定では、Shell 関数はプログラムを非同期的に実行します。したがって、Shell関数を使用して実行を開始したプログラムが終了しなくても、Shell関数の次のステートメントは実行されます。」とあります。
しかし、ヘルプを見た限りでは、「既定の設定」を変更できる余地はないようです。(VBA上のShell関数に同期・非同期を指定するパラメーター部分がないのです。)

また、市販されている書籍を探すと、著作権の都合で内容は載せませんが…
大村あつし 著「Excel VBAによるWin32 APIプログラミング入門」
エーアイ出版 刊(www.ai-pub.co.jp) 税別2680円
この本の「第4章 プログラムの実行」に
「Shell関数で起動したアプリケーションが終了するまで待機する」節(92頁)に
APIを利用した何やら物々しいVBAコードが載っています。


ここでは、あっさり処理全体をVBAではなくVBScriptを使用して、
WSHの機能で全体の処理を実行したらどうでしょうか?
(WSHは、WindowsMe・WindowsXPに対応。)

VBScriptのShell関数と同等のステートメントでは「終了待ちをする・しない」の指定ができます。
下記のスクリプトを「ファイル名.vbs」(テキスト形式で拡張子に「vbs」を指定して)保存し、これをダブルクリックして起動すれば、御質問に沿えそうな処理ができます。
(但し、Shell関数の戻り値は常に「0」です。呼び出したコマンドの終了待ちをして、終了後の戻り値を得るので、「0」になるということのようです。)
ここでは、「ABC.bat」処理内で「ABCo.txt」ファイルを出力作成し、
最後にWordに読み込むと仮定して、スクリプトは下記の通りになります。


Rem テキスト形式ファイル出力Word読み込み処理VBScript
Option Explicit
Dim WshShell, tmpInt
Dim myWord
'
Set WshShell = WScript.CreateObject("WScript.Shell")
tmpInt = WshShell.Run ("ABC.bat", 1, True)  ' True は処理待ち。
MsgBox “WScript.Shellの戻り値:” & tmpInt ' 多分、無意味な表示。
'
Set myWord = WScript.CreateObject("Word.Application")
myWord.Visible = True
myWord.Documents.Open " C:\Documents and Settings\User名\My Documents\ABCo.txt"
'
tmpInt = MsgBox("処理が終了しました。", vbOKonly+vbInformation)
WScript.Quit


この後は全く余談になりますが、
もし「ABC.bat」の処理をこのスクリプトの中に書き込んでしまえば、
(当然ながら)同期を考える必要はなくなります。
「ABC.bat」で何を処理しているのか判りませんが、
御参考までにということで…
下記のスクリプトは、「ABC.txt」ファイルを「ABCo.txt」で出力し、
それをWordで読み込むという処理です。
下記のスクリプトを「ファイル名.vbs」で保存し、
これに「ABC.txt」ファイルをドラッグ&ドロップすると、処理を実行します。


Rem テキスト形式ファイル出力Word読み込み処理VBScript
Option Explicit
Dim objDrop, objFS, objTsIn, objTsOt
Dim tmpInt, tmpTsOt, Txt
Dim myWord
'
If WScript.Arguments.Count <= 0 Then
 tmpInt = MsgBox("テキスト形式ファイルのアイコンを、" & vbCrLf _
 & WScript.ScriptName & "のアイコン上に、" & _
 "ドラッグ&ドロップして下さい。" & vbCrLf _
 & "ファイル名に「o」を付けたファイルを作成します。", _
 vbOKonly+vbInformation)
 WScript.Quit
End If
'
objDrop = Wscript.Arguments(0)
tmpInt = MsgBox("入力元ファイル:" & vbCrLf & objDrop, vbOKCancel+vbInformation)
If tmpInt = 2 Then
 WScript.Quit
End If
'
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
Set objTsIn = objFS.OpenTextFile(objDrop, 1)
'
tmpTsOt = objFS.GetParentFolderName(objDrop) _
 & "\" & objFS.GetBaseName(objDrop) & "o." & objFS.GetExtensionName(objDrop)
tmpInt = MsgBox("出力先ファイル:" & vbCrLf & tmpTsOt, vbOKCancel+vbInformation)
If tmpInt = 2 Then
 objTsIn.Close
 WScript.Quit
End If
Set objTsOt = objFS.CreateTextFile(tmpTsOt, True, False)
'
Do While Not objTsIn.AtEndOfStream
 Txt = objTsIn.ReadLine
 objTsOt.WriteLine (Txt)
Loop
'
objTsIn.Close
objTsOt.Close
' Microsoft Wordの起動
Set myWord = WScript.CreateObject("Word.Application")
myWord.Visible = True
myWord.Documents.Open tmpTsOt
'
tmpInt = MsgBox("処理が終了しました。", vbOKonly+vbInformation)
WScript.Quit
・ツリー全体表示

【23】shellの終了と同期させるには?
質問  てけてけ  - 03/4/25(金) 21:00 -

引用なし
パスワード
   こちらには初めて書込ます。
ワードマクロの中で

テキストファイルに書き出す
xxx=shell(abc.bat)
abc.batで出力されたファイルを読み込む

のように外部のバッチを実行し、このバッチでできたファイルを読み込む場合、
shellの完了を待つ必要がありますが、xxxの値をどう利用したら可能かわかりません。
コーディング例を教えて頂けるとありがたいです。
宜しくお願い致します。
・ツリー全体表示

【22】Re:WORDマクロの解説本について教えてくださ...
回答  H.C.Shinopy  - 03/4/24(木) 22:26 -

引用なし
パスワード
   長い間、放っておかれているようですが、
失業で俄かVBA作譜者になった私で宜しければ・・・

これまで、私が知り得た情報を書き込み致します。
無論ながらWord VBAに関心をお持ちでしょうから、
下記の本は既にお持ちであることは、
重々承知の上で敢えて返信させて頂きます。
(本の内容を既に御存知の場合は、御容赦ください。)


もし、この掲示板を御覧の方で、
他の「文献情報」をお持ちの方は、
追加の書き込みをお願い致します。
==== ==== ==== ====
楽天ブックスその他での検索によれば、
WordVBAの本については、次の2冊があります。

1.菅野佐知子「Word97VBAハンドブック」ナツメ社

2.大野悟・アトラス出版企画「10日で覚えるWordVBA入門教室」翔泳社

この内、1は題名からして内容は古そうですし、
(大型書籍店でも置いていません。)
取り寄せしてまで、買う価値があるかどうか・・・

従って、2だけです!(それでも、1999年8月発行の古い本です。)
お勧めとは言っても、ほかに選択の余地がありません。
(私の場合、秋葉原のLaox Book館で発見し入手しました。税別3200円)
本の内容に誤りがあるので、お買い上げの場合は、
翔泳社のサイトで訂正記事を確認して下さい。
http://www.shoeisha.com/book/errata/er_detail.asp?bid=943


少しばかりWordVBAの記事が載っている本としては、
次のものがあります。
(果たして、役に立つような記事があるかどうか・・・
本屋で立ち読みしてから、要否を判断して下さい。)

西上原裕明「Word2002 300の技」技術評論社 税別1980円
(この本は、300項目の中からVBAの記事を探さないといけません。)

岩田安雄「繰り返しよサヨウナラ 入門VBAマクロ」カットシステム
 税別2200円
(Microsoft Office全般の本です。)

Windowsプログラミング愛好会「VBAがわかる500の技」技術評論社
 税別1980円(これもMicrosoft Office全般の本です。)
(「オフィスワーク自動化計画 Wordを操作」「VBA厳選テクニック100 Word」)


断片的にWordVBAの記事が載っている本はとしては、
次のものがあります。

CRN「Word2002 トラブル解決の裏技」秀和システム
 税別2000円(「第10章 マクロの活用」)

工藤喜美枝/木村幸子
「すぐ効くWordのトラブルシューティング Q&A 276」
 毎日コミュニケーションズ 税別1600円
(「第12章 VBA」)

掌田津耶乃「Windows Script Hostハンドブック」毎日コミュニケーションズ
 税別2400円
(「Section 24 スクリプトで『ワード』を操作する」
「Section 25『ワード』をカラフルにしてみよう」)


Excel VBAの本の中で、連携処理として
Wordが関わる記事が載っている本としては、
次のものがあります。(各々、僅か1〜2件の記事ですが)

田中亨・木下裕人「Excel2000 VBAの魔術師」オーム社
 税別1900円
(ExcelのデータをWordで段組にして取り込む処理)

渡辺ひかる「Excel VBA 実用サンプルコレクション」
 ソフトバンク・パブリッシング 税別3000円
(「Section Q Q-2 Office連携 ExcelからWordを起動し、
 シートデータで差込印刷を行う」)

大村あつし「かんたんプログラミング Excel2002 VBA[応用編]」技術評論社
 税別2580円(「第9章 他のソフトとの連携」)

VBテックラボ&瀬戸遥「10日でおぼえるExcel VBA 応用教室 2000対応」
(「Lesson20 ExcelのデータをWordで印刷する」)税別3200円

瀬戸遥「Excel VBA即効サンプル集」翔泳社
 税別1800円
(「#119 ExcelからWordを起動する」
「#120 ワークシートをOLEでwordにコピー」)

[以上]
・ツリー全体表示

【21】リストボックス内を並べ替え
質問  WhiteRabbit  - 03/4/24(木) 15:17 -

引用なし
パスワード
   こんにちは。
リストボックスの項目を追加セットする際に五十音もしくはJISコード順に並べ替えする方法を教えてください。Excelだとシートの並べ替えで済むのですが、Wordではどうしてよいかわかりません。
よろしくお願いします。
・ツリー全体表示

【20】ありがとうございます!
お礼  ikasumi  - 03/4/24(木) 1:29 -

引用なし
パスワード
   丁寧に教えてくださってありがとうございます!
仰るとおり、全て教えてもらったのでは自分のためにもなりませんよね。
ここまで教えてもらっておきながらまだ試行錯誤を繰り返していて
恥ずかしい限りですが(汗
頑張って組み立てます!

本当にありがとうございました!
・ツリー全体表示

44 / 45 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
207621
(SS)C-BOARD v3.8 is Free