Word VBA質問箱 IV

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

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


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

【665】タグを削除して、改行させるには
質問  ぶんた  - 10/1/3(日) 21:17 -

引用なし
パスワード
   はじめまして。ワードマクロ初心者です。
websiteのソースコードから、欲しい文章をコピペしたのですが、
HTMLのタグ(<BR>のようなもの)が入っているし、改行がされて
いないため、読みづらい状態です。
これらのタグを一つ一つ削除して改行していては日が暮れるので、
マクロでやってみたいのですが、ご指導お願いします。
マクロの勉強のため、できればワードの置換を使わずにマクロを
お教えいただければありがたいです。
よろしくお願いします。
・ツリー全体表示

【664】Re:ExcelとWordの連携でキーワードの頻出度...
回答  りる  - 10/1/3(日) 21:04 -

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

>まず、Wordに文章
>   Excelに列A:番号
>         列B:キーワード
>         列C:出現回数
>があります。

>Wordの文章の単語が Excelのキーワードに
>該当すれば、Word文章中のその単語に識別のために
>何らかの書式設定(例えば、アンダーライン)を施し、
>かつ、Excelの列Cに頻出回数を累積してカウント
>する。

上記エクセルファイルの名前がLIST1.xls、リストのあるシートがSheet1、リストは1行目が見出しでこんなレイアウト。
 A    B     C
1    キー    カウント
2 1 Word
3 2 Excel
4 3 文章

ワード文書は質問投稿文をそのまま貼り付けてテストしました。

マクロはワードVBEに全部記述します。
Sub Main()
  Dim xlApp As Object, obj As Object, rr As Long, s1 As String
  'Excelの処理
  'ヘルプのCreateObjectからほぼそのまま転載
  Set xlApp = CreateObject("excel.application")
  'フォルダはdocファイルと同じところから開く。 ファイル名は LIST1.xls
  Set obj = xlApp.Workbooks.Open(ThisDocument.Path & "\LIST1.xls")
  rr = 1
  Do
   'B列
   rr = rr + 1
   s1 = obj.Worksheets("Sheet1").Cells(rr, 2).Value
   If s1 = "" Then Exit Do 'カラになったら終わる
   '結果はC列に入れる
   obj.Worksheets("Sheet1").Cells(rr, 3).Value = S1NN(s1)
  Loop
  'エクセルは終了せずに置いておく(そのままマクロは終了)
  xlApp.Visible = True
  Set obj = Nothing
  Set xlApp = Nothing  ' オブジェクトの参照を解放します。
End Sub
'////////////////////Wordの処理
Function S1NN(s1 As String) As Long
  '出現数をカウントするマクロ
  Dim tf As Boolean
  Dim NN As Long
  '文書の先頭に移動
  ActiveDocument.Range(Start:=0, End:=0).Select
  '検索条件設定→開始
  With Selection.Find
   .ClearFormatting
   .Text = s1
   .Replacement.Text = ""
   .Format = False
   .MatchCase = False
   .MatchWholeWord = False
   .MatchByte = False
   .MatchAllWordForms = False
   .MatchSoundsLike = False
   .MatchWildcards = False
   .MatchFuzzy = True
   NN = 0 '検索を繰り返す
   Do
     tf = .Execute(Forward:=True)
     If Not tf = True Then Exit Do
     Selection.Range.HighlightColorIndex = wdYellow 'マーカーは黄色
     NN = NN + 1
   Loop
  End With
  '出現回数
  S1NN = NN
End Function

エクセルファイルが開いたままだと上書きできなくなります(読み取り専用)。
・ツリー全体表示

【663】ExcelとWordの連携でキーワードの頻出度を...
質問  weipuzhenfu  - 09/12/30(水) 18:49 -

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

まず、Wordに文章
   Excelに列A:番号
         列B:キーワード
         列C:出現回数
があります。

Wordの文章の単語が Excelのキーワードに
該当すれば、Word文章中のその単語に識別のために
何らかの書式設定(例えば、アンダーライン)を施し、
かつ、Excelの列Cに頻出回数を累積してカウント
する。

このような操作をVBAでできれば、文章中の重要度
の高いキーワードが半ば自動的に見つけられる。
しかも、摘出されていないキーワードの識別も容易に
なり、手動補正もできる。

上記のようなことにチャレンジしたいと思っていますが
可能性を含めて全く検討が付きません。

サジェスチョンをいただければ幸いです。

以上
・ツリー全体表示

【661】自動文章作成
質問  HIRO  - 09/12/10(木) 17:28 -

引用なし
パスワード
   教えていただきたく投稿いたしました。
環境はWinXP Word2000です。

Accessで作成したCSVファイルを読み込み、
文章を自動作成したいと考えてます。

フォームは下記のような感じです。
┌──────────────┐
│┌─────┐       │
││     │←(テキストボックス) │
││     │       │
││     │       │
│└─────┘      こ│←段組みしています。
│             こ│
│             か│
│             ら│
│             縦│
│             書│
│             き│
└──────────────┘
(テキストボックスと縦書き部分は段組みしています)


CSVファイルの内容
郵便番号、住所、氏名、文章
(項目名はデータに入れません)

郵便番号、住所、氏名はテキストボックス内に入力して、
文面は縦書きの部分に入力し、改ページをさせたいです。

例)
データ内容
111-1111 東京都○○ 山本太郎 元気ですか!
222-1111 東京都△△ 山下花子 久しぶり!

┌──────────────┐
│┌─────┐       │
││111-1111 │       │
││東京都○○│       │
││山本太郎 │       │
│└─────┘      元│
│             気│
│             で│
│             す│
│             か│
│             !│
│              │
└──────────────┘
改ページ

┌──────────────┐
│┌─────┐       │
││222-1111 │       │
││東京都△△│       │
││山下花子 │       │
│└─────┘      久│
│             し│
│             ぶ│
│             り│
│             !│
│              │
│              │
└──────────────┘

と動作させたいのです。


Selection.TypeText Text:="元気ですか!"

ActiveDocument.Shapes("テキストボックス").Select
Selection.TypeText Text:="111-1111"
Selection.TypeParagraph
Selection.TypeText Text:="東京都○○"
Selection.TypeParagraph
Selection.TypeText Text:="山本太郎"
などの処理は解るのですが、データを読み込み、
1件読み込んだら改ページして次の1件…、の
部分がさっぱり・・・。

よろしければヒントをいただきたいと思います。
よろしくお願いします。
・ツリー全体表示

【657】ページ全体の移動
質問  Weipu Zhenfu  - 09/10/18(日) 20:37 -

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

下記の件でお尋ねします。


特定ページの先頭位置あるいは先頭文字
      最後位置あるいは最後文字  の取得

あるいは特定ページのページ番号の 取得

は可能でしょうか。


さらにおそらくは上記を情報を用いることになると

思いますが、あるページのページ全体を他のページ

へ移動させることが可能でしょうか。


換言すれば、WORD VBAで EXCEL VBA

のようにページ管理が可能でしょうか。
・ツリー全体表示

【656】Re:文の最後はどのようにして見つけるの?
お礼  やっちゃん E-MAIL  - 09/10/18(日) 5:33 -

引用なし
パスワード
   りる様 返事が遅れまして申し訳ありません。
回答がなかなかつかなかったので、少しあきらめて何か別の方法を検討していました。本来ワードのVBAには能力が無いので良い方法は見つからないのですが。
 さて、提案いただいた方法でプログラムを改善したいと思っています。
でも残念ながら、提案いただいたプログラムの解析・意味を理解することが先決のような状態です。わからないことがありましたら、再度質問させてください。
 先ずはお礼まで。本当にありがとうございました。
・ツリー全体表示

【655】Re:AutoExit内でCommandbar制御がしたい
回答  りる  - 09/10/17(土) 10:26 -

引用なし
パスワード
   めそ さん、おはようございます。

>AutoCloseでは上記の問題があるため、可能であれば
>AutoExit内で制御できる事が望ましいのですが、どうぞご教示をお願いいたします。
AutoExitというイベントは聞いたことがないので、AutoClose内で保存が必要かどうかをチェックしてみてはいかがでしょうか。


  With ThisDocument
   '未保存かどうかチェックします
   If .Saved = False Then
     If MsgBox("保存しますか?", vbYesNo) = vbYes Then
      .Save '上書きします
     Else
      .Saved = True '上書きしないので保存したことにします
     End If
   End If
  End With
  '保存処理が終わったので以下Close時に必要な処理を書きます
  MsgBox "Close", vbInformation

End Sub

単独でdocを開いていることを前提にしていますので、複数docを開いて、
docのcloseではなくWordをQuitする可能性があるのならば、
全部のブックに対して保存しているかどうかをチェックする必要があります。
・ツリー全体表示

【654】AutoExit内でCommandbar制御がしたい
質問  めそ  - 09/10/16(金) 16:41 -

引用なし
パスワード
   はじめまして。
お分かりの方がいらっしゃいましたらご教示をお願いいたします。

文書をテンプレート化する為、AutoOpenにおいてCommandbarの
表示制御を行っています。

1.現在表示中の全てのCommandbarをVisible=Falseとする。
2.ユーザー独自のCommandbarをVisible=Trueにする。

ただしこの状態で文書を終了してしまうと、
次の別のWord文書を開いた際に、Commandbarが全て非表示の状態になってしまいます。

その為、1の前に一旦Commandbarの情報を退避(ファイルまたはバッファに保持)し、
AutoCloseまたはAutoExitにて戻すVBAを組みました。(以下、参考)

+---------------------------------------------------+
Sub AutoOpen()

  On Error Resume Next

  ' Commandbar情報をグローバル変数にバックアップ
  Dim i As Integer
  For i = 1 To ThisDocument.CommandBars.Count
    ReDim Preserve pub_Cmdbar(i - 1)
    pub_Cmdbar(i - 1) = ThisDocument.CommandBars(i).Visible
  Next i

End Sub
-----------------------------------------------------
Sub AutoClose()

  On Error Resume Next

  ' ツールバーを起動前の表示設定情報に戻す
  Dim i As Integer
  For i = 1 To CommandBars.Count
    ThisDocument.CommandBars(i).Visible = pub_Cmdbar(i - 1)
  Next i

End Sub
+---------------------------------------------------+

この方法だと上手くいくのですが、
文書に変更があった場合、AutoCloseだと保存確認メッセージが
表示され、その前に上記が実行されてしまうため、
メッセージをキャンセルすると、Commandbarがそのまま復元されてしまいます。
この状態は本来用途からすると望ましくありません。

そこでAutoCloseからAutoExitに変更をしてみましたが、
AutoExitでは上手く動作しません。(Commandbarが復元されない)

AutoCloseでは上記の問題があるため、可能であれば
AutoExit内で制御できる事が望ましいのですが、どうぞご教示をお願いいたします。
・ツリー全体表示

【653】Re:文の最後はどのようにして見つけるの?
発言  りる  - 09/10/11(日) 17:51 -

引用なし
パスワード
   追加。

>単ページ限定

>   Set objR = .Panes(1).Pages(1).Rectangles.Item(1)
Pagesの引数(ページ番号)を最終ページにしたら複数ページにも対応できるはずです。
・ツリー全体表示

【652】Re:文の最後はどのようにして見つけるの?
発言  りる  - 09/10/11(日) 16:16 -

引用なし
パスワード
   やっちゃん さん、こんにちわ。

>ワードのマクロは経験があまりなく、エクセル感覚で作成していますのでわかりにくいかもしれませんが。
文の最後はDocumentのEndで取得できますが、エクセル感覚で行くならLinesを使用したほうが感覚的につかみやすいかと思い、印刷ビュー(と単ページ限定)ですが、試してみました。

Sub Test()
  Dim tp, objR As Rectangle, LL As Long, Lmax As Long
  '表示→印刷レイアウト
  With Application.ActiveWindow
   tp = .View.Type '元のビュー
   If tp <> wdPrintView Then .View.Type = wdPrintView
   Set objR = .Panes(1).Pages(1).Rectangles.Item(1)
  End With
  '
  Lmax = objR.Lines.Count
  '下からループして、改行コードではないところを探す
  For LL = Lmax To 1 Step -1
   With objR.Lines.Item(LL).Range
     If Len(.Text) > 1 Then '改行のみの行以外を探す
      .Select '行選択
      Selection.Collapse Direction:=wdCollapseStart '選択解除
      Exit For
     End If
   End With
  Next
  '戻す
  With Application.ActiveWindow
   If tp <> .View.Type Then .View.Type = tp '元のビュー
  End With
End Sub
・ツリー全体表示

【651】文の最後はどのようにして見つけるの?
質問  やっちゃん E-MAIL  - 09/10/2(金) 14:49 -

引用なし
パスワード
   一塊の文(中には空白行{改行だけの行}も含む)があって、其の先頭行に
カーソルを合わせておき、マクロでカーソルを下げてきて、空白行が5つ続けば、
そこで其のデータの文の最後であると判断し、カーソルを元の位置まで戻させる、
させるマクロで作ろうとしました。以下のように作りましたら、空白行が5つある
ときはうまくいくのですが、一塊の文によっては5つも空白がなく、それ以降になんら文も改行もない場合、うまく作動しません。どのようにしたら良いのかお教えください。
ワードのマクロは経験があまりなく、エクセル感覚で作成していますのでわかりにくいかもしれませんが。

 Selection.HomeKey ' Cursorを行頭へ
 Br = 0 ' ブランクの数
 Cr = 0 ' 先頭よりの行数
1 A = Selection.Text
 If Asc(A) = 13 Then ' 空白行か?
  Br = Br + 1
  If Br >= 5 Then ' 改行の数が5ならDataの最終とみなす
   GoTo 2
  End If
 Else
  Br = 0
  Dr = Cr ' 最終の文字のある行の先頭からの行数
 End If
 Selection.MoveDown Unit:=wdLine, Count:=1
 Selection.HomeKey ' Cursorを行頭へ
 Cr = Cr + 1
 GoTo 1
2 Selection.MoveUp Unit:=wdLine, Count:=Cr 'cursorをCr分上に移動
                     (元の位置にカーソルを戻す)

データ例
sdfkjf;d;kじゃs
dkkdkdkdk
(CR)
dskふぁdskf
dkだs       ------ここまでが必要なデータ
(CR) 
(CR)
(CR)
(CR)
(CR)         ------(CR)が5つあれば処理は出来るが3なら
               うまくいかない
・ツリー全体表示

【650】Re:コンボボックスのRowSourceの利用
お礼  hikka  - 09/9/4(金) 0:09 -

引用なし
パスワード
   りるさん こんにちわ
回答goodです。
理想どおりとなりました。
いろいろ応用できそうです。
ありがとうございました☆
・ツリー全体表示

【649】Re:WORDマクロの解説本 追加情報
回答  H. C. Shinopy  - 09/8/26(水) 21:59 -

引用なし
パスワード
   「Word スキルアップコレクション Word Skill Up Collection」
著者:坪崎 誠司
出版社:プレスティージ(Prestige)
発売日:2009年8月24日
定価:1890円

目次から
41 Word でVBA マクロを使う
42 Word VBA を使って、ドキュメント中の選択した文字列を調べる、処理する
43 Word VBA を使って、ドキュメント中の選択した数字の合計を計算させる
44 Word VBA を使って、ドキュメント中の括弧対応を調べる
45 Word VBA を使って、「ファイル選択ダイアログ」を起動する
46 Word VBA を使って、複数ファイルの各ページ数を調べる
47 Word VBA を使って、複数ファイルの個人情報を削除する
48 Word VBA を使って、Word の右クリックメニューに自作マクロを追加する
49 Word VBA を使って、Word の右クリックメニューにサブメニューを作成する
50 Word を起動すると同時にマクロを実行する
・ツリー全体表示

【648】Re:IF関数のつかいかたを教えてください。
発言  りる  - 09/8/23(日) 19:09 -

引用なし
パスワード
   VBAはじめました さん、こんばんは。
長く放置されているので、エラーの原因だけでも。

>テキストフォームフィールドText1, Text2, Text3があり,Text3の種類が計算式となってます。
>Text1, Text2(両方とも種類が数値)に値があったときのみ計算をさせたくて,例えば
>=IF(Text1="", "", Text1 * Text2)
>としましたが,!構文エラー” の表示になってしまいます。
「Text1は数値である」と設定されているので、""は数値でないためにエラーになります。
お望みの回答でなくてすみません。
・ツリー全体表示

【647】IF関数のつかいかたを教えてください。
質問  VBAはじめました  - 09/8/3(月) 12:22 -

引用なし
パスワード
   テキストフォームフィールドText1, Text2, Text3があり,Text3の種類が計算式となってます。
Text1, Text2(両方とも種類が数値)に値があったときのみ計算をさせたくて,例えば
=IF(Text1="", "", Text1 * Text2)
としましたが,!構文エラー” の表示になってしまいます。
Text1=""の条件分の指定の仕方が悪いようなのですが, そもそも,フィールドに値があるか否かの判断はどのようにさせたらよいでしょうか?
よろしくお願いします。
・ツリー全体表示

【646】Re:LAN内で誰かがファイルを開いていたら開...
回答  りる  - 09/7/25(土) 17:30 -

引用なし
パスワード
   れおパパ さん、こんにちは。

>ワードファイルにパスワードを設定するプログラムを作成中ですが
>誰かがLAN内で同じファイルを開くときに、「使用中のファイル」のメッセージがでますが、このメッセージがでたときはファイルを開かせないか、一度読み取りで開くなりメッセージを出さないようにすることはできるのでしょうか?
サポートにある、ファイルが使用中かどうかをチェックする簡単な関数のサンプルコードです。
htt p://support.microsoft.com/kb/209189/ja
かなりあやしい日本語ですが(笑)、メッセージボックスを表示する部分を除いてほぼそのまま転載してあります。

パスワードを設定しようとしているならば、開かないほうがよさそうですよね。
Sub Test()
  Dim Ifile As String
 
  Ifile = "d:\TEST\TEST.doc"
  '
  If FileLocked(Ifile) = True Then
   Debug.Print "×", Ifile, Time
  Else
   '正常な処理
   Debug.Print "○", Ifile, Now
   Application.Documents.Open Ifile
  End If
End Sub
'//////////////////////////////////////////////////
Function FileLocked(strFileName As String) As Boolean
  On Error Resume Next
  ' If the file is already opened by another process,
  ' and the specified type of access is not allowed,
  ' the Open operation fails and an error occurs.
  Open strFileName For Binary Access Read Write Lock Read Write As #1
  Close #1
  ' If an error occurs, the document is currently open.
  If Err.Number <> 0 Then
   FileLocked = True
   Err.Clear
  End If
End Function

Debug.Printでイミディエイトウィンドウに処理結果を記録しています。
・ツリー全体表示

【645】LAN内で誰かがファイルを開いていたら開か...
質問  れおパパ  - 09/7/23(木) 22:47 -

引用なし
パスワード
   ワードファイルにパスワードを設定するプログラムを作成中ですが
誰かがLAN内で同じファイルを開くときに、「使用中のファイル」のメッセージがでますが、このメッセージがでたときはファイルを開かせないか、一度読み取りで開くなりメッセージを出さないようにすることはできるのでしょうか?
・ツリー全体表示

【644】Re:コンボボックスのRowSourceの利用
回答  りる  - 09/7/20(月) 12:15 -

引用なし
パスワード
   hikka さん、こんにちわ。
もう解決済みかもしれませんが、
>  RowSource
>をexcelファイルを呼び出してから処理なんてできるのでしょうか?
こっちだけ。

Private Sub UserForm_Initialize()
  If ComboBox1.ListCount = 0 Then
   Dim xlApp As Object, obj As Object, Ldat As Variant
   'ヘルプのCreateObjectからほぼそのまま転載
   Set xlApp = CreateObject("excel.application")
   'フォルダはdocファイルと同じ。
   Set obj = xlApp.Workbooks.Open(ThisDocument.Path & "\book1.xls")
   '取り込む範囲はSheet1のB2:B6
   Ldat = obj.Worksheets("Sheet1").Range("B2:B6").Value
   'エクセルを終了させる処理
   xlApp.DisplayAlerts = False
   obj.Close
   Set obj = Nothing
   xlApp.DisplayAlerts = True
   xlApp.Quit  ' 処理終了後、Quit メソッドでアプリケーションを終了し、
   Set xlApp = Nothing  ' オブジェクトの参照を解放します。
   '
   '読み込んだ値をリストにセット
   ComboBox1.List = Ldat
  End If
End Sub
エクセル表から読み込むならばCreateObjectで取得してみてはいかがでしょうか。
・ツリー全体表示

【643】コンボボックスのRowSourceの利用
質問  hikka  - 09/6/24(水) 20:52 -

引用なし
パスワード
   こんにちわ。
コンボボックス表示の値について質問です。
excel vba では、
Option Explicit
 Private Sub UserForm_Initialize()
 Me.ComboBox1.RowSource = "Sheet1!b1:b5"
End Sub
で値を選択できますが、ワード文章内で同様なことができるのでしょうか?

もしくは
  RowSource
をexcelファイルを呼び出してから処理なんてできるのでしょうか?
よろしくお願いします。
・ツリー全体表示

【642】Re:ダブルクリックでuserformを表示
お礼  hikka  - 09/6/22(月) 22:14 -

引用なし
パスワード
   りるさん。こんにちわ。
返答ありがとうございます。
なかなかうまくいかずでした。

原因は再インストールしたあとの
ツールーマクローセキュリティーのレベルが高
のままでした。

内容はばっちりOKです。

目標はユーザーホームにいわゆる「はんこ」
並べてクリックで押していくものがタスクでした。
良いものできるようがんばりますね。
ありがとうございました。
・ツリー全体表示

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