PR
スポンサーリンク

【ExcelVBA】.Valueを省略してセルをコピーするとオブジェクト定義のエラーが発生する(場合があります。)

スポンサーリンク
エクセルVBA-セルのコピーでオブジェクトエラー-アイキャッチ エラー・不具合
スポンサーリンク

セルのコピー・貼り付けを行うマクロ実行でオブジェクト定義のエラーが発生したので原因を確認したところ、「.Value」を省略した記述方法でセル内の文字数がある文字数以上の場合、エラーが発生することが分かったので記録に残しておきます。

スポンサーリンク
スポンサーリンク

セルのコピー・貼り付け

マクロでセルの値のコピー・貼り付けを行う方法には、色々な書き方があります。

たとえばA1セルをコピーしてB1セルに貼り付ける、という内容を1行で書く方法として、左側にコピー元のセルを書いて「.Copy」のあとに貼り付け先のセルを記述する方法。

Range(“A1”).Copy Range(“B1”)

そしてよく使用するのが右側⇒左側にコピーする、というのを「=(イコール)」で結ぶ書き方です。

Range(“B1”).Value = Range(“A1”).Value

このときの「.Value」の記述はセルの範囲をコピーするときは省略するとエラーになりますが、範囲でない場合は省略可能と言われています。

「.Value」を省略したコピー・貼り付け
Range(“B1”) = Range(“A1”)

コードはなるべく短く見やすい方が良いとされているので、「.Value」が省略できるなら省略した方がスッキリして良い、と思っていました。

スポンサーリンク

「.Value」を省略したコピー・貼り付けでオブジェクト定義のエラーが発生

この「.Value」を省略したセルのコピー・貼り付けのマクロ実行であるときエラーが発生しました。セルは単一のセルで、範囲を指定していた訳ではありません。

発生したエラーは「実行時エラー’1004′:アプリケーション定義またはオブジェクト定義のエラーです。」でした。

エクセルVBA-実行時エラー'1004':アプリケーション定義またはオブジェクト定義のエラーです。

使用していたマクロではセルの中に長文のテキストが入っていて、それを別のセルにコピーするという処理をしていました。

それまで普通に使えていたマクロで突然エラーが出たのでセルの中に入っている文字数を疑って調べてみると、文字数が8190文字まではOK8191文字以上になるとエラーになることが分かりました。

再現テストで使用したシートです。

エクセルVBA-何文字までコピーできるかのテスト実行前の状態

A列には「aaa…」が連続する文字列が入っています。
B列ではA列のセルの文字数をLen関数でカウントしています。

テストではA列の値をコピーしてD列に貼り付ける作業を行いました。

↓が途中でエラーが発生したときのデバッグ画面です。
「.Value」を省略したコピーでA2セルから順にA5セルまで実行していきますが、A5セルの値をコピーしてD5セルに代入する箇所でエラーが発生しています。

エクセルVBA-デバッグ画面

シートを見るとA4セルの8190文字まではD列に貼りついています。

エクセルVBA-途中でエラーが起きたときのエクセルの状態

なんで8191文字からダメなのかは分かりません。
セルに格納できる最大文字数は32767文字なのでそれは関係なさそうです。

このエラーの解決策ですが、コピー元セルの方に「.Value」を付けたら解消しました。

エクセルVBA-valueを付けると解決する
スポンサーリンク

エラーからのまなび

今回の事象から学んだことをまとめると…

セルのコピーの記述で「.Value」を省略するとコードがスッキリして見やすいが、文字数が8191文字以上のテキストのコピーには使用できない。(オブジェクト定義のエラーが発生する)

コピー元のセルのあとに「.Value」を書くと解消する。

今後「.Value」は必ずつけましょうという事でもないですが、こういう事があることを念頭に置いておくと使い方に気を付けることができるので良いかと思います。

意外と検索しても出てこなかったので備忘録で残しておきます。

スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

タイトルとURLをコピーしました