Word VBA質問箱 IV

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

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


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

【737】Word VBA 条件が一致したら、表の指定した...
質問  しゅん  - 13/4/17(水) 14:29 -

引用なし
パスワード
   一つのドキュメントに複数の表があります。
その中の一つの表を探し、その表の指定したセルの文字サイズを10.5から9.5に変更したいのです。
その表は、1列1行目のセルには決まった文字列”○○○”が入っています。
ドキュメント中の全ての表を検索し条件に一致した場合に文字サイズの変更をするように書いてみましたが、うまくいきません。

Sub 文字サイズ変更()
  Dim myTable As Table
  For Each myTable In ActiveDocument.Tables
    If myTable.Cell(Row:=1, Column:=1).Range.Text = "○○○" Then
      With myTable.Cell(Row:=2, Column:=6).Range
        .Font.Size = 9.5
      End With
    End If
  Next
End Sub

マクロ初心者です。
どうかよろしくご教授をお願いします。
・ツリー全体表示

【736】段落について
質問  ひかる  - 13/4/14(日) 17:22 -

引用なし
パスワード
   はじめて質問させていただきます。

word2003を使っています。

以前別の方が質問されていたものを使わせていただき、
段落の頭に連番を挿入し,連番の後に続いている文章に
インデントをかけて体裁を整えるマクロ(下記「現在
マクロ」)を使用しています。
マクロを実行するときれいに文章が揃うのですが、
さらに変更を加えて、以下の(実行前)、(実行後)のように
文頭に「●」の文字がついている文章については、
全体を2文字分ほど前に出し、
文頭に「■」の文字がついている文章については、
連番を付さない。
というようにしたいのですが、うまくいきません。
どなたかご教示いただければと思います。
説明下手でうまくお伝えすることができていない
かもしれませんが、どうぞよろしくお願いいたし
ます。

--------------------------
(実行前)                

最近は、体調が非常にいいで
す。                 
●どのように健康管理をされて
いるのですか。
■塩分や糖分の取りすぎには気
をつけています。
長生きには日々の健康管理が
一番大事だと思います。  

(実行後)                

1   最近は、体調が非常にいいで
    す。                 
2 どのように健康管理をされている
  のですか。
    塩分や糖分の取りすぎには気
    をつけています。
3   長生きには日々の健康管理が
    一番大事だと思います。                 

--------------------------

(現在マクロ)
Sub Macro4()
'
'
  With ListGalleries(wdNumberGallery).ListTemplates(1).ListLevels(1)
    .NumberFormat = "%1"
    .TrailingCharacter = wdTrailingTab
    .NumberStyle = wdListNumberStyleArabic
    .NumberPosition = MillimetersToPoints(6.6)
    .Alignment = wdListLevelAlignRight
    .TextPosition = MillimetersToPoints(22)
    .TabPosition = MillimetersToPoints(22)
    .ResetOnHigher = 0
    .StartAt = 1
    With .Font
      .Bold = wdUndefined
      .Italic = wdUndefined
      .StrikeThrough = wdUndefined
      .Subscript = wdUndefined
      .Superscript = wdUndefined
      .Shadow = wdUndefined
      .Outline = wdUndefined
      .Emboss = wdUndefined
      .Engrave = wdUndefined
      .AllCaps = wdUndefined
      .Hidden = wdUndefined
      .Underline = wdUndefined
      .Color = wdUndefined
      .Size = wdUndefined
      .Animation = wdUndefined
      .DoubleStrikeThrough = wdUndefined
      .Name = ""
    End With
    .LinkedStyle = ""
  End With
  ListGalleries(wdNumberGallery).ListTemplates(1).Name = ""
  Selection.Range.ListFormat.ApplyListTemplate ListTemplate:=ListGalleries( _
    wdNumberGallery).ListTemplates(1), ContinuePreviousList:=False, ApplyTo:= _
    wdListApplyToWholeList, DefaultListBehavior:=wdWord10ListBehavior

End Sub
・ツリー全体表示

【735】Re:ワードマクロ 列3に【第(*)話】がある...
お礼  みぃ  - 12/9/19(水) 0:37 -

引用なし
パスワード
   アドバイスありがとうございます。
リファレンスを参照して
自分なりに注釈をつけて、どういうふうになるのか
動かしてみました。

Debug.Print str の部分は
小さなウインドウを表示して
そこに、変数strが表示される・・と思ったのですが
表示されず、動作の是非の判断がつかないず

そこで

ActiveDocument.Tables(1).Cell(1, 6).Range.InsertBefore str
に変更したところ
列3に【第1話】⇒列6のセルの文字列の文頭に1が挿入されました。

ありがとうございます。
後は、複数の表の行の列にて、動作するように頑張ってみます。


Public Sub 表の列3に連番がある場合、列6に連番を入れる3()

'参照メモ
'Replace(expression, find, replace[, start[, count[, compare]]])
'置換する文字列を含む文字列式 検索する文字列 置換する文字列


  Dim rng As Range
  Dim str As String
 
  With ActiveDocument.Tables(1)
    Set rng = .Cell(1, 3).Range
    If rng.Text Like "*【第*話】*" Then
     With rng.Find
        .ClearFormatting     '何かを初期化している?
        .Text = "第*話"      '検索する文字列
        .Replacement.Text = ""  '置換後の文字列
        .Forward = True      '書式
        .MatchPhrase = False   '大文字と小文字の区別する
        .MatchSoundsLike = False 'あいまい検索(英)
        .MatchAllWordForms = False '英単語の異なる活用形を検索する
        .MatchFuzzy = False    'あいまい検索(日)
        .MatchWildcards = True   'ワイルドカードを使用する
        .Execute          '指定した条件で検索開始?
        If .Found Then       '検索条件が一致した場合?
          str = Replace(rng.Text, "第", "") '文字列「第」削除
          str = Replace(str, "話", "")   '文字列「話」削除
          ActiveDocument.Tables(1).Cell(1, 6).Range.InsertBefore str
          'Debug.Print str '変数の値をイミディエイト ウィンドウに表示
        End If
      End With
    End If
  End With
End Sub
・ツリー全体表示

【734】Re:ワードマクロ 列3に【第(*)話】がある...
回答  774  - 12/9/18(火) 13:01 -

引用なし
パスワード
   色々方法はあるけど、たとえばFindを使うとか。

Public Sub Macro1()
  Dim rng As Range
  Dim str As String
  
  With ActiveDocument.Tables(1)
    Set rng = .Cell(1, 3).Range
    If rng.Text Like "*【第*話】*" Then
      With rng.Find
        .ClearFormatting
        .Text = "第*話"
        .Replacement.Text = ""
        .Forward = True
        .MatchPhrase = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .MatchFuzzy = False
        .MatchWildcards = True
        .Execute
        If .Found Then
          str = Replace(rng.Text, "第", "")
          str = Replace(str, "話", "")
          Debug.Print str
        End If
      End With
    End If
  End With
End Sub

あと、いきなりループで処理するコード走らせるよりは、まずは適当なセルを対象に文字列を上手く処理できるか確認した方がいいと思う。
上のコードみたいに。
・ツリー全体表示

【733】ワードマクロ 列3に【第(*)話】がある場合...
質問  みぃ  - 12/9/16(日) 16:45 -

引用なし
パスワード
   お世話になっております。
以前アドバイスをいただき、大変助かりました。
よろしくお願いします。

ワード2010
一つのドキュメントに複数の表(行数は不特定、列は基本7列)

列3に【第1話】とか、【第12話】とか、の文字列が含まれる場合
列6に その【】内の数字のみ、挿入したかったのですが
数字を取り出す方法がわかりません。

下記マクロは途中まで書いたマクロで
列3に指定文字列が含まれていた場合・・までとなっています。

Sub 表の列3に連番がある場合、列6に連番を入れる()
'表の列3に【第(*)話】がある場合列6に【】内の数字を入れる4()
  Dim 表数 As Variant
  表数 = ActiveDocument.Tables.Count'ドキュメントに表がいくつあるか、カウント

  Dim i As Long
  Dim j As Long

For j = 1 To 表数

  With ActiveDocument.Tables(j)
    For i = 1 To .Rows.Count
     If .Columns.Count >= 6 Then
      If .Cell(i, 3).Range.Text Like "*【第*話】*" Then
        If Not .Cell(i, 6).Range.Text Like "*【第*話】*" Then
        .Cell(i, 6).Range.InsertBefore "【第*話】"
        End If
      End If
    
     Else: j = j + 1
    
     End If
    
    Next

  End With

Next

End Sub
・ツリー全体表示

【732】コンテンツコントロールの値をVBAで取得する
質問  soeda  - 12/9/15(土) 0:11 -

引用なし
パスワード
   はじめまして。VBA初心者です。
Word2007を使って以下のフォームを作成しています。

ActiveXのコンボボックス(Reason)から「傷病」を選択した時、2つの日付選択コンテンツコントロールをアクティブにし、日付を入力してもらいます。
入力してもらった2つの日付データを取得し、その期間が7日以下、8日以上、30日以上、60日以上の場合、それぞれ給付される金額をActiveXのTextBoxに表示させます。

コードは以下の通りです。

Private Sub Reason_Change()
Dim 開始日 As Date
Dim 終了日 As Date
Dim amt As Long

If Reason.Value = "災害 - Disaster" Then
ThisDocument.ContentControls.Item(1).LockContents = False
ThisDocument.ContentControls.Item(2).LockContents = False
ThisDocument.ContentControls.Item(1).Range.Font.Color = wdColorWhite
ThisDocument.ContentControls.Item(2).Range.Font.Color = wdColorWhite
ThisDocument.ContentControls.Item(1).LockContents = True
ThisDocument.ContentControls.Item(2).LockContents = True

amt = 50000

ElseIf Reason.Value = "傷病 - Illness" Then
ThisDocument.ContentControls.Item(1).LockContents = False
ThisDocument.ContentControls.Item(2).LockContents = False
ThisDocument.ContentControls.Item(1).Range.Font.Color = wdColorGray70
ThisDocument.ContentControls.Item(2).Range.Font.Color = wdColorGray70

開始日 = DateValue(ThisDocument.ContentControls.Item(1).Range.Text)
終了日 = DateValue(ThisDocument.ContentControls.Item(2).Range.Text)
  If DateDiff("d", 開始日, 終了日) >= 90 Then
  amt = 10000
  ElseIf DateDiff("d", 開始日, 終了日) >= 30 Then
  amt = 5000
  ElseIf DateDiff("d", 開始日, 終了日) >= 8 Then
  amt = 3000
  Else
  MsgBox "休業期間が基準を満たしていません"
  End If
End If
TextBox1.Value = amt
End Sub


様々な解説ページを参照しながらVBAを書いてみたのですが、エラーは出ないものの、問題が2点あります。

まず、1点目は、取得した2つの日付データの期間が正しく取得できていないのか、3ヶ月以上空いているにもかかわらず、「休業期間が基準を満たしていません」のメッセージが出ます(たとえば開始日9/14/12と終了日1/5/13の場合)。
正常に処理される場合もあります(たとえば開始日9/14/12と終了日1/31/13の場合)。
日付選択コンテンツコントロールの表示形式は"m/d/yy"ですが、これを"m/d/yyyy"に変えると正常に処理されるので、原因は表示形式にあるのではないかと考えられますが、なぜ"m/d/yy"ではデータを正しく取得できないのでしょうか?

2点目は、コンボボックスで「災害」を選んだ時には日付選択コンテンツコントロールを非表示にしたいため、font.color=wdcolorwhiteを設定しているのですが、これを設定するとコンボボックスで選択した値が、コンボボックスに正常に表示されなくなります。
白や灰色になったり、アクティブと非アクティブは切り替わっているので、値を選択したことになってはいるようですが、表示上はデフォルトの「選択してください」に戻ってしまいます。
これを解消するには、どうすれば良いでしょうか?

問題は以上の2点です。
どうかご教示いただきたく、お願いいたします。
・ツリー全体表示

【730】Re:ワードマクロ 条件一致の際、表の指定...
発言  みぃ  - 12/9/14(金) 9:18 -

引用なし
パスワード
   ありがとうございます。
助かります。

Cellの文字列の中に指定文字列があったら
といったところの記述方法は
こう書けばいいんですね

教えていただいたマクロをいじって
もう少し考えてみます。
・ツリー全体表示

【729】Re:ワードマクロ 条件一致の際、表の指定...
回答  774  - 12/9/13(木) 10:05 -

引用なし
パスワード
   単純にやるなら↓

Public Sub Macro1()
  Dim i As Long
  
  With ActiveDocument.Tables(1)
    For i = 1 To .Rows.Count
      If .Cell(i, 3).Range.Text Like "*abc*" Then
        .Cell(i, 6).Range.InsertAfter "def"
      End If
    Next
  End With
End Sub
・ツリー全体表示

【728】ワードマクロ 条件一致の際、表の指定セル...
質問  みぃ  - 12/9/11(火) 22:40 -

引用なし
パスワード
   ワードマクロで質問です。

ワードで、一つのドキュメントに行数は不確定 7列の表を複数作成しています。

3列目のセルに指定文字列が含まれていた場合、6列目のセルの末尾に
指定文字列を追加するマクロを作成するのが目的です。

リファレンスやネット等で調べて、どうにかこうにか
下記二つのマクロ候補を作成しましたが
これをどう、発展させれば、希望のマクロになるのか
詰まってしまいました。

アドバイス等、いただけないでしょうか。

Sub カーソル位置のセルの文字列の末尾に指定文字列を挿入()
  Dim myRange As Range
  Set myRange = Selection.Range
  With myRange
    .Expand Unit:=wdParagraph
    .InsertAfter "【二】"
  End With
  Set myRange = Nothing
End Sub


Sub 表の指定セルに指定文字を追加()
'1番目の表の1番目のセルに文字列を追加
    With ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range
      .InsertAfter Text:="セル 1,1"
    End With
End Sub
・ツリー全体表示

【727】Re:WORDマクロの解説本 追加情報
発言    - 12/8/9(木) 23:04 -

引用なし
パスワード
   Michael Halvorson , Chris Kinata 著
「Microsoft Word97・Visual Basicステップバイステップ」
アスキー 1997年9月発行 価格3,200円+税


マクロの記録から始まって、わずか300ページほどで
ファイルとフォルダの操作、VBEの操作、OLEオートメーションまで学習。
アプリケーションレベルのイベントもあり。

いまどきの解説本のような かんで含める親切な文体ではないが、内容は充実。
かなり古い本とはいえ、初級レベルをクリアしたひとには一読の価値があるかと。

・ツリー全体表示

【726】Re:相互参照のダイアログボックス
お礼  りんぐ  - 12/3/5(月) 15:45 -

引用なし
パスワード
   >はい↓。
>後は知らない。
774さん、ありがとうございました!
もし、また何かいい案が思いついたら、教えてください。
よろしく御願いします。
・ツリー全体表示

【725】Re:相互参照のダイアログボックス
回答  774  - 12/3/5(月) 13:16 -

引用なし
パスワード
   > さらには、両方とも表示した状態で、本文の編集をしたいのですが。。。。

はい↓。
後は知らない。

Sub Sample3()
  Application.CommandBars.FindControl(ID:=775).Execute
  With Application.Tasks("相互参照")
    .SendWindowMessage &H100, vbKeyDown, 0&
    .SendWindowMessage &H101, vbKeyDown, 0&
    .SendWindowMessage &H100, vbKeyHome, 0&
    .SendWindowMessage &H101, vbKeyHome, 0&
    .SendWindowMessage &H100, vbKeyDown, 0&
    .SendWindowMessage &H101, vbKeyDown, 0&
    .SendWindowMessage &H100, vbKeyDown, 0&
    .SendWindowMessage &H101, vbKeyDown, 0&
    .SendWindowMessage &H100, vbKeyDown, 0&
    .SendWindowMessage &H101, vbKeyDown, 0&
    .SendWindowMessage &H100, vbKeyDown, 0&
    .SendWindowMessage &H101, vbKeyDown, 0&
    .SendWindowMessage &H100, vbKeyDown, 0&
    .SendWindowMessage &H101, vbKeyDown, 0&
    .SendWindowMessage &H100, vbKeyTab, 0&
    .SendWindowMessage &H101, vbKeyTab, 0&
    .SendWindowMessage &H100, vbKeyDown, 0&
    .SendWindowMessage &H101, vbKeyDown, 0&
    .SendWindowMessage &H100, vbKeyHome, 0&
    .SendWindowMessage &H101, vbKeyHome, 0&
    .SendWindowMessage &H100, vbKeyDown, 0&
    .SendWindowMessage &H101, vbKeyDown, 0&
  End With
End Sub
・ツリー全体表示

【724】Re:相互参照のダイアログボックス
お礼  りんぐ  - 12/3/2(金) 17:28 -

引用なし
パスワード
   まさにこんな感じです、ありがとうございました。

追加の御願いなのですが、このダイアログボックスを表示したまま、
本文の編集ができるようにしていただければ助かるのですが・・。

さらには、両方とも表示した状態で、本文の編集をしたいのですが。。。。

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

【723】Re:相互参照のダイアログボックス
回答  774  - 12/3/2(金) 15:02 -

引用なし
パスワード
   こんな感じ?

Sub Sample1()
  With Application.Dialogs(wdDialogInsertCrossReference)
   SendKeys "ff{TAB}{DOWN 2}{ENTER}"
   .ReferenceType = "図"
   .InsertAsHyperLink = 1
   .Show
  End With
End Sub

Sub Sample2()
  With Application.Dialogs(wdDialogInsertCrossReference)
   SendKeys "ff{TAB}{DOWN 2}{ENTER}"
   .ReferenceType = "表"
   .InsertAsHyperLink = 1
   .Show
  End With
End Sub
・ツリー全体表示

【722】相互参照のダイアログボックス
質問  りんぐ  - 12/3/1(木) 13:43 -

引用なし
パスワード
   相互参照ダイアログボックスを開くと、
参照する項目、相互参照の文字列、参照先を選択することになります。
ただ、私の場合、使う項目が非常に限られています。
以下のパターンだけです。

パターン1
参照する項目:図
(ハイパーリンクとして挿入する)
相互参照の文字列:番号とラベル

パターン2
参照する項目:表
(ハイパーリンクとして挿入する)
相互参照の文字列:番号とラベル


パターン1のみ(あるいはパターン2)を表示するダイアログがあればと思います。
レイアウトはどんなものでも構いません。
このようなマクロをご教示ください。
どうぞよろしくお願いします。
・ツリー全体表示

【721】マクロの実行速度向上
質問  流星バナナ  - 12/2/18(土) 16:13 -

引用なし
パスワード
   いつも参考にさせてもらっています。

Word VBAの実行速度が非常に遅く困っています。

マクロでやっていることは,既に配置している
ラインやテキストのTop,Left,width,height
に値を設定し,大きさを変えたり動かしたりして
います。オブジェクトに対しての処理が異常に
遅いです。

現在,処理速度向上の対策としては
Application.ScreenUpdating = False
をしていますが,他に何かありましたら
ご教授願います。
・ツリー全体表示

【720】Re:クリップボードをクリア
お礼  流星バナナ  - 12/2/7(火) 14:36 -

引用なし
パスワード
   希望の処理を実現できました。
ありがとうございました。
・ツリー全体表示

【719】Re:クリップボードをクリア
回答  774  - 12/2/7(火) 11:33 -

引用なし
パスワード
   単にメッセージが出るのを防ぐだけなら適当なのをコピーすれば良いのではないかと。

Public Sub Macro1()
  Dim rng As Range
  
  ActiveDocument.InlineShapes(1).Range.Copy
  For Each rng In ActiveDocument.Characters
    rng.Select
    If Selection.Type = wdSelectionNormal Then
      Selection.Copy
      Exit For
    End If
  Next
  Application.Quit
End Sub
・ツリー全体表示

【718】クリップボードをクリア
質問  流星バナナ  - 12/2/4(土) 17:52 -

引用なし
パスワード
   いつも参考にさせてもらっています。

Word VBAでクリップボードのクリア方法を
探しています。

やっていることは
1.VBAでオブジェクトをコピーして貼り付け
2.終了ボタンで保存せず終了
終了ボタン時にクリップボードに関しての
メッセージが出るのを防ぎたいです。
<word2000〜2010で使用>

なお,word2010(64bit)対策としてWinApiは使用しない
方向で考えています。

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

【717】Re:文字検索
お礼  ゆい  - 12/1/16(月) 16:14 -

引用なし
パスワード
   アドバイス頂いた内容をきちんと理解できていませんが、
何とか希望通りの動作をするマクロにすることが出来ました!
ありがとうござました。

アドバイス頂いたマクロの内容の勉強をこれから行います!
・ツリー全体表示

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