• ベストアンサー

変数にいれる値

企業毎にシートに分け集計させている集計表があるのですが 他シートから日付をとりMonthで月の数値を取得し3列の詳細項目の後に集計させています。 tugi = 3 + Month(.Cells(list_cnt, intBASE)) 例えば取得した日付が4月であれば7列目に集計させています。 現在は1月初まりなので3列の説明項目後に集計させているのですが 今後4月初まりとなるので、 tugi = Month(.Cells(list_cnt, intBASE)) と書き換えたのですが「型が違います」とでてしまいます。 tugi = 0 + Month(.Cells(list_cnt, intBASE)) としても同じエラーでだめでした。 試しに tugi = 1 + Month(.Cells(list_cnt, intBASE)) としたら正常に実行できました。 あまりVBAには詳しくないのでこれ以上どう修正したらいいのか わかりません。 何かご指摘頂けたらありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.8

ANo.4です。 >>tugi = IIf(IsDate(.Cells(list_cnt, intBASE)), Month(.Cells(list_cnt, intBASE)), 0) >こちらですがエクセルVBAなので >tugi = If(IsDate(.Cells(list_cnt, intBASE)), Month(.Cells(list_cnt, intBASE)), 0) ExcelVBAですけど、IfではなくIIfですよ。 >これは取得したデータが日付ならそのまま、その月を反映させそうでなければ0を代入するとうことですよね? その通りです。 しかし、"0"を代入する事が正しいかどうかは、現時点では不明ですので、 ANo.5で回答したようにIf文にて処理を分ける方がいいのかも。

その他の回答 (7)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.7

セルに何も入力されていない場合と文字として『スペース』が入力されている場合で動作が異なるようですよ 何も入力されていない場合 Monthは 12を返します スペースが入力されている場合 Error13 型の不一致となります IsDateなどで判断して処理を振り分けた方がよさそうです 何の入力されていないセルの場合 1899/12/31 を表すことになるようです

maki06
質問者

補足

redfox63さん 返信ありがとうございます。 >何も入力されていない場合 Monthは 12を返します 確かに12を返していました。 >IsDateなどで判断して処理を振り分けた方がよさそうです 他の方のコメント通りそうのようですね。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

使っている変数list_cntとintBASEについて、エラーの出るコード行の直前に Msgbox list_cnt Msgbox intBASE などを入れた場合、どう表示されますか。 そういうことは質問に書いてないのはどうしてかな。 ーー 小生の場合 VBAという言語の場合で 内容がビジネスでの使用の場合で ここのコーナーの質問に答える程度のレベルの場合、 ほとんどMsgboxで内容を表示して、変数の中身を見て、考えると解決できていますが。 ーー 正式には、VBAでのデバッグのやり方というのが数種ありますので、WEBや本で勉強して、使い慣れることです。 それと処理ロジックを簡素化することも含めて、プログラムでの思考訓練を経験で積むことです。 ーー プログラムをテストや実行するとき、プログラムコードに意識が行きがちですが、データの実情とプログラムコードとの相対関係で、エラーが出たり、止まったり、不適当な値になるので、意識切り替えが必要です。この質問もデータの推移・実情を中心にした質問の表現ではない。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.5

ANo.4です。 日付でない場合に以降に不具合が出るのであれば、事前に日付であるかのチェックが必要になります。 If IsDate(.Cells(list_cnt, intBASE)) Then ' ~今までの処理~ End If If ~ End If をどこに入れるかは、全体がわからないので明確には回答できません。 ご参考まで。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

MsgBox TypeName(.Cells(list_cnt, intBASE).Value) ' tugi = 0 + Month(.Cells(list_cnt, intBASE)) コメントにする Stop ' 一時中断 としてみて .Cells(list_cnt, intBASE) が本当に日付型であれば"Date"が表示されますが、それ以外であればエラーの要因と絞れるでしょう。 もしDateにならなく、且つ日付(シリアル値)で間違いないのであれば tugi = Month(.Cells(list_cnt, intBASE).Value2) とプロパティを明確にすることです。 或いはセル値に日付以外が含まれる場合があるのであれば、日付であるか判定した後、 代入する値を決めればいい。 例えば日付でない時は"0"とするのなら、 tugi = IIf(IsDate(.Cells(list_cnt, intBASE)), Month(.Cells(list_cnt, intBASE)), 0) とか。

maki06
質問者

補足

n-junさん 返信ありがとうございます。 プログラムは私が作成したものではないのですが、修正しなければ ならない環境にあります。 ある程度長さがあるので端折って掲載したいのですが、どこまで端折っていいのやら。。 >tugi = IIf(IsDate(.Cells(list_cnt, intBASE)), Month(.Cells(list_cnt, intBASE)), 0) こちらですがエクセルVBAなので tugi = If(IsDate(.Cells(list_cnt, intBASE)), Month(.Cells(list_cnt, intBASE)), 0) としたのですが赤く反転して実行できません。 これは取得したデータが日付ならそのまま、その月を反映させそうでなければ0を代入するとうことですよね?

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

エクセル2002を2003で実行させたい。 http://okwave.jp/qa4314504.html この時も「型が違います」というエラーだったようですが、結局未解決で閉じられたようですね。 コード全般を提示された方が早いと思ったのですけど。 違いますか?

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

エラーを起こしている行を特定しましょう 以前の質問でも『ここでエラーが起きている』と思い込みの投稿をなさっている節が見受けられます 修正してからエラーが出たのだから修正した部分でエラーが起きている というのは見当違いの場合がありますよ 修正したために 他の部分で予期せぬデータを関数やステートメントに与えてしまって起こっているエラーのように思います 修正した箇所にカーソル(キャレット)をおいて F9キーを押してブレークポイントを設定します この状態でこの関数(またはイベント)を実行して ブレークポイントで停止するまで実行させます その後 F8キーにより 1行ごとに実行していきましょう エラーの起こる行まで F8を押して確認してみてください 編集した行のコードだけではなくその周辺のコードも投稿した方が解決が早いと思います たとえば関数(またはイベントorサブプロシージャ)丸ごととか … 変数の用途や大まかな流れのコメントつきだとよりいいでしょう

maki06
質問者

補足

redfox63さん 返信ありがとうございます。 何回か実行してみてわかったのですが、他シートから日付データ を取得する時に空白が入っていると止まってしまいエラーになります。 >tugi = 0 + Month(.Cells(list_cnt, intBASE)) >としても同じエラーでだめでした。 >試しに >tugi = 1 + Month(.Cells(list_cnt, intBASE)) >としたら正常に実行できました。 この結果からtugiをintegerで宣言していますが空白の場合 0はtugiへ代入されないのでしょうか?

  • tossy005
  • ベストアンサー率38% (7/18)
回答No.1

>今後4月初まりとなるので、 >tugi = Month(.Cells(list_cnt, intBASE)) >と書き換えたのですが「型が違います」とでてしまいます。 関係ないとは思いますが、 4月はじまりになるからそのように書き換えるという意味が良くわかりません。 Month(.Cells(list_cnt, intBASE))の結果が 4以上ならばtugi = 3 + Month(.Cells(list_cnt, intBASE)) 4未満ならばtugi = 12 + Month(.Cells(list_cnt, intBASE)) になるのではないでしょうか。 また、「型が違います」と出るからには、型が違うのだと思います。 メッセージがtugi = Month(.Cells(list_cnt, intBASE))で出るならば、 変数tugiの型の確認と、.Cells(list_cnt, intBASE))の値がMonth関数で変換できるものなのかを確認したほうが良いと思います。

maki06
質問者

補足

tossy005さん 返信ありがとうございます。 >4未満ならばtugi = 12 + Month(.Cells(list_cnt, intBASE)) ですが端折っていますが対応済みです。 また変数tugiの型も確認済みです。

関連するQ&A