質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

2回答

6396閲覧

Excelマクロ:実行時エラー'-2147217887(80040e21)'を解決したい

Happy87

総合スコア3

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2022/02/01 10:45

編集2022/02/02 02:03

このたびはお世話になります。

現在社内での問い合わせ対応で使用しているExcelマクロが、保存しているサーバ変更の影響を
受けたためか、急に動作しなくなり(エラーが表示されるようになった)、困っております。

前任者も異動してしまい、確認することもできないため、皆様のお力を貸していただきたく
お願いいたします。

<経緯>

 社内事情により、既存サーバが変更となり、新たなサーバへ問い合わせ対応のDBやマクロを
移動させました。
フォルダ構成は既存利用していた状態と全く同じで、変更点としては「IPアドレス」ならびに
「フォルダがOS側の機能で圧縮状態としている」の2点になります。

<現状>

現在、Accessを用いて、社内の問い合わせ履歴をDB化して使用しております。
現状としてはExcelマクロをタスクスケジュールにて1日1回動作させており、
そのマクロでは、
Access DB内に存在するレコード内の特定フィールドに「完了」の文字が
入っているものを、別DB(ファイル名:完了分)に移し替える、という処理を
行っております。

当該フィールドに「完了」の文字が入っているレコードは、ファイル名:完了分、にレコード移動を
させたのちに、レコード削除を行っております。
*行っている作業の主旨としては、「問い合わせ対応の完了分は、日々使用している
問い合わせ管理簿からデータ移動をさせ、ファイルサイズを軽くして作業効率をあげたい。」
になります。

<エラー内容>

 Excel上でマクロを動作させると、以下のエラーが表示されます。

「実行時エラー'-2147217887(80040e21)'
インデックス、主キー、またはリレーションシップで重複する値が生成されるため、
テーブルを変更できませんでした。
重複する値のあるフィールドの値を変更するか、インデックスを削除してください。
または重複する値を使用できるように再定義してください。」

<補足説明>

 AccessでのDBとしては、問い合わせがあった際に発番された問い合わせ番号を
主キーとしており、ダブりはありません。

 気になる点としては、DBを作成した前任者が何故かフィールドとして「ID」というものを
設けており、データ型が「オートナンバー」で設定されているところです。
⇒ オートナンバー型であると、日々使用している問い合わせ管理簿と、完了分の管理簿が
ダブって自動採番されているのではないか。

  ・・・それゆえに、エラーが出ているのではないか、とも思ってしまうのですが、
(問い合わせあるある、のように)「サーバが変更になる前までは正常にマクロは
動作していた」実績があるので、理解に苦しむところです。

どうか識者の皆様のお力をお借りしたく、何卒お願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Happy87

2022/02/04 01:51 編集

 マクロの記載ならびに実行結果をあらためて確認したところ、サーバが変更後も  一定期間(3か月程度)は正常に動作していたことが判明しました。  ですので、「サーバ名が変わって値が取れなくなった」は当てはまらないのかな、  とは考えております。  オートナンバーで振られているフィールドの値がダブりのため、エラーとなっている  可能性があるのでしょうか。  いかんせん、前任者が異動してしまい、内部資料も作成されていないため、  どのようにすればよいか悩んでおります。   お知恵のある皆さま、引き続き教えていただけますと幸いです。
guest

回答2

0

解決方法ではなく調査方法についてになりますが、
エラーを見る限りではAccessにレコード追加する箇所で発生しているようです。
なので調査個所はAccess側のAddNewかSQL作成(INSERT文のところ)になります。
そのどちらかのキー項目に何を設定しているかを確認してみてはいかがでしょうか?

それとは別にどこかに旧サーバ名で処理している箇所があるのではないかと推測します。
(Excel→Accessでデータ連携をしていたが、サーバ名が変わって値が取れなくなった。
それがキー項目に絡んでいるのでキー重複が発生するようになった...等)
なのでソースを旧サーバ名で検索すると該当箇所が絞り込めると思います。
サーバ名が記載されていないのであれば、ディレクトリ構成が変わった(相対パスを使っている)
可能性もあります。

投稿2022/02/03 03:05

編集2022/02/03 03:10
enii

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Happy87

2022/02/03 11:07

eniiさん  このたびは調査方法についてアドバイスをいただき、ありがとうございました。  マクロの記載ならびに実行結果をあらためて確認したところ、サーバが変更後も  一定期間(3か月程度)は正常に動作していたことが判明しました。  ですので、「サーバ名が変わって値が取れなくなった」は当てはまらないのかな、  とは考えております。  オートナンバーで振られているフィールドの値がダブりのため、エラーとなっている  可能性があるのでしょうか。  いかんせん、前任者が異動してしまい、内部資料も作成されていないため、  どのようにすればよいか悩んでおります。   引き続き、何かお知恵がございましたら、教えていただけますと幸いです。
enii

2022/02/06 05:18

ken3memoさんが書かれている通り、オートナンバーがエラーになっている可能性はあります。 エラー原因(どうして重複扱いされるのか?)がわからないと問題が解決できないのですが、そちらで詳細に調査するのが難しいようですので別の方法で試してみるしかないと思います。 Happy87さんがどの程度Accessを扱えるかわからないのですが、該当項目をいったんオートナンバー型以外に変更できますか?変更が難しいなら現在設定されている値をクリアしてもいいです。キー項目に含まれていて難しいのであれば、DBに列を追加してそちらをキーとするように一時的に変更してもいいです。 ※これらの処置はテストのためなので、テスト後に元の状態に戻せるように準備はしておいてください。本体を変更するのはあまりに危険なのでテスト用に作っているとは思いますが、何にしてもバックアップは必須です。 その上で登録エラーが出るかを試し、何も起きなければ原因は「最終番号がおかしくなっている」と確定できます。そうすれば以降の方針も定まるのではないでしょうか。 こちらからだと処理の詳細が見えないので、本当にオートナンバー型項目が原因なのかもわからないままでは対応も取れないと思います。
guest

0

>オートナンバーで振られているフィールドの値がダブりのため、エラーとなっている
>可能性があるのでしょうか。

可能性としては、かなりレアな操作方法ですが、

オートナンバー型 IDの最後(最終レコード)を削除してから、
データベースを最適化すると、Accessが勝手に最終番号※次のオートナンバーを調整する?

ウソのような動作ですが、下記動画でテストしました
https://youtu.be/HFdDzOUGoos?t=24
↑テスト※信じてもらえないと思い、動画にしてみたり・・・・

勝手な重複ストーリーを作ると

1.完了処理

そのマクロでは、
Access DB内に存在するレコード内の特定フィールドに「完了」の文字が
入っているものを、別DB(ファイル名:完了分)に移し替える、という処理を
行っております。

当該フィールドに「完了」の文字が入っているレコードは、ファイル名:完了分、にレコード移動を
させたのちに、レコード削除を行っております。

2.ファイルサイズを軽くして作業効率をあげたい

*行っている作業の主旨としては、「問い合わせ対応の完了分は、日々使用している
問い合わせ管理簿からデータ移動をさせ、ファイルサイズを軽くして作業効率をあげたい。

もしかして、Excelで1.完了データを移動後、
AccessのDBを 最適化して(2.の軽くするため) サイズを減らすなどの処理を自動で行っていませんか?

ID
5022 Access オートナンバー型で重複することってあるの?
5023 Excelマクロ:実行時エラー'-2147217887(80040e21)'
5024 めったにないけど、問い合わせで登録後、すぐに解決 即 完了してしまった

当日、最後に5024が登録されます
なぜか、すぐに解決、完了 状態になります

Excelマクロをタスクスケジュールにて1日1回動作させる

当該フィールドに「完了」の文字が入っているレコードは、ファイル名:完了分、にレコード移動を
させたのちに、レコード削除を行っております

私の妄想予想では、ここで、Accessの最適化が実行される

すると、最後に登録された ID 5024 が 完了なので、移動して削除
Accessの最適化で

次の営業日、あらたに問い合わせが登録される
5024 えっ、これはまずいなぁ
5025 問い合わせ E
5026 問い合わせ F

その次の日に、5024の問い合わせが完了します
ID
5022 Access オートナンバー型で重複することってあるの?
5023 Excelマクロ:実行時エラー'-2147217887(80040e21)'
5024 えっ、これはまずいなぁ でも 後日 完了する
5025 問い合わせ E
5026 問い合わせ F

Excelマクロをタスクスケジュールにて1日1回動作させる

当該フィールドに「完了」の文字が入っているレコードは、ファイル名:完了分、にレコード移動を
させたのちに、レコード削除を行っております

ここで、移動される ID 5024 が 重複エラーを出す・・・

なんて、レアなケースを考えてみました。

※Accessの最適化処理が入っていなかったらスミマセン、私の妄想ストーリーはスルーしてください。

あとは、Accessの最適化を疑ってみましたが、
新サーバーに移行したらテストを行うのは、当然なので、

業務が終了したら、
5027 テスト問い合わせ 完了にする
を最後に登録、 Excelマクロが走るかテスト
テストOK
5027 テストデータを消す
あっちゃいけないけど、確認後移行先の5027を消し忘れてて、
テストのせいで・・・なんてストーリーも・・・

オートナンバーで絶対に重複は無いと思わないで、
一度、
問い合わせ管理簿と移行先のIDが重複していないか?チェックしてみては?

解決のヒントとなれば幸いです。
ウソのような動作ですが、下記動画でテストしました
https://youtu.be/HFdDzOUGoos?t=24
↑テスト※信じてもらえないと思い、動画にしてみたり・・・・

※Accessの最適化処理が入っていなかったらスミマセン、私の妄想ストーリーはスルーしてください。

投稿2022/02/04 20:35

ken3memo

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問