Word VBA質問箱 IV

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

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


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

【749】Re:段落について
お礼  ひかる  - 13/5/3(金) 9:51 -

引用なし
パスワード
   ご回答いただきありがとうございました。
方法がわからず停滞しているところでした。
実践してみようと思います。
本当にありがとうございました。
・ツリー全体表示

【748】Re:ページ全体の移動
発言  マナ  - 13/5/2(木) 21:55 -

引用なし
パスワード
   もう見てないでしょうが。自分の勉強のために書いてみました。

>換言すれば、WORD VBAで EXCEL VBA
>
>のようにページ管理が可能でしょうか。

EXCEL VBAのようにの意味がわかりませんが、
1ページ目を4ページ目の前に移動させる例です。
ちゃんと出来てるのかなぁ。あまり自信ありません。

Sub test()
  Dim s As Long
  Dim e As Long
  
  Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=4
  ActiveDocument.Bookmarks.Add Name:="移動先"
  
  Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=1
  s = Selection.Range.Start
  Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=2
  e = Selection.Range.Start

  If e > s Then
    ActiveDocument.Range(s, e).Cut
    ActiveDocument.Bookmarks("移動先").Range.Paste
  End If
  
  ActiveDocument.Bookmarks("移動先").Delete

End Sub
・ツリー全体表示

【747】Re:Excel VBAからのWord置換
発言  マナ  - 13/5/2(木) 17:11 -

引用なし
パスワード
   今更必要ないと思いますが、自分の勉強のために確認してみましたので報告です。

私の環境は、win7、word2010ですが、問題なく動作しました。
・ツリー全体表示

【746】Re:頁(目)および行(目)の取得
発言  マナ  - 13/5/2(木) 15:18 -

引用なし
パスワード
   今更でもう解決しているかもしれませんが。
自分の勉強を兼ねて確認してみました。

>ExcelのVBA ProjectからWordを操作して
>
>(定義したWorkbook).Sheet(i)Cells(m,n).value = Selection.Information(wdActiveEndPageNumber)

↑この時の、SelectionはExcel側なのではないかと思います。

こんな感じにすればうまくいくようです。

Sub test()
  Const myName As String = "D:\***\****\るりさま.doc"
  Dim myDoc As Object
  
  With CreateObject("Word.Application")
    Set myDoc = .Documents.Open(myName)
    .Visible = True
    myDoc.Characters(500).Select
    Range("A1").Value = .Selection.Information(3)  'wdActiveEndPageNumber
    Range("A2").Value = .Selection.Information(10) 'wdFirstCharacterLineNumber
    myDoc.Close False
    .Quit
  End With

End Sub
・ツリー全体表示

【745】Re:漢字あるいはカタカナからなる文字列の...
発言  マナ  - 13/5/2(木) 14:20 -

引用なし
パスワード
   回答がつきませんでしたので、もう必要ないかもしれませんが。
自分に勉強のために。

>  Select Case Activedocument.words(i)
>  Case"[−-鶴]{1,}","[ァ-ヾ]{1,}","[ヲ-゚]{1,}"
>
>としましたが、対象文字列を拾ってくれません。
>
>定義の仕方に問題があるのでしょうか。

Select Caseではワイルドカードは使えなかったかと思います。

Sub test()
  Dim myRng As Range
  Dim w As Object
  Dim cnt As Long
  
  Set myRng = Selection.Range

  With CreateObject("VBScript.RegExp")
    .Pattern = "^[一-鶴]+$|^[ァ-ヾ]+$|^[ヲ-゚]+$"
    For Each w In myRng.Words
      If .test(w.Text) Then
        'ここで実行
        Debug.Print w.Text
        cnt = cnt + 1
      End If
    Next
  End With
  If cnt > 0 Then
    MsgBox cnt & "個ありました"
  Else
    MsgBox "1個もありませんでした"
  End If
End Sub
・ツリー全体表示

【744】Re:Word VBA 条件が一致したら、表の指定...
発言  マナ  - 13/5/2(木) 13:43 -

引用なし
パスワード
   mougで解決済みでしたね。速攻で回答いただけたようで、何よりです。
・ツリー全体表示

【743】Re:文字検索
質問  マナ  - 13/5/1(水) 14:08 -

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

私も勉強中でまだまだわかっておりません。どなたか教えて下さい。
解決済みなうえに、1年以上も前なのですが、ここで便乗質問してもよいでしょうか。

ゆいさんの質問の
>今組んでいるマクロでは、選択範囲は無視されて、ドキュメントの最後まで検索してしまいます。

ですが、私の環境では、ゆいさんが最初に提示されたマクロで、
選択範囲のみの検索になっているみたいです。

> .Wrap = wdFindStop
これでは駄目なのでしょうか?

それとも私は何か勘違いしてるのかしら。
・ツリー全体表示

【742】Re:段落について
発言  マナ  - 13/5/1(水) 13:16 -

引用なし
パスワード
   1文字目を確認しながら、適用する箇条書きテンプレートを選ぶように修正してみました。
このほうが応用がきくかもしれません。

Sub test2()
  Dim t1 As ListTemplate
  Dim p As Paragraph
  
  Set t1 = ListGalleries(wdNumberGallery).ListTemplates(1)
  
  With t1.ListLevels(1)
    .NumberFormat = "%1"
    .TrailingCharacter = wdTrailingTab
    .NumberStyle = wdListNumberStyleArabic
    .NumberPosition = MillimetersToPoints(6.6)
    .Alignment = wdListLevelAlignRight
    .TextPosition = MillimetersToPoints(22)
    .TabPosition = MillimetersToPoints(22)
    .ResetOnHigher = 0
    .StartAt = 1
  End With
  
  For Each p In Selection.Paragraphs
    If p.Range.Characters.First = "●" Then
      p.Range.ListFormat.ApplyListTemplate _
        ListTemplate:=t1, _
        ContinuePreviousList:=True
      p.Format.TabStops.Add Position:=MillimetersToPoints(10)
    ElseIf p.Range.Characters.First = "■" Then
      p.Range.Characters.First.Delete
      p.LeftIndent = MillimetersToPoints(22)
    Else
      p.Range.ListFormat.ApplyListTemplate _
        ListTemplate:=t1, _
        ContinuePreviousList:=True
    End If
  Next
End Sub
・ツリー全体表示

【741】Re:コンテンツコントロールの値をVBAで取得...
発言  マナ  - 13/4/30(火) 10:46 -

引用なし
パスワード
   もう見てないと思いますが
自分の勉強のため、確認してみました。

1点目:
終了日1/5/13の場合、2001年5月13日として計算されているからと思われます。

2点目:
Word2010なのですが、こちらでは再現しませんでした。
ですから問題点そのものがわかっていないかもしれませんが。
・ツリー全体表示

【740】Re:ワードマクロ 列3に【第(*)話】がある...
発言  マナ  - 13/4/30(火) 10:24 -

引用なし
パスワード
   さすがにもう見ていないでしょうから、
遠慮無く、ここも勉強に使わせていただきましょっと。

ところでDebug.Print strの件は? こちらではちゃんと機能しました。

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

Sub test()
  Dim tbl As Table
  Dim r As Row
  Dim str As String

  With CreateObject("VBScript.RegExp")
    .Pattern = ".*【第([0-9]{1,2})話】.*"
    For Each tbl In ActiveDocument.Tables
      For Each r In tbl.Rows
        str = r.Cells(3).Range.Text
        If .test(str) Then
          r.Cells(6).Range.Text = .Replace(str, "$1")
        End If
      Next
    Next
  End With
End Sub
・ツリー全体表示

【739】Re:Word VBA 条件が一致したら、表の指定...
回答  マナ  - 13/4/29(月) 17:16 -

引用なし
パスワード
   もう見てないと思いますが。自分の勉強のつもりで。
withも無駄なので、ついでに省略しました。

Sub 文字サイズ変更()
  Dim myTable As Table
  For Each myTable In ActiveDocument.Tables
    If myTable.Cell(Row:=1, Column:=1).Range.Text = "○○○" & vbCr & Chr(7) Then
      myTable.Cell(Row:=2, Column:=2).Range.Font.Size = 9.5
    End If
  Next
End Sub
・ツリー全体表示

【738】Re:段落について
回答  マナ  - 13/4/29(月) 16:50 -

引用なし
パスワード
   もう見てない可能性が高いでしょうが、勉強のつもりで書いてみました。
現在のマクロを実行した後に、下記でどうでしょうか。

Sub test()
  Dim p As Paragraph
  
  For Each p In Selection.Paragraphs
    If p.Range.ListFormat.ListString = "●" Then
      p.Range.ListFormat.RemoveNumbers
      p.Range.ListFormat.ApplyListTemplate ListTemplate:=ListGalleries( _
        wdNumberGallery).ListTemplates(1)
      p.Format.TabStops.Add Position:=MillimetersToPoints(10)
    ElseIf p.Range.ListFormat.ListString = "■" Then
      p.Range.ListFormat.RemoveNumbers
      p.LeftIndent = MillimetersToPoints(22)
    End If
  Next
End Sub
・ツリー全体表示

【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
・ツリー全体表示

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