none
VBAでbenefitという変数名を使えない RRS feed

  • 質問

  • Office Professional Plus 2016です。

    Access VBAでbenefitという単語を使うと値を代入できません。

    Dim benefit As Long

    benefit=0

    とし、この次の行にブレークポイントを設定して、benefitの値を確認すると「benefit=」となっています。

    変数名を、たとえば、benにすると「ben=0」と表示されます。

    試行した結果、「benef」までの綴りなら問題ありませんが、「benefi」「benefit」「benefits」はダメでした。

    benefitという単語は何かのキーワードなのでしょうか?

    2020年9月16日 22:22

すべての返信

  • 同じバージョンのAccessで試しましたが、再現しませんでした。

    普通にbenefitという変数が使え、問題ありませんでした。

    何か他の条件があるとかではないでしょう?


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2020年9月17日 2:25
    モデレータ
  • Office Professional Plus 2016です。

    当方も同じです。

    なお、[ファイル]-[アカウント]で表示されるバージョン情報には下記の記載がありました。

    • バージョン 2008 (ビルド 13127.20408 クイック実行)
    • Microsoft® Access® 2016 MSO (16.0.13127.20266) 32 ビット

    Access VBAでbenefitという単語を使うと値を代入できません。

    As Long で宣言した変数が認識されていないようですね。実際のデータ型は何になっていますか?

    当方でも、「新規に作成したデータベースファイル」で、「標準モジュール」上に、「Option Explicit を指定した上で benefit への代入を実施」しましたが、現象を再現できませんでした。

    2020年9月17日 2:28
  • みなさん、回答ありがとうございます(代表としてここに回答させてもらいます)。

    従来Excelで管理していた管理情報をAccess化するために、現在、ExcelのデータをAccessのテーブルに取り込むルーチンを、Access VBAで書いており、その中での現象でした。

    会社PCのAccessとExcelで試したら正常でした。

    なので、何がどう影響しているかはわかりませんが、私のPC環境のせいだと思われます。

    別の変数名に変えて対応します。

    お騒がせしてすみませんでした。

    魔界の仮面弁士さんへの回答:

    >As Long で宣言した変数が認識されていないようですね。実際のデータ型は何になっていますか?

    Dim benefits As Longbenefits = ws.Cells(row, PI_BENEFIT)

    (wsはWorksheetオブジェクト、rowは行、PI_BENEFITは”N”と定義している)

    Excelでの値は「4000」で表示形式は「通貨」(実際の表示は「4,000」)となっっており、同じ設定の他のセル値は読めています。

    2020年9月17日 10:22
  • >As Long で宣言した変数が認識されていないようですね。実際のデータ型は何になっていますか?

    Dim benefits As Long
    benefits = ws.Cells(row, PI_BENEFIT)

    (コード中の改行が失われていたと思うので補完しました。)

    最初の質問にあった
     『benefit=0』として、その代入直後の行で一時停止させた時に
     『benefitの値を確認すると「benefit=」となっています』
    というのはどこの事なのでしょうか?
    今回提示頂いたものは、最初の検証コードよりも複雑になってしまっているように見えます。

    私の投稿は原因を探るために、前提条件をできる限り単純化して、
    「(既存ファイルではなく)新規に作成した .accdb ないしは .mdb ファイル」上で、
    「(Access Form や Excel Worksheet 等を一切使わずに)標準モジュール」にて、かつ、
    「(スペルミス等を避けるために)Option Explicit を明示的に記述する」
    という条件を満たした場合にも、現象を再現できるのかを確認して頂きたいという意図の物でした。分かりにくく申し訳ありません。

    どのように検証されたのか不明瞭な点はありますが、本当に As Long な変数であれば、整数を保有せずに『「benefit=」となってしまう』ことはありえないはずです。ですから、実行環境の異常か、確認手段のミスのいずれかを疑っています。

    先のコードで TypeName を使ってみせたのも、benefit が変数として扱われず、Long 以外(String、Empty、あるいは何らかのオブジェクト型)の値となっている可能性を疑ったためです。たとえば benefit という列を持つテーブルをバインドした Form 上でテストした場合、TypeName(benefit) が "AccessField" という文字列を返してくるかもしれません。


    現時点では、特定の Access データファイル固有の問題なのか、あるいは検証の仕方に問題があったのか、それとも Office の不具合なのかなどなど、問題箇所を判断できるだけの情報が揃っていません。また、他の環境で再現できていないことから、問題箇所の調査は御自身で行っていただくしか無いでしょう。

    そう頻繁に起こるものでは無いにせよ、この手の不具合を起こす要因は幾つか考えられます。たとえば、データベースや参照設定の破損が原因で引き起こされることもあります。あるいは、EXE のプロパティの OS 下位互換設定を有効にしていた場合に、VBA の動作に支障が生じるという事例も報告されています。

    アドインや常駐ソフトウェアが動作不良の原因となることもありますし、特定の OS バージョンで障害が発生するケースもあります。

    あるいは、Office に対して自動配信される修正プログラムの、一時的な不具合によって引き起こされる可能性もあるかもしれません。(なので私の投稿では、実環境の具体的なバージョン情報まで記載してあります)

    こうした調査をすっ飛ばして、修復セットアップもしくは Office の再インストールを実施、それでも駄目ならば OS ごと入れなおす…という対処療法もありますが、手間がかかる割に、再発する可能性を排除できません。なによりも原因が Office 本体ではなく、特定の .accdb/.accde や .mdb/.mde に起因している物であった場合、無駄な作業となってしまいますね。


    2020年9月18日 1:00
  • 最初のコードは問題が発生する箇所を簡単化したつもりのコードでしたが、そのために、混乱させたかもしれません。

    前後のコードは次のようになっています(他の部分は割愛)。

        Dim arrived As Date
        Dim received As Date
        Dim prefecturecode As String
        Dim societyname As String
        Dim membername As String
        Dim ages As String
        Dim cooptype As String
        Dim units As Long
        Dim reason As String
        Dim benefits As Long
        Dim centralshare As Long
        Dim localshare As Long

                arrived = ws.Cells(row, PI_ARRIVED)
                received = ws.Cells(row, PI_RECEIVED)
                prefecturecode = ws.Cells(row, PI_PREFECTURECODE)
                societyname = ws.Cells(row, PI_SOCIETYNAME)
                membername = ws.Cells(row, PI_MEMBERNAME)
                ages = ws.Cells(row, PI_AGES)
                cooptype = ws.Cells(row, PI_COOPTYPE)
                units = ws.Cells(row, PI_UNITS)
                reason = ws.Cells(row, PI_REASON)
                benefits = ws.Cells(row, PI_BENEFITS)
                centralshare = ws.Cells(row, PI_CENTRAL)  <==ここにブレークポイントを設定
                localshare = ws.Cells(row, PI_LOCAL)

    ws.Cellsにマウスカーソルを置くと「ws.Cells(row, PI_BENEFITS)=4000」と表示されますが、benefitsにマウスカーソルを置くと「benefits=」と表示されます。さらに、変数名がbenefなら正常、benefiならダメという現象です。

    環境は、Windows 10 Pro(1909) ビルド18363.1110、AccessとExcelは「バージョン 2008 ビルド13127.20408クイック実行」です。

    これ以上みなさんの時間を取ることも申し訳ないので、この問題は閉じたいと思います。

    2020年9月18日 11:56
  • ws.Cellsにマウスカーソルを置くと「ws.Cells(row, PI_BENEFITS)=4000」と表示されますが、benefitsにマウスカーソルを置くと「benefits=」と表示されます。さらに、変数名がbenefなら正常、benefiならダメという現象です。

    ようやくわかりました。

    デバッガのツールチップの話をされていたのですね?

    2020年9月18日 12:07