

アクセスのVBAでエクセルのデータを編集してテーブルに追加貼り付けをしたいのですが、「追加貼り付けは無効」とポップアップが表示されてうまくいきません。
追加貼り付けのFunctionを呼び出す前のエクセルのRangeをコピーした段階で手動でテーブルに追加貼り付けをすると、追加貼り付けをします。
追加貼り付けのコードは下記のとおりですが、どこを修正すればよろしいでしょうか。
Function 追加貼り付け()
On Error GoTo 追加貼り付け_Err
'この下の行のacEditをacAddに変えても、追加貼り付けは無効でした。
DoCmd.OpenTable "読み込み", acNormal, acEdit
DoCmd.RunCommand acCmdPasteAppend
'追加貼り付けする際に出てくるアラーム解除はこの下の行でよいのではないでしょうか。
DoCmd.SetWarnings False
追加貼り付け_Exit:
Exit Function
追加貼り付け_Err:
MsgBox Error$
Resume 追加貼り付け_Exit
End Function
No.3ベストアンサー
- 回答日時:
No.2です。
AccessのTableへの貼り付け前に、シートを削除していることが原因のようです。
Excelの範囲指定でのCopy&Pasteの場合、値そのものではなく「範囲の情報」
が、クリップボードに(?)保存されます。
そのため、貼り付け前にシートを削除したことで、「指定した範囲が見つからない
=データがない」ということになり、「追加貼り付けは無効」となったのだと思います。
(Excel内でのCopy&Pasteで、Copy後にシートを削除すると、Pasteができない
のと同じ現象ではないかと)
「Call 追加貼り付け」の位置を、シート削除の前に移動することで、こちらでは
問題なく貼り付けられることを確認しました。
(「With」の中に入ることになりますが、特に問題はありません;
「With」の宣言は『「With~End With」内にある、「.」で始まるものは、Withで
宣言したもの(コントロール、オブジェクト他)が省略されていると見做す』という
意味(と私は理解しています))
Sub EX_read()
On Error GoTo エラー処理
Dim EX As Excel.Application
Dim WB As Workbook
Dim WS As Worksheet
Dim WB_name As Variant
Dim Wrow As Double
Dim WB_length As Long
Dim a As Variant
Dim inti As Integer, intj As Integer
Set EX = GetObject(, "Excel.Application")
For Each WB In EX.Workbooks
WB.Activate
WB_name = WB.Name
WB_length = LenB(WB_name)
WB_name = LeftB(WB_name, WB_length - 8) '「.xls」部分を削除
Set WS = WB.Worksheets(1)
WS.Activate
Wrow = WS.Range("b65536").End(xlUp).Row
With WS
.Range(.Cells(1, 1), .Cells(Wrow, 15)).Copy
End With
With WB
.Worksheets.Add Count:=1
With .ActiveSheet
.Cells(1, 2).PasteSpecial Paste:=xlPasteValues
.Cells(2, 1).Value = WB_name
.Cells(1, 1) = "ファイル名"
.Cells(2, 1).Copy
.Paste Destination:=.Range(.Cells(3, 1), .Cells(Wrow, 1))
.Range(.Cells(1, 1), .Cells(Wrow, 16)).Copy
Call 追加貼り付け
EX.DisplayAlerts = False
.Delete
End With
End With
Next WB
Set EX = Nothing
終了処理:
Exit Sub
エラー処理:
MsgBox Err & ":" & Error$, , "Ex_Read": Resume 終了処理
End Sub
No.2
- 回答日時:
こちらで動作確認したところ、提示されたコードで、追加貼り付けは問題なく
実行されました。(WinXP&Access2003)
> 追加貼り付けのFunctionを呼び出す前のエクセルのRangeをコピーした
> 段階で手動でテーブルに追加貼り付けをすると、追加貼り付けをします。
とのことですが、Functionを呼び出す際にも、Excel側での範囲指定&コピー
は実行されたでしょうか。
提示されたコードにはデータをコピーする動作までは含まれていないので、
手動でのコピーを行っていないと、ご質問の通り「追加貼り付けは無効」との
メッセージが表示されます。
もう一度、確認してみて下さい。
*Excel側のコピーも含めたコードは、私にはわかりません(汗)*
なお、SetWarningsは追加貼り付けのコマンド実行前でないと意味がないと
思います。
また、このままですと、このFunctionの実行後に、例えばうっかりテーブルや
フォーム、或いはレコードを削除した場合などにも、警告が表示されなくなって
しまいます。
ですので、「SetWarnings」をFalseに設定した場合は、「Exit Function」の前に
「DoCmd.SetWarnings True」を追加して、警告表示を復活させることをお薦めします。
Function 追加貼り付け()
On Error GoTo 追加貼り付け_Err
DoCmd.OpenTable "読み込み", acNormal, acEdit
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdPasteAppend
追加貼り付け_Exit:
DoCmd.SetWarnings True
Exit Function
追加貼り付け_Err:
MsgBox Error$
Resume 追加貼り付け_Exit
End Function
この回答への補足
丁寧なご指導、誠にありがとうございます。
問題をクリアするため、もう少し、ご助言いただけませんでしょうか。EXCELをコピーする部分のVBAが分からないとのことでしたので、以下のとおり貼り付けさせていただきます。
エクセルのデータをコピーすることは質問でも述べたとおり、できると思います。
何か、設定の問題があるのでしょうか。Sub EX_read()
Dim EX As Excel.Application
Dim WB As Workbook
Dim WS As Worksheet
Dim WB_name As Variant
Dim Wrow As Double
Dim WB_length As Long
Dim a As Variant
Dim inti As Integer, intj As Integer
Set EX = GetObject(, "Excel.Application")
'立ち上げているエクセルのファイルを読み込み、
'ファイル名とデータを合体したデータをアクセスのテーブルに追加貼り付け
For Each WB In EX.Workbooks
WB.Activate
'読み込むエクセルファイル名を取得
WB_name = WB.Name
WB_length = LenB(WB_name)
WB_name = LeftB(WB_name, WB_length - 8) '「.xls」部分を削除
Set WS = WB.Worksheets(1)
WS.Activate
Wrow = WS.Range("b65536").End(xlUp).Row
With WS
.Range(.Cells(1, 1), .Cells(Wrow, 15)).Copy
End With
With WB
.Worksheets.Add Count:=1
With .ActiveSheet
.Cells(1, 2).PasteSpecial Paste:=xlPasteValues
.Cells(2, 1).Value = WB_name
.Cells(1, 1) = "ファイル名"
.Cells(2, 1).Copy
.Paste Destination:=.Range(.Cells(3, 1), .Cells(Wrow, 1))
.Range(.Cells(1, 1), .Cells(Wrow, 16)).Copy
'ここで中断して、手作業で追加貼り付けすると、追加貼り付けできました。
EX.DisplayAlerts = False
.Delete
End With
End With
Call 追加貼り付け
Next WB
Set EX = Nothing
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ラインで無言追加されたら、無...
-
クラスの話したことの無い男子...
-
LINEで無言追加されたとき、こ...
-
LINEのこれってなんて言うんで...
-
「〇〇が電話番号で友達追加さ...
-
同じクラスの男子から1日以上前...
-
裏垢女子がTwitterに載せてるLI...
-
LINEで一方的に友達追加した場...
-
LINEで、ブロックされてないの...
-
ラインでブロックした覚えのな...
-
突然LINEブロックされました。...
-
LINEでトークの入力をして送信...
-
男の人が自分の性器を見せてき...
-
LINEを2つ送って1つ目だけ既...
-
LINEのタイムラインで過去のプ...
-
LINE
-
彼女のLINEを見てしまって、信...
-
LINE送ったら一瞬で既読になる...
-
食事の誘いに未読スルーする相...
-
ひまチャットというアプリに詳...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LINEで無言追加されたとき、こ...
-
クラスの話したことの無い男子...
-
ラインで無言追加されたら、無...
-
同じクラスの男子から1日以上前...
-
LINEのこれってなんて言うんで...
-
LINEのグループから、間違えて...
-
一里とは何メートル(何キロ?...
-
仕事のグループLINEで一人の人...
-
裏垢女子がTwitterに載せてるLI...
-
私は高校生です。クラスの男子...
-
LINEの無言追加について
-
追加容量が勝手に増えた。
-
新学期クラス替え直後のクラスL...
-
最近全然知らない人からLINEを...
-
IDからLINEを追加しようとする...
-
ACCESS VBA 追加貼り付けが無効
-
男子に質問です。女子にLINE追...
-
インスタで知らない人からLINE...
-
LINEで一方的に友達追加した場...
-
キャップカットについて
おすすめ情報