#2-4です。
#3補足欄拝見しました。
> ... パソコンに不慣れな人に ...
私のVBAもスキルが読めないエンドユーザーを相手に書くことが多いので、
あなたの配慮はよく解ります。
> 500行目まで罫線が引いてあり ... 501行目に転記されました。
罫線のことは考えていませんでしたが、ADODBの仕様でそうなります。
> #正しい行位置#(20行目)に転記する ...
対策しました。
> できる所まで作ってみますので、後日、またアドバイスをお願いします。
今回提示したものはメンテが難しいでしょうから、
その時が来るまでのツナギということで考えておいてください。
ご縁があればまたその時に(^^)
> ... 方法2がうまく作動するように ...
正しい行位置に転記する、
転記先ブックが開いている場合の対策強化、他、
修正後の全体を掲げます。
#3のは破棄してください(もう一度初期設定お願いします)。
もしも不足があるといけないので、厳しめに検証してみて,
必要ならまた補足下さい。
' ' /// 方法2)ADODB.Recordset版 改★ /// 8990156w
Sub 社名をコピー31()
Dim rtn, s As String
'' ' 現在開いているドキュメント の 5行め のテキスト を 取得(option 1/2)
' s = ActiveDocument.Paragraphs(5).Range.Text
' ' 現在選択中のページ の 5行め のテキスト を 取得(option 2/2)どちらがいいか選んでください
s = ActiveDocument.Bookmarks("\Page").Range.Paragraphs(5).Range.Text '★
' ' テキスト から 改行 を トル
s = Replace$(s, vbCr, "")
' ' メッセージを表示して 処理の可否 を 問う(文面は編集可)
If MsgBox("以下のデータをエクセルに転記3しますか?" & vbLf & vbLf & s, vbYesNo) = vbYes Then
' ' 'エクセルに転記31' を 実行
rtn = エクセルに転記31(s)
If rtn = True Then '★↓
' ' 'エクセルに転記31' が正常終了ならば メッセージ(文面は編集可) を 表示
MsgBox vbTab & s & vbLf & "を、エクセルに転記しました", vbInformation
Else
' ' 'エクセルに転記31' が 不正終了ならば メッセージ(文面は編集可) を 表示
MsgBox "'エクセルに転記31'処理できませんでした。" & _
vbLf & "◆初期設定◆の内容を確認してください。" & _
vbLf & vbLf & "err#:" & rtn & vbLf & Error(rtn) _
, vbExclamation, "処理に失敗!/'エクセルに転記31'"
End If '★↑
End If
End Sub
Private Function エクセルに転記31(s As String) As Long
Const xlReadOnly = 3, xlReadWrite = 2 ' 固定 '★
Const myProv = "Microsoft.ACE.OLEDB.12.0" ' 固定
Const adOpenStatic = 3, adLockOptimistic = 3, adCmdText = 1 ' 固定
Dim oXlApp As Object ' Excel.Application '★
Dim oXlWkB As Object ' Excel.Workbook '★
Dim oConn As Object ' New ADODB.Connection
Dim rs As Object ' New ADODB.Recordset
Dim myFullPath As String ' 転記先ブックへのフルパス '★
Dim myShortName As String ' 転記先ブックの名前 '★
Dim mySheet As String ' シート名
Dim myRef As String ' セル範囲
Dim nLast As Long ' 行位置
' ' ◆初期設定◆ 指定は正確に!!間違っていればエラーになります
myFullPath = "D:\フォルダ名\郵便管理簿.xlsx" ' 要指定◆転記先ブックへのフルパス(フルネーム)
mySheet = Month(Date) & "月" ' 要指定◆シート名 今月 & "月" ?
myRef = "A1:J1048575" ' 要指定◆セル範囲/大きめの範囲を指定してOK
' ' ●--- 転記先ブック 開いていたら 読み取り専用に ---●
On Error Resume Next '★↓
Set oXlApp = GetObject(, "Excel.Application")
On Error GoTo 0
If Not oXlApp Is Nothing Then
myShortName = Mid$(myFullPath, InStrRev(myFullPath, "\") + 1) ' 転記先ブックのショートネーム を 取得
On Error Resume Next
Set oXlWkB = oXlApp.Workbooks(myShortName)
On Error GoTo 0
If Not oXlWkB Is Nothing Then
oXlWkB.Saved = True
oXlWkB.ChangeFileAccess xlReadOnly, , False
End If
End If '★↑
' ' ●--- Connection ---●
On Error GoTo errOut0_
Set oConn = CreateObject("ADODB.Connection")
' ' データソース(Excelブック)へのコネクション 開く
oConn.Open "Provider=" & myProv & _
";Data Source=" & myFullPath & _
";Extended Properties=""Excel 12.0;HDR=No;ReadOnly=True;"""
' ' ●--- Recordset ---●
On Error GoTo errOut1_
Set rs = CreateObject("ADODB.RecordSet")
With rs
' ' レコードセット 開く
.Open "SELECT * FROM [" & mySheet & "$" & myRef & "]", _
oConn, adOpenStatic, adLockOptimistic, adCmdText
' ' 第3フィールド Nullでないレコードを検索
.MoveLast '★↓
nLast = .RecordCount
Do While nLast
If Not IsNull(.Fields(2).Value) Then Exit Do
.MovePrevious
nLast = nLast - 1
Loop
If nLast = .RecordCount Then
.AddNew ' レコードを追加
Else
.MoveNext ' 転記先のレコードにカーソル移動
End If '★↑
' ' レコード の第3フィールド(指定値は(2))に データ を 転記
.Fields(2).Value = s
On Error Resume Next
' ' レコードセット(Excelブック)を 更新
.Update
' ' 追加したデータ を 確認 処理が正常に終了したこと を 戻り値に
If .Fields(2).Value = s Then エクセルに転記31 = True
' ' ●--- オブジェクト の 後片付け ---●
.Close
End With
errOut1_:
oConn.Close
errOut0_:
' ' 読み取り専用ブック を 元に戻す ★↓
If Not oXlWkB Is Nothing Then
oXlWkB.Saved = True
oXlWkB.ChangeFileAccess xlReadWrite, , False
Set oXlWkB = Nothing: Set oXlApp = Nothing
End If '★↑
Set rs = Nothing: Set oConn = Nothing
If Err Then エクセルに転記31 = Err
End Function
' ' ///
お礼
realbeatinさん、ありがとうございました。 ばっちり、転記されました。 エクセルで実行するマクロは、別で質問したほうがよかったですか? お返事がないようでしたら、新しく質問を立ち上げます。 今回はありがとうございました。