Word VBA質問箱 IV

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

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


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

【57】Re:ユーザーフォームにカラーパレットを
お礼  WhiteRabbit  - 03/5/24(土) 19:24 -

引用なし
パスワード
   こんばんは。返答が遅くなりました。
API関数を使ったカラーパレット表示でうまくいきそうです。
なかなか理解は難しいですがご紹介のサイトの情報を元に勉強していきたいと思います。

回答をいただいたみなさん、ありがとうございました。
・ツリー全体表示

【56】Re:Wordのウィンドウを整列させる 追加情報
お礼  WhiteRabbit  - 03/5/24(土) 19:21 -

引用なし
パスワード
   こんばんは、H. C. Shinopyさん、情報をありがとうございます。
MSサイトにも使えそうなVBAのサンプルがあるんですね。
早く検索してみるべきでした。
これだと画面がばたばたせずに並び替えできそうです。WINDOWオブジェクトの操作を勉強してみます。

しかし今回は他にShellアプリケーションを使う方法を教えていただいて勉強になりました。
いろいろ使えそうですから、収穫は大きかったですよ。(^^)

今後もよろしくお願いします。

▼H. C. Shinopy さん:
>マイクロソフトのサイトを見ていたら、
>何と! そのものズバリの記事が載っていました。
>文書ウインドウのサイズを気難しく計算して、
>左右に整列していました。
>
>『開いている文書ウィンドウを左右に整列させる方法』
>http://www.microsoft.com/japan/support/kb/articles/413/8/63.asp
>
>記事によれば、使用条件は次の通り。
>誠にお疲れ様でした。(辛い! 涙・涙…)
・ツリー全体表示

【54】Re:Wordのウィンドウを整列させる 追加情報
回答  H. C. Shinopy  - 03/5/23(金) 21:18 -

引用なし
パスワード
   マイクロソフトのサイトを見ていたら、
何と! そのものズバリの記事が載っていました。
文書ウインドウのサイズを気難しく計算して、
左右に整列していました。

『開いている文書ウィンドウを左右に整列させる方法』
http://www.microsoft.com/japan/support/kb/articles/413/8/63.asp

記事によれば、使用条件は次の通り。
誠にお疲れ様でした。(辛い! 涙・涙…)
以下、サイトから一部を引用。

マイクロソフト サポート技術情報 - 413863
開いている文書ウィンドウを左右に整列させる方法
この資料は以下の製品について記述したものです。
Microsoft Word 2000 for Windows

現象
Wordでは、開いている文書ウィンドウを上下に
整列する機能は用意していますが、
左右に整列する機能は用意されていません。…
左右にウィンドウを整列させるマクロを紹介します。

注意
開いている文書ウィンドウの数や
アプリケーションウィンドウのサイズにより、
右端に表示される文書ウィンドウが文書ウィンドウを
表示する範囲より多少ずれてしまう場合があります。
[終わり]
・ツリー全体表示

【53】Re:Wordのウィンドウを整列させる
回答  H. C. Shinopy  - 03/5/22(木) 8:56 -

引用なし
パスワード
   当方の環境では、不具合は再現されず、お役に立てそうにありません。
取り敢えず、下記の通り現在の結論を掲示しておきます。

1.時間待ちについて
「純正Word VBA」とShellアプリケーションの連携で
時間待ちが必要とすれば…
(画面が落ち着きなく動いているのを見ると、確かに言えます。)
WhiteRabbitさんのマクロは的を得ていると思います。

2.恐縮ながら「Windows.Arrange」を再登場させました。
これはショック療法のようなもので
「純正Word VBA」で一旦は上下に並べて表示しておき、
それをShellアプリケーションで左右に表示すればどうかと再考しました。

3.「Application.ScreenUpdating」は、
全く効き目がないようです。
(「途中経過」が画面上に表示されます。)
結果だけをパッと表示するということは、
ウィンドウ操作を伴う処理では全く働かないということのようです。

当件については、私の脳味噌は力尽きております。
ここで言えることは、私の理屈よりもWhiteRabbitさんの経験のほうが
勝るということです。
修羅場を潜り抜けていらっしゃるようですが、
そういう方こそ良き作譜者です。

Sub WinWordArrangeA()
 ' 参照設定 Microsoft Shell Controls And Automation
 '
 Dim myShell As Shell32.Shell
 Dim windowLoop As Window
 Dim myTimer As Single
 '
 Set myShell = CreateObject("Shell.Application")
 myShell.MinimizeAll
 '
 myTimer = Timer + 5
 Do Until myTimer < Timer
  DoEvents
 Loop
 Application.ScreenUpdating = False ' 効果なし
 For Each windowLoop In Windows
  With windowLoop
   .Activate
   .WindowState = wdWindowStateMaximize
  End With
 Next windowLoop
 Windows.Arrange ' (?!)
 Application.ScreenUpdating = True ' 効果なし
 '
 myTimer = Timer + 5
 Do Until myTimer < Timer
  DoEvents
 Loop
 myShell.TileVertically ' 左右に並べて表示
 '
 Set myShell = Nothing
End Sub
・ツリー全体表示

【52】Re:Wordのウィンドウを整列させる
質問  WhiteRabbit  - 03/5/21(水) 12:38 -

引用なし
パスワード
   こんにちは、返信ありがとうございます。

修正していただいたコードを試してみているのですが、どうも私のPC環境のせいなのか、うまく整列できないようです。(Windwos2000&Word2000)
ウィンドウサイズが変わる間の動作が影響しているかと思い、間に時間待ちをしてみるといいようです。
ウィンドウの画面を止める方法があればまた様子が違うかもしれません。こうなってくるとVBAでは難しいものでしょうか?
Word内でしたらScreenupdattingプロパティを使えるのですが。

Sub WinWordArrange()
 ' 参照設定 Microsoft Shell Controls And Automation
 Dim myShell As Shell32.Shell
 Dim windowLoop As Window
 Dim waitTimer As Single
 '
 Set myShell = CreateObject("Shell.Application")
 myShell.MinimizeAll
 '
 waitTimer = Timer
 Do: DoEvents: Loop While Timer - waitTimer < 0.2
 
 For Each windowLoop In Windows
  With windowLoop
   .Activate
   .WindowState = wdWindowStateMaximize
  End With
 Next windowLoop
 '
 waitTimer = Timer
 Do: DoEvents: Loop While Timer - waitTimer < 0.2
 'myShell.TileVertically ' 左右に並べて表示
 myShell.TileVertically ' 上下に並べて表示
 'myShell.CascadeWindows ' 重ねて表示
 '
 Set myShell = Nothing
End Sub
・ツリー全体表示

【51】Re:ユーザーフォームにカラーパレットを
お礼  WhiteRabbit  - 03/5/21(水) 12:10 -

引用なし
パスワード
   こんにちは。返信ありがとうございます。
ご紹介のサイトからダウンロードして格闘してみることにします。
不明な点は質問させていただいてよろしいでしょうか?
結果報告までしばらくお時間をください。

▼hide さん:
>▼WhiteRabbit さん:
>>こんにちは。お世話になっています。
>>立て続けですみませんが、ユーザーフォームからカラーパレットを表示させるにはどうすればいいでしょうか?
>>そこで選択されたカラーを取得してWord文書内の文字列に反映したりしたいと思っています。
>>カラーパレットでなくてもコンボボックスの各項目に彩色するのでもいいのですが、ご存知の方がいましたらよえろしくお願いします。
>
>APIでよければ下記サイトが参考になるかもしれません
>http://homepage1.nifty.com/MADIA/vb/API/CHOOSECOLOR.htm
・ツリー全体表示

【50】Re:ユーザーフォームにカラーパレットを
お礼  WhiteRabbit  - 03/5/21(水) 12:05 -

引用なし
パスワード
   こんんちは。返信ありがとうがざいます。

▼らいでん さん:
>きっとWhiteRabbitさんはプログラマさんなのでしょうね(*^^*)

とんでもないです。プログラム言語はVBAが初めてという程度なのです。

>大変失礼ながら何回も念を押しますが、ツールバーでなくパレット自体の
>浮動表示なのですが、、、伝わっていますでしょうか?

それは十分存知ています。一般操作では私もよく使っています。
説明不足ですみませんでした。らいでんさんが疑念をもたれるのももっともなことです。
要は、ある文字群リストがありまして、それに対して一括で着色するなどの用途に使いたいのと、欲張ってユーザーに色を指定させてあげたいという希望がございまして、今回ユーザーフォーム上の設定でデータを取得できればいいと思ったのです。
我侭といわれればそれまでですが、これはあくまで私の考えによるものです。
今のところVBAではどうもこの辺り難しそうなので、フルカラー指定はあきらめ「赤、青、、、、」というような文字に指定で済ませてしまおうかとも思っているところです。

>VBでしたら、コモンダイアログコントロールというのがありますが、、。

そうでしたか、残念ながらVBはもっていませんので、
hideさんご紹介のAPIも手ごわそうですが、トライしてみることにします。
いろいろアドバイスありがとうございました。
・ツリー全体表示

【49】Re:ユーザーフォームにカラーパレットを
回答  hide  - 03/5/21(水) 9:07 -

引用なし
パスワード
   ▼WhiteRabbit さん:
>こんにちは。お世話になっています。
>立て続けですみませんが、ユーザーフォームからカラーパレットを表示させるにはどうすればいいでしょうか?
>そこで選択されたカラーを取得してWord文書内の文字列に反映したりしたいと思っています。
>カラーパレットでなくてもコンボボックスの各項目に彩色するのでもいいのですが、ご存知の方がいましたらよえろしくお願いします。

APIでよければ下記サイトが参考になるかもしれません
http://homepage1.nifty.com/MADIA/vb/API/CHOOSECOLOR.htm
・ツリー全体表示

【48】Re:ユーザーフォームにカラーパレットを
回答  らいでん  - 03/5/21(水) 1:21 -

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

私はプログラマではなく実務家でして、その立場で勝手なことを申すのですが
どうして手間隙をかけ処理速度を落としてまでVBAで処理されるのか
とても不思議な感じです。
きっとWhiteRabbitさんはプログラマさんなのでしょうね(*^^*)

大変失礼ながら何回も念を押しますが、ツールバーでなくパレット自体の
浮動表示なのですが、、、伝わっていますでしょうか?
ドキュメント上にフォントと塗りつぶしのパレットをドラック&ドロップで
移動させれば、常にパレットを表示したまま文書編集できますので
それでご要求は満たされると思うのですが、、、?
ユーザーフォームをモードレス表示させるよりもずっとお手軽だと
私は考えたのですが・・・。

どうしてもVBAでの処理と言うことでしたら・・・
私はVBAでパレット機能を持つコントロールがあるのかどうか知りません。
VBでしたら、コモンダイアログコントロールというのがありますが、、。

結局ColorIndex値やRGB値で色を指定する事になるかも?
何でもパレットウィンドウ上にマウスカーソルを乗せると、ColorIndex値や
RGB値を取得できるというアドインソフトがあるらしいですよ。

ちょっとこのあたり不明確な所が多いので、私は勝手ながらこの辺で
失礼させてもらえますか?
・ツリー全体表示

【47】Re:Wordのウィンドウを整列させる
回答  H. C. Shinopy  - 03/5/20(火) 16:47 -

引用なし
パスワード
   Word文書ウィンドウの全部を整列しない件
すみません。当方の試行不足です。

こちらの環境はWinXP・Word2002ですが、
3つの文書で、その内、1つを先に最小化した状態で当マクロを実行すると、
2つだけ整列して、残り1つは最小化のままという
お尋ねの現象が起きるのを確認しました。

「wdWindowStateNormal」(元の大きさに戻る)を
「wdWindowStateMaximize」(最大化する)に変更して下さい。
ここが問題であったと思います。

それから「Windows.Arrange」(上下に並べて表示)は、削除して下さい。
いろいろやってるなかで、入れてしまいました。
左右に表示する場合は、必要ありません。
従って、以下の通り。

Sub WinWordArrange()
 ' 参照設定 Microsoft Shell Controls And Automation
 Dim myShell As Shell32.Shell
 Dim windowLoop As Window
 '
 Set myShell = CreateObject("Shell.Application")
 myShell.MinimizeAll
 '
 For Each windowLoop In Windows
  With windowLoop
   .Activate
   .WindowState = wdWindowStateMaximize
  End With
 Next windowLoop
 '
 myShell.TileVertically ' 左右に並べて表示
 '
 Set myShell = Nothing
End Sub
・ツリー全体表示

【46】Re:Wordのウィンドウを整列させる
質問  WhiteRabbit  - 03/5/20(火) 14:00 -

引用なし
パスワード
   こんにちは。返信ありがとうございます。
サンプルコードを試してみましたが、タスクバー内に最小化されたままとなってしまいます。
こちらで試したのは「文書1」「文書2」「文書3」といった文書をファイルを開いた状態で実行してみました。この場合上に書いたようになります。

これが「文書1」から「新しいウィンドウ」で派生した複数のウィンドウだけがある場合は、整列動作らしい動きをしているのですが、結果的には完全な整列でなく中途半端になっています。(ウィンドウが4つあっても2つしか整列しない等)

どこを直せばいいでしょうか?

▼H. C. Shinopy さん:

>Wordだけで「上下に並べて表示」ということであれば、
>次のマクロで整列できます。
>(メニューバーの[ウィンドウ]-[並べて表示]に該当します。)
>
>Sub WinWordArrange()
> Window.Arrange
>End Sub
>
>
>Wordでは、なぜかそのままでは「左右に並べて表示」ができないようです。
>一旦、すべてのウィンドウを閉じた上で、
>Wordのウィンドウをアクティブにして、
>「左右に並べて表示」処理をしたらどうでしょうか。
>
>Sub WinWordArrange()
> ' 参照設定 Microsoft Shell Controls And Automation
> Dim myShell As Shell32.Shell
> Dim windowLoop As Window
> '
> Set myShell = CreateObject("Shell.Application")
> myShell.MinimizeAll
> '
> For Each windowLoop In Windows
>  With windowLoop
>   .Activate
>   .WindowState = wdWindowStateNormal
>  End With
> Next windowLoop
> '
> myShell.TileVertically ' 左右に並べて表示
> '
> Set myShell = Nothing
>End Sub
・ツリー全体表示

【45】Re:ユーザーフォームにカラーパレットを
質問  WhiteRabbit  - 03/5/20(火) 13:53 -

引用なし
パスワード
   こんにちは。返信ありがとうございます。

▼らいでん さん:
>ユーザーフォームというわけではないのですが、[書式設定]ツールバーの[フォントの色]
>のカラーパレットが浮動表示出来るのはご存知でしょうか?

存じています。
できればこのカラーパレットをユーザーフォームのボタン操作により表示させ、設定されたカラーコードを取得できるといいのですが、無理でしょうか?
カラーコードを取得後、その用途は文字の色装飾に限定するものではありません。例えばオートシェイプの線色とか塗りつぶしなどです。
・ツリー全体表示

【44】Re:Wordのウィンドウを整列させる
回答  H. C. Shinopy  - 03/5/20(火) 9:29 -

引用なし
パスワード
   Wordだけで「上下に並べて表示」ということであれば、
次のマクロで整列できます。
(メニューバーの[ウィンドウ]-[並べて表示]に該当します。)

Sub WinWordArrange()
 Window.Arrange
End Sub


Wordでは、なぜかそのままでは「左右に並べて表示」ができないようです。
一旦、すべてのウィンドウを閉じた上で、
Wordのウィンドウをアクティブにして、
「左右に並べて表示」処理をしたらどうでしょうか。

Sub WinWordArrange()
 ' 参照設定 Microsoft Shell Controls And Automation
 Dim myShell As Shell32.Shell
 Dim windowLoop As Window
 '
 Set myShell = CreateObject("Shell.Application")
 myShell.MinimizeAll
 '
 For Each windowLoop In Windows
  With windowLoop
   .Activate
   .WindowState = wdWindowStateNormal
  End With
 Next windowLoop
 '
 myShell.TileVertically ' 左右に並べて表示
 '
 Set myShell = Nothing
End Sub
・ツリー全体表示

【43】Re:ユーザーフォームにカラーパレットを
回答  らいでん  - 03/5/19(月) 23:44 -

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

ユーザーフォームというわけではないのですが、[書式設定]ツールバーの[フォントの色]
のカラーパレットが浮動表示出来るのはご存知でしょうか?

>そこで選択されたカラーを取得してWord文書内の文字列に反映したりしたいと思って
>います。

そちらの事情を把握していないので失礼かもしれませんが、この要求を満たすだけでしたら
ユーザーフォームを利用される必然性に乏しいと感じました。
・ツリー全体表示

【42】ユーザーフォームにカラーパレットを
質問  WhiteRabbit  - 03/5/19(月) 15:01 -

引用なし
パスワード
   こんにちは。お世話になっています。
立て続けですみませんが、ユーザーフォームからカラーパレットを表示させるにはどうすればいいでしょうか?
そこで選択されたカラーを取得してWord文書内の文字列に反映したりしたいと思っています。
カラーパレットでなくてもコンボボックスの各項目に彩色するのでもいいのですが、ご存知の方がいましたらよえろしくお願いします。
・ツリー全体表示

【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で大きな仕様変更はない模様です。

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

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

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