fc2ブログ

ワード文書(*.doc)が開いているかチェックについて

ワード文書(*.doc)が開いているかチェック

ワード文書(*.doc)が開いているかのチェック方法についてです。

ワード文書(*.doc)などを扱う場合、プログラム終了時に他の文書が開いているか確認し、開いている文書が
無ければ、ワード自体を終了させる必要があります。これをしないと、ワード文書を閉じた後も、
ワード(winword.exe)というアプリケーションだけが起動したままになってしまいます。
このあたり、Excelなどでも一緒です。(ExcelとWord位しかやったことが無いのでわかりませんが。。。)

以下のサンプルコードは、同じインスタンス内でのみ開いている文書が無いか確認しています。
ただし、同じインスタンス内でのみ確認すれば問題ないと思います。
・Excelを起動して、同じ画面から他の文書を開いた場合、同じインスタンス内で複数の文書が開いている
 ことになります。
・Excelを起動している状態で、スタートメニューやプログラムから新たにワードを立ち上げ文書を開いた場合、
 別インスタンスで立ち上がります。
 (タスクマネージャで確認すると、winword.exeが複数起動していることが確認できます。)


'==============================================================================
'
'ワード文書が開いているかチェック関連
''
'==============================================================================




'---------------------------------------------------
' 利用方法(以下必要に応じてプロシージャに貼り付けて下さい。)
'---------------------------------------------------

'------------------------------------------------------------
' 事前に参照設定を行なってください。
' 【参照設定方法】
' [プロジェクト]-[参照設定]-[MicroSoft Word 11.0 Object Library]にチェックを入れる。
' (11.0はバージョンにより異なります。ex)11.0 ⇒ Word2003, 9.0 ⇒ Word2000))
'------------------------------------------------------------

''==============================================================================
'
' ワード文書が開いているかチェック
'
'==============================================================================

  Dim wWD     As Word.Application
  Dim wDoc    As Word.Document
  Dim wWkDoc  As Word.Document
  Dim bOpenFlg As Boolean
  Dim iRet     As Integer
  Dim sFileName As String


  '---ワードオブジェクト作成
    Set wWD = CreateObject("Word.Application")
     wWD.Visible = True '←ワードが表示されない場合


  '---オープン
    Set wDoc = wWD.Documents.Open(App.Path & "\" & "サンプル.doc")


  '---他のワード文書の開いているかチェック
    bOpenFlg = False
    For Each wDoc In wWD.Documents
      sFileName = sFileName & wDoc.Name & vbCrLf
      bOpenFlg = True
    Next


  '---ワード終了(他のワード文書が開いていない場合)
     If Not bOpenFlg Then
      MsgBox "開いているワード文書が無いので、ワードを終了します。"
      wWD.Quit
    Else
      MsgBox "開いているワード文書があるので、ワードを終了しません。" & vbCrLf & _
            "------------------------------" & vbCrLf & _
            "ワード文書名:" & sFileName
    End If


  '---ワードオブジェクト開放
    Set wDoc = Nothing
    Set wDoc = Nothing
    Set wWD = Nothing



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

ワード文書(*.doc)の情報取得について

ワード文書(*.doc)の情報取得

ワード文書(*.doc)の中身を取得するには、単純にテキストを取得する以外にも、オブジェクト(シェイプとか)の
テキストや、表から取得する場合もあります。特に表から取得する場合、
特定の位置の情報(行・列番号を指定して)を取得したい場合もあります。
以下のサンプルコードは、テキストから取得、オブジェクトから取得、表から取得(行・列番号も併せて)の
3種類を載せています。また、VisualBasicでできるので、ExcelなどのVBAでも利用できます。
応用すれば、ワード文書(*.doc)の作成・保存なども可能です。


'==============================================================================
'
'ワード文書の情報取得関連
'
'==============================================================================




'---------------------------------------------------
' 利用方法(以下必要に応じてプロシージャに貼り付けて下さい。)
'---------------------------------------------------

'------------------------------------------------------------
' 事前に参照設定を行なってください。
' 【参照設定方法】
' [プロジェクト]-[参照設定]-[MicroSoft Word 11.0 Object Library]にチェックを入れる。
' (11.0はバージョンにより異なります。ex)11.0 ⇒ Word2003, 9.0 ⇒ Word2000))
'------------------------------------------------------------

''==============================================================================
'
' ワード文書の作成
'
'==============================================================================

  Const msoTextBox = 1
  Dim wWD     As Word.Application
  Dim wDoc    As Word.Document
  Dim wTable   As Word.Table
  Dim wCell    As Word.Cell
  Dim wRange   As Word.Range
  Dim wShape   As Word.Shape
  Dim wPara    As Word.Paragraph
  Dim iNumCells  As Integer
  Dim iTabCount  As Integer
  Dim iTabAllCount As Integer
  Dim sOutput1   As String
  Dim sOutput2   As String
  Dim sOutput3   As String
  Dim bOpenFlg  As Boolean


  '---ワードオブジェクト作成
    Set wWD = CreateObject("Word.Application")


  '---ワード文書作成
    Set wDoc = wWD.Documents.Open("c:\ワード文書サンプル.doc")


  '---ワード文書の中身を取得
    'ワード情報取得
    For Each wPara In wDoc.Range.Paragraphs
      sOutput1 = sOutput1 & wPara.Range.Text & vbCrLf
    Next


  '---ワード文書の表の中身を取得
    '表数の取得
    iTabAllCount = wDoc.Tables.Count


  '---ワード情報取得
    sOutput2 = ""
    sOutput2 = sOutput2 & "テーブル番号" & vbTab & _
                  "行番号" & vbTab & _
                  "列番号" & vbTab & _
                  "内容" & vbCrLf & _
                  "--------------------------------------------------" & vbCrLf

    If iTabAllCount >= 1 Then
      For iTabCount = 1 To iTabAllCount
        '表を取得
        Set wTable = wDoc.Tables(iTabCount)

        'セル総数取得
        iNumCells = wTable.Range.Cells.Count

        For Each wCell In wTable.Range.Cells
          'セル取得
          Set wRange = wCell.Range

          'セル最後尾にカーソル移動
          wRange.MoveEnd Unit:=wdCharacter, Count:=-1

          'セル情報取得
          sOutput2 = sOutput2 & iTabCount & vbTab & vbTab & _
          wRange.Information(wdStartOfRangeRowNumber) & vbTab & _
          wRange.Information(wdStartOfRangeColumnNumber) & vbTab & _
          wRange.Text & vbCrLf
        Next

        sOutput = sOutput & "--------------------------------------------------" & vbCrLf
      Next
    End If


  '---ワード文書のオブジェクトの中身を取得
    sOutput3 = ""
    sOutput3 = sOutput3 & "オブジェクト名" & vbTab & _
                  "内容" & vbCrLf
    With wDoc
      'オブジェクトを一つずつ取得
      For Each wShape In .Shapes
        If wShape.Type = msoTextBox Then
          With wShape.TextFrame.TextRange
            For Each wPara In .Paragraphs
              sOutput3 = sOutput3 & wShape.Name & vbTab & _
              wPara.Range.Text & vbCrLf
            Next
          End With
        End If
      Next
    End With


   '---ワード情報出力
     MsgBox("ワード文書の中身" & vbCRLF & sOutput1)
     MsgBox("ワード文書の表の中身" & vbCRLF & sOutput2)
     MsgBox("ワード文書のオブジェクトの中身" & vbCRLF & sOutput3)


  '---終了
    '他のワード文書の開いているかチェック
    bOpenFlg = False
    For Each wDoc In wWD.Documents
      bOpenFlg = True
    Next

    'ワード終了(他のワード文書が開いていない場合)
    '非表示
    wWD.Visible = True
    If Not bOpenFlg Then
      wWD.Quit
    End If


  '---メッセージ
    MsgBox "終了"


  '---ワードオブジェクト開放
    Set wDoc = Nothing
    Set wWD = Nothing



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

ワード文書(*.doc)の作成について

ワード文書(*.doc)の作成

ワード文書(*.doc)を作成する方法は、ワードオブジェクトの作成 ⇒ 保存、これが基本です。
このあたり、Excelなどでも一緒です。(ExcelとWord位しかやったことが無いのでわかりませんが。。。)
あとは、いかにして思うような文章などを挿入し、成型するかだけだと思います。
以下のサンプルコードは、ページ設定や文章の挿入、表の作成を載せています。
応用すれば、思い描いたとおりのワード文書(*.doc)が作成できます。(多分。。。)


'==============================================================================
'
'ワード文書の作成関連
'
'==============================================================================




'---------------------------------------------------
' 利用方法(以下必要に応じてプロシージャに貼り付けて下さい。)
'---------------------------------------------------

'------------------------------------------------------------
' 事前に参照設定を行なってください。
' 【参照設定方法】
' [プロジェクト]-[参照設定]-[MicroSoft Word 11.0 Object Library]にチェックを入れる。
' (11.0はバージョンにより異なります。ex)11.0 ⇒ Word2003, 9.0 ⇒ Word2000))
'------------------------------------------------------------

''==============================================================================
'
' ワード文書の作成
'
'==============================================================================
  Dim wWD     As Word.Application
  Dim wDoc    As Word.Document
  Dim wTable   As Word.Table
  Dim wCell    As Word.Cell
  Dim wRange   As Word.Range
  Dim wShape   As Word.Shape
  Dim wPara    As Word.Paragraph
  Dim sInpuPath  As String
  Dim iCntI     As Integer
  Dim iCntJ    As Integer
  Dim bOpenFlg  As Boolean

   '---保存ファイル名取得
    sInpuPath = "c:\ワード文書サンプル.doc"


  '---ワードオブジェクト作成
    Set wWD = CreateObject("Word.Application")
    wWD.Visible = False


  '---ワード文書作成
    'オープン
    Set wDoc = wWD.Documents.Add

    With wDoc
      '---ページ設定(書式)
        With .PageSetup
          .LineNumbering.Active = False
          .Orientation = wdOrientPortrait
          .TopMargin = MillimetersToPoints(35)
          .BottomMargin = MillimetersToPoints(26)
          .LeftMargin = MillimetersToPoints(25)
          .RightMargin = MillimetersToPoints(15)
          .Gutter = MillimetersToPoints(0)
          .HeaderDistance = MillimetersToPoints(15)
          .FooterDistance = MillimetersToPoints(17.5)
          .PageWidth = MillimetersToPoints(210)
          .PageHeight = MillimetersToPoints(297)
          .FirstPageTray = wdPrinterDefaultBin
          .OtherPagesTray = wdPrinterDefaultBin
          .SectionStart = wdSectionNewPage
          .OddAndEvenPagesHeaderFooter = False
          .DifferentFirstPageHeaderFooter = False
          .VerticalAlignment = wdAlignVerticalTop
          .SuppressEndnotes = False
          .MirrorMargins = False
          .TwoPagesOnOne = False
          .GutterPos = wdGutterPosLeft
          .CharsLine = 40
          .LinesPage = 40
          .LayoutMode = wdLayoutModeGrid
        End With


      '---ページ設定(フォント)
        With wWD.Selection
          .Font.Name = "MS 明朝"
          .Font.Size = 11
        End With


      '---文書作成
        With wWD.Selection
          For iCntI = 1 To 10
            '文書挿入
            .TypeText Text:="テスト文書" & iCntI & vbCrLf

            '次行にカーソルを移動
            .MoveDown wdLine, Count:=1, Extend:=wdMove
          Next
        End With


        '次行にカーソルを移動
        wWD.Selection.MoveDown wdLine, Count:=1, Extend:=wdMove


      '---表作成
        Set wTable = .Tables.Add(Range:=wWD.Selection.Range, NumRows:=1, NumColumns:=4)

        '表の設定
        With wTable
          '表位置
          .Rows.LeftIndent = MillimetersToPoints(14.5)
          '列幅
          .Columns(1).SetWidth ColumnWidth:=MillimetersToPoints(35), RulerStyle:=wdAdjustNone
          .Columns(2).SetWidth ColumnWidth:=MillimetersToPoints(35), RulerStyle:=wdAdjustNone
          .Columns(3).SetWidth ColumnWidth:=MillimetersToPoints(35), RulerStyle:=wdAdjustNone
          .Columns(4).SetWidth ColumnWidth:=MillimetersToPoints(35), RulerStyle:=wdAdjustNone
        End With

        '表への値挿入
        With wWD.Selection
          For iCntI = 1 To 10
            '行挿入
            If iCntI > 1 Then
              .InsertRowsBelow 1
            End If

           For iCntJ = 1 To 4
              '文書挿入
              .TypeText Text:="表文書(" & iCntI & ", " & iCntJ & ")"

              '右隣にカーソルを移動
              If iCntJ <> 4 Then
                .MoveRight wdCell, Count:=1, Extend:=wdMove
              End If
            Next

            '左端にカーソルを移動
            .MoveLeft wdCell, Count:=3, Extend:=wdMove
          Next
        End With

        '保存
        .SaveAs sInpuPath

        'クローズ
        .Close
    End With


  '---終了
    '他のワード文書の開いているかチェック
    bOpenFlg = False
    For Each wDoc In wWD.Documents
      bOpenFlg = True
    Next

    'ワード終了(他のワード文書が開いていない場合)
    '非表示
    wWD.Visible = True
    If Not bOpenFlg Then
      wWD.Quit
    End If


  '---メッセージ
    MsgBox "終了"


  '---ワードオブジェクト開放
    Set wDoc = Nothing
    Set wWD = Nothing



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

四捨五入・切上げ・切捨てについて

四捨五入・切上げ・切捨て

四捨五入については,よくさまざまな議論がされていますが,単純に
「4より小さければ切り捨て」,「5より大きければ切り上げ」したい場合,
標準のRound関数では実現できません。(銀行型四捨五入と言われている「最近接偶数丸め」だからかな?)
なので,自分で関数を作成する必要があります。
以下はその例です。ついでに切上げ・切り捨ても付けてみました。


'==============================================================================
'
' 四捨五入・切上げ・切捨て関連
'
'==============================================================================




'---------------------------------------------------
' 利用方法(以下必要に応じてプロシージャに貼り付けて下さい。)
'---------------------------------------------------

''==============================================================================
'
' 四捨五入(切上げ, 切捨て)
'
'
' ------------------------------------------------------------------------
' 説明 : 四捨五入(切上げ, 切捨て)をする
'
' ------------------------------------------------------------------------
' 引数 : sValue 四捨五入(切上げ, 切捨て)をする値
'    : iMode 0:四捨五入, 1:切上げ, 2:切捨て
'    : iKeta 四捨五入(切上げ, 切捨て)をする位(第n位)
' 戻値 : Double 計算結果
'
'==============================================================================

Public Function fnc_Round_Value(sValue As Variant, iMode As Integer, iKeta As Integer) As Double
Dim dWkValue As Double

  '---戻り値初期化
    fnc_Round_Value = 0


  '---値チェック
    If Not IsNumeric(sValue) Then
      Exit Function
    End If


  '---計算
    Select Case iMode
      Case 0
        '四捨五入
        dWkValue = Int((sValue * (10 ^ (iKeta - 1)) + 0.5)) / (10 ^ (iKeta - 1))

      Case 1
        '切上げ
        dWkValue = Int((sValue * (10 ^ (iKeta - 1)) + 0.9)) / (10 ^ (iKeta - 1))

      Case 2
        '切捨て
        dWkValue = Int((sValue * (10 ^ (iKeta - 1)))) / (10 ^ (iKeta - 1))

    End Select


  '---戻り値設定
    fnc_Round_Value = dWkValue

End Function



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

マウスの座標について

マウスの座標

マウスの座標を取得する方法についてです。
マウスがフォームの外側,或いは透明フォーム等,MouseMoveイベントを利用出来ない場合に便利です。


'=======================================================================
'
' カーソル関連
'
'=======================================================================

'--------------------
' API宣言
'--------------------
  '---カーソルの現在のスクリーン座標の取得
    Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
  '---キーボードのキーが押されているかどうか調べる
    Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer

  '---定数宣言
    Public Type POINTAPI
      x As Long
      y As Long
    End Type




'---------------------------------------------------
' 利用方法(以下必要に応じてプロシージャに貼り付けて下さい。)
'---------------------------------------------------

  '---<< カーソル位置取得 >>
    Dim pPoint      As POINTAPI

    '---カーソル位置取得
      Call GetCursorPos(pPoint)


    '---カーソル位置表示
      MsgBox "X座標:" & pPoint.x
      MsgBox "Y座標:" & pPoint.y


    '---マウス状態
      If GetAsyncKeyState(vbKeyRButton) < 0 Then
        MsgBox "マウスの右ボタンがクリックされてます。"
      End If
      If GetAsyncKeyState(vbKeyLButton) < 0 Then
        MsgBox "マウスの左ボタンがクリックされてます。"
      End If



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

検索フォーム
最新記事
カテゴリ
全記事表示リンク

全ての記事を表示する

最新コメント
プロフィール

ITLife

Author:ITLife
システム葵新井聡太です。
東京都東村山市に生まれ、ここで育ち、ここで結婚し、システムエンジニア一筋で十数年やってきました。
ここでは主に、パソコンを中心にITに関わることを備忘録として残していきたいと思います。
少しでも来ていただいた方のお役に立てたら幸いです。
m(_ _)m

p.s
ここで紹介している内容は一例です。すべては、自己責任でお願いします。

カレンダー
08 | 2023/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
訪問数
月別アーカイブ
リンク