[[20191226084824]] 『462エラーメッセージ リモートサーバーがないか使』(慎之介) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『462エラーメッセージ リモートサーバーがないか使用できる状態ではありません』(慎之介)

Sub WW_EXCEL()

    Dim nm As String, i As Long, n As Variant, c As Long, ip As String

     Dim wddoc As Word.Document
    Dim wdrg As Word.Range
    For Each n In ActiveWorkbook.Names
        i = i + 1
        nm = nm & i & ":" & n.Name & vbLf
    Next n
    ip = InputBox("どの様な文章を作成するか番号(1〜)を指定してください。" & vbLf & vbLf & nm)
      If ip = "" Then
   Exit Sub
End If
 Worksheets("入力欄").Activate
       Worksheets("入力欄").Range(Split(Split(nm, vbLf)(Val(ip) - 1), ":")(1)).Copy

            Set wdrg = ActiveDocument.Paragraphs(10).Range '.Sentences(1).Words(1)

              '10行目:wddoc(sample.doc)の1行目を指定
             wdrg.Select
             wdrg.PasteSpecial , , wdInLine, , wdPasteOLEObject

End Sub
開いたワード文章にエクセルの範囲名の文章を貼付けたいのですがエラーメッセージ出ます。回避方法はないんでしょうか?

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 どこでエラーになるんでしょうか?

 Set wdrg = ActiveDocument.Paragraphs(10).Range
 から
 wdrg.Select
 の間に
 ActiveDocument で捕まえたワードドキュメントが閉じられちゃったりすると
 wdrg.Select で掲題のエラーになるようです。

 その間になんかやってませんか?
(´・ω・`) 2019/12/26(木) 10:53

ひな形のファイルを出しエクセルのデータをワードのデータ書き換えて終わってからファイルを書き換えをした後にSub WW_EXCEL() を実行していますがどうしてもファイルの書き換え処理がよくわかりません?教えてください
(慎之介) 2019/12/26(木) 11:31

 当方の質問に答えてもらっていないのと私には質問者さんの日本語がよく理解できないのでさようなら 
 最近は句読点をいれず文も区切らずにだらだら書き続けるのが普通なのかもしませんがわたしもいい年齢なのでついていけません
(´・ω・`) 2019/12/26(木) 11:40

Sub WordDocDupulicate()
    Dim wdApp As Word.Application
    Dim wddoc As Word.Document
    Dim wdRng As Word.Range
    Dim Fname   As String
    Dim sOutput As String

    Dim mPath   As String
    Dim iRowCount As Long
    Dim jColCount As Long
    Dim sh As Worksheet
    Set wdApp = New Word.Application
     wdApp.Visible = True
    Const dataSheet As String = "data"
    Const dataItem  As Long = 2         '項目行

    Set sh = Worksheets(2)                           
    sh.Select

     '                           ’sOutput = mPath & "\"

        mPath = ActiveWorkbook.Path & "\"                
             Fname = Cells(1, 7).Value                    
        sOutput = mPath & "\"

    On Error GoTo ErrHandler
    'テンプレート文書
    If Dir(Fname) = "" Then
        MsgBox "テンプレート文書がありません。", vbExclamation
        GoTo ErrHandler
    End If

    iRowCount = ActiveCell.Row 'dataItem + 1         '先頭data行

        With wdApp
            Set wddoc = .Documents.Open(Fname)     
            Set wdRng = wddoc.Content
        End With

        jColCount = 2
        Do
            Debug.Print "項目: " & Cells(dataItem, jColCount).Value
            Debug.Print "置換: " & Cells(iRowCount, jColCount).Value

            With wdRng.Find
                .Text = "{" & Cells(dataItem, jColCount).Value & "}"
                .Forward = True
                If Cells(dataItem, jColCount).Value = "日付" Then
                    .Replacement.Text = Format(Cells(iRowCount, jColCount).Value, "gggee年mm月dd日")
                Else
                    .Replacement.Text = Cells(iRowCount, jColCount).Value
                End If
                .MatchCase = False
                .MatchWildcards = False
                .MatchFuzzy = True

                .Execute , , , , , , , , , , wdReplaceAll
            End With
            jColCount = jColCount + 1
       Loop Until sh.Cells(iRowCount, jColCount).Value = ""

       sOutput = mPath & Format(Date, "mmdd") & "_" & Cells(iRowCount, 2).Value & ".docm"

      Debug.Print "sOutput: " & sOutput

       wddoc.SaveAs sOutput '保存word文書名                
    '   wdDoc.Close False
    ' wdApp.Quit
    WW_EXCEL
ErrHandler:
    If Err.Number > 0 Then
        MsgBox Err.Number & " : " & Err.Description
    Else
        Beep '正常終了
    End If
   ' Set wdRng = Nothing
    'Set wdDoc = Nothing
   ' Set wdApp = Nothing
   ' Set sh = Nothing
End Sub
最終のコメント行をどのようにコードを並べるかまったくわかりません自分自身エクセルとワードの連携でデータコピーしたデータをひとつづつ確認して保存出来ればいいと思っておりますがまったくわかりませんお願いします。

(慎之介) 2019/12/26(木) 11:45


教えてくださいお願いします。
(慎之介) 2019/12/26(木) 16:33

 (1) Sub WordDocDupulicate() の
        Fname = Cells(1, 7).Value
    で Cells(1, 7).Value にどんな値が入っているか教えてください

 (2) Sub WW_EXCEL() で
     Set wdrg = ActiveDocument.Paragraphs(10).Range 
    で、ActiveDocument を止めてドキュメントを明示する。

    [1] Sub WW_EXCEL() プロシジャの宣言部分を 以下に変更
        Sub WW_EXCEL(wddoc as Word.Document)
    [2] Set wdrg = ActiveDocument.Paragraphs(10).Range を以下に変更
        Set wdrg = wddoc.Paragraphs(10).Range 

    [3] Sub WordDocDupulicate()プロシジャ中 の WW_EXCEL の呼び出し部分を以下に変更
        Call WW_EXCEL( wddoc ) 

 (3) Sub WordDocDupulicate 中の     On Error GoTo ErrHandler をコメントアウト

 以上をした上で、どこでエラーが発生するかおしえてください。

 これで曖昧な回答や理解不能な日本語の書き込みがされたらもう知りません。
 あ、ちなみにちゃんと回答されても、原因が判明しない場合もあります。
(´・ω・`) 2019/12/26(木) 16:55

長文には、句読点をちゃんと入れるほか、適度に
改行を入れてもらった方が読みやすいです。
横スクロールを強いるとか、、、、、、
回答が欲しければ、読んでもらえるような読みやすい文章を心がけましょう。
コードも出来れば1つのプロシージャが短い方が読みやすいです。

あと、どの行でエラーが出るのかもお教えください。

(まっつわん) 2019/12/26(木) 17:09


Fname = Cells(1, 7).Valueフルパスです。エラーが出なくなりました。今後読みやすい文章を書きますのでよろしくお願いいたします。すみませんでした。もっと勉強いたします。
(慎之介) 2019/12/26(木) 17:19

頑張って整理を試みている間に話が終わってるっぽい・・・・けど、せっかくなので投稿しておきます。
    Sub 整理を試みた()
        'Dim wdApp As Word.Application      【Withで対応できるので削除】
        'Set wdApp = New Word.Application   【↑により削除】
        'Dim sOutput As String              【一旦変数に格納する必要がないので削除】
        'Dim mPath   As String              【一旦変数に格納する必要がないので削除】
        'Dim sh As Worksheet                【Withで対応できるので削除】
        Dim wddoc As Word.Document
        Dim wdRng As Word.Range
        Dim Fname   As String
        Dim sh As Worksheet
        Dim 行 As Long                     '【「iRowCount」が長ったらしかったので変更】
        Dim 列 As Long                     '【「jColCount」が長ったらしかったので変更】

        'Const dataSheet As String = "data" 【使っていないので削除】
        Const dataItem  As Long = 2         '項目行

        With ThisWorkbook
            Set sh = .Worksheets(2)

            '▼無駄に思えるけどWorksheets(2)の『アクティブセル』の行番号を取得するには必要
            sh.Activate
            行 = ActiveCell

            '▼ワードドキュメントの"ファイル名"を取得
            Fname = Dir(.Path & "\" & sh.Range("G7").Value)

            '▼ファイルの存在チェック
            If Fname = "" Then
                MsgBox "テンプレート文書がありません。", vbExclamation
                Exit Sub
            End If

            '▼ワードの操作(ドキュメントを開いてオブジェクト変数にセット)
            With New Word.Application
                Set wddoc = .Documents.Open(.Path & "\" & Fname)
                Set wdRng = wddoc.Content
            End With

            '▼ワードドキュメントの中を検索?
            列 = 2
            Do
                With wdRng.Find
                    .Text = "{" & sh.Cells(dataItem, 列).Value & "}"
                    .Forward = True
                    If sh.Cells(dataItem, 列).Value = "日付" Then
                        .Replacement.Text = Format(sh.Cells(行, 列).Value, "gggee年mm月dd日")
                    Else
                        .Replacement.Text = sh.Cells(行, 列).Value
                    End If
                    .MatchCase = False
                    .MatchWildcards = False
                    .MatchFuzzy = True
                    .Execute , , , , , , , , , , wdReplaceAll
                End With

                 列 = 列 + 1

            Loop Until sh.Cells(行, 列).Value = ""

            '▼ワードドキュメントを【マクロ付きドキュメント形式】で"前を付けて保存
            wddoc.SaveAs2 _
                Filename:=mPath & Format(Date, "mmdd") & "_" & Cells(行, 2).Value, _
                FileFormat:=wdFormatXMLDocumentMacroEnabled

             '-----------------------------------------------------------------------------
            '▼WW_EXCELをこちらに移設 ★★たぶん、これが本題★★
            Dim 名前の定義 As Object
            Dim リスト As String
            Dim i As Long
            Dim 選択番号 As Long
            'Dim wddoc As Word.Document 【使っていないので削除】
            Dim wdrg As Word.Range

            For i = 1 To .Names.Count
                リスト = リスト & i & ":" & .Names(i).Name & vbLf
            Next

ラベル:

            選択番号 = Application.InputBox(Prompt:="どの様な文章を作成するか番号(1〜" & _
                       .Names.Count & ")を指定してください。" & vbLf & リスト, Type:=1)

            If 選択番号 = False Then End '呼び出し元も含めて全マクロの実行を終了

            If 選択番号 < 1 Or 選択番号 > ThisWorkbook.Names.Count Then
                MsgBox "1〜" & .Names.Count & "で入力してください。"
                GoTo ラベル
            End If

            .Worksheets("入力欄").Range(.Names(選択番号).Name).Copy

            '// ↓【wddocでドキュメントを掴んでいるから"ActiveDocument"じゃなくていいとおもいます。 //
            With ActiveDocument.Paragraphs(10).Range
                .Select '←必要?
                .PasteSpecial , , wdInLine, , wdPasteOLEObject
            End With

             '-----------------------------------------------------------------------------
        End With
    End Sub

 ワードvbaはサッパリわからないので、根本的に間違ってる部分があるかもしれません。

ちなみに、エラーは出なくなったとのことですが、エラーにならないまでも、使ってない定数・変数を整理したり、無駄に複雑化させているルーチンを考え直した方がいいような気がします。
(要は、ご自身で【ステップ実行】してどこに問題があるのかを探るときに、複雑じゃない方がいいとおもいます。)
(たとえば、ActiveCellに依存してる部分や、名前の定義をコンボボックスから選ばせるとか、、改善の余地がありそうです。)

想像の範囲で申し訳ないですが、エラーが出てたのはExcelを操作する部分じゃなくてWordを操作する部分のほうだったりしませんでしたかね・・・

(もこな2 ) 2019/12/26(木) 18:43


>ActiveDocument.Paragraphs(10).Range

wdApp.ActiveDocument.Paragraphs(10).Range じゃないですか?
(cai) 2019/12/26(木) 22:43

解決したのかな???

 >WW_EXCEL

じゃ、なんのことかこちらでは想像が付かないので、

ExcelToWord

という名前に勝手に名前を変えてみました。。。

Option Explicit

Sub Main()

    ExcelToWord Excel.ThisWorkbook, Word.Application.Documents(1)

End Sub

Private Sub ExcelToWord(ByRef FromWbk As Excel.Workbook, _

                        ByRef ToDoc As Word.Document)
    Dim ix As Variant
    Dim s As String
    Const cProm As String = "どの様な文章を作成するか番号(1〜)を指定してください。"

    s = Get_Names(FromWbk)

    ix = Application.InputBox(Prompt:=cProm & vbLf & vbLf & s, Type:=1)
    If TypeName(ix) = "Boolean" Then Exit Sub

    FromWbk.Names(ix).RefersToRange.Copy
    ToDoc.Paragraphs(10).Range.PasteSpecial , , wdInLine, , wdPasteOLEObject
End Sub

Private Function Get_Names(ByRef wb As Excel.Workbook) As String

    Dim v() As Variant
    Dim i As Long
    Dim n As Excel.Name

    ReDim v(1 To wb.Names.Count)
    For Each n In wb.Names
        i = i + 1
        v(i) = i & ") " & n.Name
    Next

    Get_Names = Join(v, vbLf)
End Function

こんなことをやりたいのではないかな?

 >リモートサーバーがないか使用できる状態ではありません
参照しているアプリが分からないという意味じゃないかな?
コードでちゃんと書いてあげないとエクセル君に伝わらないですよ。
(まっつわん) 2019/12/27(金) 10:44


BookToDocument

の方がプロシージャy名としてわかりやすいかも?

部下に、
エクセルのブックとワードのドキュメントを渡して、
「これ、転記しておいて。」と頼むと、
部下が、
指定の物を指定の場所に書き込んでくれるイメージで、
プロシージャを作って行ったらいいと思います。

(まっつわん) 2019/12/27(金) 10:50


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.