[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
当方の質問に答えてもらっていないのと私には質問者さんの日本語がよく理解できないのでさようなら 最近は句読点をいれず文も区切らずにだらだら書き続けるのが普通なのかもしませんがわたしもいい年齢なのでついていけません (´・ω・`) 2019/12/26(木) 11:40
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
(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
あと、どの行でエラーが出るのかもお教えください。
(まっつわん) 2019/12/26(木) 17:09
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
>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
の方がプロシージャy名としてわかりやすいかも?
部下に、
エクセルのブックとワードのドキュメントを渡して、
「これ、転記しておいて。」と頼むと、
部下が、
指定の物を指定の場所に書き込んでくれるイメージで、
プロシージャを作って行ったらいいと思います。
(まっつわん) 2019/12/27(金) 10:50
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.