Excel VBA質問箱 IV

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

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


2955 / 13644 ツリー ←次へ | 前へ→

【65071】テキスト入力済みと未入力が混在するオートシェイプからのテキスト取得方法 rx-78gp03d 10/4/11(日) 23:41 質問[未読]
【65072】Re:テキスト入力済みと未入力が混在するオ... ichinose 10/4/12(月) 6:51 発言[未読]
【65073】Re:テキスト入力済みと未入力が混在するオ... 独覚 10/4/12(月) 10:15 発言[未読]

【65071】テキスト入力済みと未入力が混在するオー...
質問  rx-78gp03d  - 10/4/11(日) 23:41 -

引用なし
パスワード
   オートシェイプで作成したフローから文字列を取り出したいです。
ただし、文字列が含まれるものや含まれないものが混在する状態です。

以下のようなVBAコードを作成しましたが、テキストが入力されてない
オートシェイプで「型が一致しません」エラーが発生します。
ローカルウィンドウで変数を参照すると「: Text : <アプリケーション定義またはオブジェクト定義のエラーです。> : String」
という表示になっています。

元々はフローにて使用するオートシェイプは決まっているので、
AutoShapeTypeで関係ないものや、明らかにテキストが存在しないものは
省いているのですが、資料の見易さのために配置されたオートシェイプが存在し、テキストが入力されてないところで実行時エラーとなります。
On Error Resume Nextで検知できるかとも思ったのですが、機能していません。
事前にテキストの有無を検知できればエラーを回避できるかと色々
試してみましたが、これ以上の策が思いつきません。

アドバイスあればご教授願いたく。

※インプットファイルは業務フローです。
 Excelで書くな、というのももっともな意見ですが……


【作成ソース】

Private Sub ReadProcessFlowSheet(objSheetIN As Excel.Worksheet, objSheetOUT As Excel.Worksheet, sFile As String, lRow As Long)

On Error Resume Next

  Dim sType As String
  Dim sText As String
  Dim objChar As Excel.Characters
  Dim objShape As Excel.Shape

  For Each objShape In objSheetIN.Shapes
    With objShape
      sText = ""
      sType = ""

      Select Case .AutoShapeType
      Case msoShapeDiamond
        sType = "フロー内接続端子(情報)"
      Case msoShapeOval
        sType = "フロー内接続端子(プロセス)"
      Case msoShapeHexagon
        sType = "画面"
      Case msoShapeCan
        sType = "データベース"
      Case msoShapePlaque
        sType = "リアルバッチ"
      Case msoShapeUTurnArrow
        sType = "問題存在箇所に戻る"
      Case msoShapePentagon
        sType = "前工程(後工程)フローからのつなぎ"
      Case msoShapeFlowchartProcess
        If .ShapeRange.Line.Style = msoLineThinThin Then
          sType = "別フロー"
        Else
          sType = "バッチ"
        End If
      Case msoShapeFlowchartPredefinedProcess
        sType = "人の作業"
      Case msoShapeFlowchartDocument
        sType = "リスト・帳票"
      Case msoShapeFlowchartStoredData
        sType = "インターフェースファイル"
      Case msoShapeRectangularCallout
        sType = "補足説明1"
      Case msoShapeCloudCallout
        sType = "補足説明2"
      Case Else
        '***対象外のオブジェクト
        sType = ""
      End Select

      '***対象オブジェクトの場合のみテキストの取得を実施
      If sType <> "" Then
        '***テキストが取得できる場合のみ
        Set objChar = .TextFrame.Characters
        If Err Then
          sText = "テキストなし"
          Err.Clear
        Else
          sText = CStr(objChar.Text)                '***←ここで「型が一致しません。」エラーが発生
        End If

        Call WriteShapeInfo(objSheetIN, objSheetOUT, objShape, sType, sText, sFile, lRow)    '***これが本命の処理だが、そこまでたどり着かない
        lRow = lRow + 1
      End If

    End With
  Next objShape

End Sub

【65072】Re:テキスト入力済みと未入力が混在する...
発言  ichinose  - 10/4/12(月) 6:51 -

引用なし
パスワード
   ▼rx-78gp03d さん:
おはようございます。

>テキストが入力されてないところで実行時エラーとなります。
>On Error Resume Nextで検知できるかとも思ったのですが、機能していません。
>          sText = CStr(objChar.Text)                '***←ここで「型が一致しません。」エラーが発生

では、上記のコードがエラーになる、ならないで分岐してみては?


>Private Sub ReadProcessFlowSheet(objSheetIN As Excel.Worksheet, objSheetOUT As Excel.Worksheet, sFile As String, lRow As Long)
>
>On Error Resume Next
>
>  Dim sType As String
>  Dim sText As String
>  Dim objChar As Excel.Characters
>  Dim objShape As Excel.Shape
>
>  For Each objShape In objSheetIN.Shapes
>    With objShape
>      sText = ""
>      sType = ""
>
>      Select Case .AutoShapeType
>      Case msoShapeDiamond
>        sType = "フロー内接続端子(情報)"
>      Case msoShapeOval
>        sType = "フロー内接続端子(プロセス)"
>      Case msoShapeHexagon
>        sType = "画面"
>      Case msoShapeCan
>        sType = "データベース"
>      Case msoShapePlaque
>        sType = "リアルバッチ"
>      Case msoShapeUTurnArrow
>        sType = "問題存在箇所に戻る"
>      Case msoShapePentagon
>        sType = "前工程(後工程)フローからのつなぎ"
>      Case msoShapeFlowchartProcess
>        If .ShapeRange.Line.Style = msoLineThinThin Then
>          sType = "別フロー"
>        Else
>          sType = "バッチ"
>        End If
>      Case msoShapeFlowchartPredefinedProcess
>        sType = "人の作業"
>      Case msoShapeFlowchartDocument
>        sType = "リスト・帳票"
>      Case msoShapeFlowchartStoredData
>        sType = "インターフェースファイル"
>      Case msoShapeRectangularCallout
>        sType = "補足説明1"
>      Case msoShapeCloudCallout
>        sType = "補足説明2"
>      Case Else
>        '***対象外のオブジェクト
>        sType = ""
>      End Select
>
>      '***対象オブジェクトの場合のみテキストの取得を実施
>      If sType <> "" Then
>        '***テキストが取得できる場合のみ
        Err.Clear
        sText = cstr(.TextFrame.Characters.Text)
        If Err.number<>0 Then
          sText = "テキストなし"
        End If
>
>        Call WriteShapeInfo(objSheetIN, objSheetOUT, objShape, sType, sText, sFile, lRow)    '***これが本命の処理だが、そこまでたどり着かない
>        lRow = lRow + 1
>      End If
>
>    End With
>  Next objShape
>
>End Sub

【65073】Re:テキスト入力済みと未入力が混在する...
発言  独覚  - 10/4/12(月) 10:15 -

引用なし
パスワード
   こちらの掲示板の基本方針です。

>マルチポストについて
>別のサイト(掲示板)にまったく同じ目的の投稿をすることを、一般に「マルチポスト」といいます。
>当質問箱では、マルチポストは原則認めています。
>つまり、ほかのサイトで質問したことをこのサイトで質問してもかまわないということです。

>しかし、もしマルチポストをするのなら、可能な限り「○○にも同じ質問を出しました」ということを宣言してください。
>そして、仮に他のサイトで解決したのなら、ここにも必ずその顛末を書いてください。
>質問しっぱなし、というのはモラルに反します。
>「解決したからいいや」というのではありません。

利用させてもらう掲示板の使い方やルールには目を通しておいた方がいいですよ。

2955 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free