【アプリ版】サポートOS変更のお知らせ

まず前提として、二つのエクセルを同時使用してます。
VBAを組んでいる方を仮に「A」として、
もう一方の書き込みたい方を、「B」とします。
以下のVBAで組んだ所、エラー438と出てきました。
SUB あ()
 dim m as workbook
Set m = workbooks(“B.xlsm”).workseets(“Sheet1”).range(“A1”)
m.value = “excel”

つたない日本語で申し訳ないのですが、教えていただけると幸いです。

質問者からの補足コメント

  • 補足と追加の質問をします。
    変数設定の際のworkbookはobjectでも大丈夫ですか?
    タイポは参考書にならったのでないかと思います。

      補足日時:2021/06/18 15:04
gooドクター

A 回答 (4件)

Worksheetsコレクションの綴りの間違いを訂正した上で、変数 m への代入を Workbookオブジェクトまでに留める事が正解になります。



【解説】
データ型を Object に変更すると、厳密な型指定から緩い型指定になりますから一応は動作しますが、それだとデータ型の不一致の根本原因に対して手を打てていない事になります。
変数の型が Workbook型なので、代入するデータも変数の型に合わせて Workbookオブジェクトにします。
ご質問のコードでは Workbook型の変数に Rangeオブジェクトが代入されるため、型の不一致でエラーが出ます。

Sub あ()
Dim m As Workbook
Set m = Workbooks(“B.xlsm”)
m.Worksheets(“Sheet1”).Range(“A1”).value = “excel”
End Sub

(少し外れますが関連しますので参考までに)
プロシージャ名の命名は、名前を読めば何をするプロシージャなのか直ぐに理解できる名前を考え、変数名の命名は、名前を読めば何が代入される変数なのかが連想できる名前を考えた方が、後々デバッグする時に必ず役立ちます。可読性の向上が目的です。
コーディングに少し余裕が出てきてからでも構いませんので、コードの質も上がりますから記憶に留めておいてください。
    • good
    • 1

こんばんは、すでに解決済みと存じますが、



>変数設定の際のworkbookはobjectでも大丈夫ですか?

 dim m as workbook
Set m = workbooks(“B.xlsm”).workseets(“Sheet1”).range(“A1”)
で発生したエラー438は、変数型を変更しても改善されないと思います。

エラー438は、#1様の回答にある通りなので回避する方法は、カスタムクラスを作成してworkseetsオブジェクトをインスタンスする必要があります。(興味があれば「クラスを作成する」などで検索してください。

もっとも、上記はworkseetsがWorksheetsのタイプミスでない場合です。
タイプミスであるなら、Worksheetsに変更すれば発生するエラーは、
エラー13となり、変数型の不一致なので objectなどにすれば、エラーは発生しないと思います。
ちなみに、型省略(Variant型)、モジュールにOption Explicitの表記をしていないのであれば、
dim m as workbook 一行ごと削除してもエラー無く実行されます。

>worksheet(1)でも同様のエラーが出てきました。
先に示した通り、これはエラー13のはずです。実行時エラーとしては、エラーなので同様ですが、意味合いは別物です。

ExcelVBAは、記録マクロなどもあるので、比較的身近にある書けるプログラムだと思います。
ご質問者様がプログラマーや言語探究者でなく、ただ取り敢えず処理する事が目的であれば、難しい事を気にする必要はないかも知れません。
(私も全くの素人で自然に覚えてしまった事の押し売りです)

ただ、プログラムは機械に対しての命令語なのでルールに沿って命令文を作る必要があります。基本的に機械はうそをつきません。(機械も人間が作った物なのでバグる事がありますが)

m.value = “excel” とありますが、Workbook、WorksheetにはValueプロパティはありません。

=で結ばれた左辺は右辺の一番左のオブジェクト(プロパティ)を指(参照)します。
例えとして
m=神奈川県.横浜市.西区
の場合、mは西区を指しており神奈川県や横浜市を直接的に指しているのではありません。なので、#2様の回答の通りRangeにするべきです。

勿論、ObjectやVariantでも良いです。しかし、せっかくメモリー確保(インスタンス)されているオブジェクトは使った方が良いと思います。(最近の高スペックのPCなら気にしなくても良いのかも知れませんが)
    • good
    • 0

変数mは、Range でしょ‼

    • good
    • 0

こんにちは



>エラー438と出てきました
メッセージが出るはずなので、エラーの発生した行とその内容から推測できるようになりましょう。
多分、Set m ~~ の行でエラーになっているものと推測しますが、「エラー438」は「オブジェクトはプロパティまたはメソッドをサポートしていません」ということなので、ご提示のセンテンスの場合、
「workbooks(“B.xlsm”)には workseets というプロパティはないよ」ということかと。
多分、Worksheets のタイポでは?

通常、VBAエディタでは、Workbooks、Worksheets、Rangeのように登録されているオブジェクトは頭文字が大文字に変換されますけれど、ご提示のものがそうなっていないのはなぜなのでしょうか?

仮に、上記のタイポを修正したとしても、変数 m がWorkbookとして宣言されているのに対して、
 Set m = ~~
の右辺はRangeを返すので、タイプが違うというエラーになりそうな気がします。
    • good
    • 1
この回答へのお礼

アドバイスありがとうございます。
Worksheetの件はworksheet(1)でも同様のエラーが出てきました。小文字の件は完全に自分の怠慢によるものです。スミマセンデシタ。
変数宣言mに関してはworkbookをobjectに変えてみてやってみたいと思います。

お礼日時:2021/06/18 15:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング