• ベストアンサー

変数にいれる値

企業毎にシートに分け集計させている集計表があるのですが 他シートから日付をとり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/17068)
回答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

  • VBA 得意先ごと且つ日付ごとに数値を集計したい

    あるエクセルシートを自動処理するVBAを作成しようとしています。 シートの内容は A日付列 B得意先コード列 C金額列 20091001 000001 \1,000 20091001 000001 \1,500 20091002 000002 \800 20091002 000001 \1,200 といった感じです。 これを、指定した日付で、且つ得意先コード毎に集計したいと考えています。(上記の例だと、コード000001得意先は20091001で\2,500、20091002で\1,200といった具合です) 現在、日付毎で集計するところまでは作成できたのですが、ここから得意先別で集計するにはどのようにコーディングすればよいでしょうか。 日付毎の集計は以下のようにしています。 cnt = 2 Total = 0 Do Until False '行が底に達したらループを終了します If Range("D" & cnt).Value = "" Then Exit Do End If     'D列の日付と指定の日付が合致したら If yearmonthday = Range("D" & cnt).Value Then 'L列の金額を取得しカウント Total = Total + CDbl(Range("T" & cnt)) '次の行を検索するための行数カウント cnt = cnt + 1 Else cnt = cnt + 1 End If Loop ご存知の方、どうぞ教えてください。

  • 制御方法について

    所属名毎にシートを作成し都道府県と所属名が一致したら集計させループさせたいのですがうまくいきません。 データには列135に所属名があり139に都道府県が入っています。 解約シートには6行目5列目から都道府県名が入っています。 最終が沖縄となるので沖縄が入れば抜けるようになっています。 今の状態で実行すると所属名の数毎、都道府県の件数を更にを集計してしまいます。 一度シートを作成した所属はFor~Nextを読み込まないようにしたいのですが 自分なりに制御させようと試みましたが上手く集計されません。 何かアドバイス等ありましたらお願いします。 Dim ingcnt As Integer Dim intHjn As Integer Dim strhjn As String Dim Areastrhjn As String Dim list_cnt As Integer Dim Arealist_cnt As Integer Dim (2) As Worksheet Dim Area_cnt As Integer With Worksheets("解約データ") Set (2) = Sheets("解約・所属別") list_cnt = 2 strhjn = "" Area_cnt = 5 '所属CD1毎のシート作成 Do While Trim$(.Cells(list_cnt, 1)) <> "" '(A列)が空白でない限り繰り返す If strhjn <> .Cells(list_cnt, 135) Then strhjn = .Cells(list_cnt, 135) Sheets("解約").Select Sheets("解約").Copy Before:=Sheets("解約") Sheets("解約(2)").Name = strhjn ActiveSheet.Cells(1, 15) = strhjn End If For Area_cnt = 5 To (2).Cells(6, (2).Columns.Count).End(xlToLeft).Column Area = (2).Cells(6, Area_cnt) Arealist_cnt = 2 Areastrhjn = "" Do While Trim$(.Cells(Arealist_cnt, 1)) <> "" '(A列)が空白でない限り繰り返す Areastrhjn = .Cells(Arealist_cnt, 135) 'エリア集計 If Areastrhjn = .Cells(Arealist_cnt, 135) And _ .Cells(Arealist_cnt, 139) = Area Then ActiveSheet.Cells(7, Area_cnt) = ActiveSheet.Cells(7, Area_cnt) + 1 End If Arealist_cnt = Arealist_cnt + 1 Loop If Area = "沖縄" Then Exit For Next list_cnt = list_cnt + 1 Loop End With End Sub

  • VBAで値の取得

    VBAで値の取得 osはxp エクセル2000です。 エクセルのシートに計算した値をVBAで入れたいと思います。 行数は変動します。 入れたい値は金額×数値です。なので切捨てになります。 計算式は  F3=TRUNC(1250*B3)+TRUNC(1000*C3)+TRUNC(1000*D3)+TRUNC(1250*E3) 添付のエクセル画面を参考にして下さい。 私が考えたもので、これからどのように変更すれば値の取得ができるでしょうか? Dim LastR As Long, Cnt As Long '最終行と行番号 LastR = Range("B65536").End(xlUp).Row For Cnt = 3 To LastR 'B3から最終行まで Cells(Cnt, 6).Formula = "=TRUNC(1800 * Cells(Cnt, 2)) + TRUNC(1350 * Cells(Cnt, 3))"    Next (もちろんエラーになります。)

  • エクセル リストボックスにセルの値を表示したい

    Sheet1に A1 a A2 i A3 u と入力されています。 フォームのリストボックスにこの3つのセルを表示したいのですが Private Sub UserForm_Initialize() UserForm1.ListBox1.ControlSource = Sheets("Sheet1").Range(Cells(1, 1), Cells(1, 3)) End Sub ではうまく行きません。 デバッグしてもなにも引っかからないのですが 実行すると 「実行時エラー13 型が一致しません」 となります。 「ControlSource」を「RowSource」に変えても同じでした。 ※列が移動するため列番号を変数で取得したいのでCellsを使用しています。 ご教授よろしくお願いします。

  • VBAの定義と印刷について

    VBAで下記の様に定義をして印刷していますが、sheet"AAA","BBB"と同じく 新しいsheet"DDD"もの一緒に印刷したい場合の定義はどうなるのでしょう!教えて頂けますでしょうか。 よろしくお願いします。 別sheetの"sheet1"A列 AAA,BBB,CCC          B列 1,2,3  として印刷フラッグがある。 VBAでは Sub sheet1印刷() CNT = 4 CNT1 = 1 CNT2 = 1 TAKE = 0 CK = 30 Do Until CNT2 = CNT Do Until CNT1 = 4 If Sheets("sheet1").Cells(CNT1, 1) = Sheets("sheet1").Cells(CNT2, 3) Then TAKE = Sheets("sheet1").Cells(CNT1, 2) Select Case TAKE Case 1: Sheets("AAA").PrintOut Copies:=1 Case 2: Sheets("BBB").PrintOut Copies:=1 Case 3: Sheets("CCC").PrintOut Copies:=1 End Select CNT1 = 1 Exit Do Else: CNT1 = CNT1 + 1 End If Loop CNT2 = CNT2 + 1 Loop End Sub

  • Excel VBA

    Excel VBAについて シート1にはデータが入ってます。 G列に日付、L列に商品名、N列に件数。 シート2には集計結果を入力したいです。 セルB2に、日付が10月1日から15日までで、商品名がAの件数の合計。 セルB3は、日付が10月16日から末日まで、セルB4は、日付が11月1日から15日までと半月毎に集計を半年後の末日まで繰返し、B2の数行下には、商品名Bの集計行を作り、その数行下には商品名Cの集計行を作りたいです。 これまでは関数SUMIFSで集計していましたが、複数店舗分のシートの更新・メンテナンスが大変なので、VBAでの集計を考えいろいろ調べてるのですが、方法が思い付かないので、ご教授ください。

  • EXCELのマクロで一覧表にハイパーリンクを付ける方法?

    EXCELで,簡単なカード型DBを作りたいので 以下のような一覧シートを作るマクロを作ったのですが シート名のセルにそのデータセルへのハイパーリンクを設定する方法がわかりません list_sheet.Cells(10 + cnt, 5).HyperLink = now_sheet.name & "!" & A9 とでもすればいいのでしょうか? どなたかよい方法を教えてください 以下は,自作マクロの一部です cnt = 0 For ix = 1 To Worksheets.Count Set now_sheet = Worksheets(ix) If now_sheet.Name <> "一覧" And InStr(1, now_sheet.Name, "Sheet") <> 1 Then cnt = cnt + 1 list_sheet.Cells(10 + cnt, 5) = now_sheet.name list_sheet.Cells(10 + cnt, 5).HorizontalAlignment = xlHAlignCenter list_sheet.Cells(10 + cnt, 6) = Format(now_sheet.Cells(5, 2), "yyyy/mm/dd") End If Next ix

  • ワークシート名を変数に格納する方法

    VBA初心者です。ワークシートが5つあり各シートにデータを転記するマクロを作成したいのですがワークシート名を変数にしてループ処理することはできるのでしょうか? 下記はワークシート名"H"にだけ転記するマクロを作成してみましたがこの後がわからず悩んでいます。よろしくお願いします。 Dim データ行 As Integer Dim cnt As Integer Dim データ数 As Integer cnt = 4 データ行 = Cells(Rows.Count, 8).End(xlUp).Row For データ数 = 11 To データ行   If Worksheets("入力").Cells(データ数,1).Value= "2"Then Worksheets("H").Cells(cnt, 6).Value = Worksheets("入力").Cells(データ数, 8).Value Worksheets("H").Cells(cnt, 7).Value = Worksheets("入力").Cells(データ数, 9).Value Worksheets("H").Cells(cnt, 8).Value = Worksheets("入力").Cells(データ数, 27).Value Worksheets("H").Cells(cnt, 9).Value = Worksheets("入力").Cells(データ数, 19).Value Worksheets("H").Cells(cnt, 10).Value = Worksheets("入力").Cells(データ数, 20).Value Worksheets("H").Cells(cnt, 11).Value = Worksheets("入力").Cells(データ数, 21).Value Worksheets("H").Cells(cnt, 12).Value = Worksheets("入力").Cells(データ数, 10).Value Worksheets("H").Cells(cnt, 13).Value = Worksheets("入力").Cells(データ数, 11).Value Worksheets("H").Cells(cnt, 14).Value = Worksheets("入力").Cells(データ数, 22).Value Worksheets("H").Cells(cnt, 15).Value = Worksheets("入力").Cells(データ数, 23).Value cnt = cnt + 1 End If Next データ数

  • エクセル2002を2003で実行させたい。

    エクセル2003で作成したものを修正したのですが 実行できなかったので2002で試してみたら実行できました。 VBAにはあまり詳しくなのですが、列を左に3列ずらすという だけのものなのでプログラムの中の記述で  tugi = 3 + tuki の3をとり tugi = tuki としただけのものです。 2002では実行できるのですが、これを2003で実行させようとすると 「型が違います」とエラーがでてしまいます。 何かアドバイスがありましたら宜しくお願いします。

  • ピボットテーブルのフィールドリストについて

    現在、ピボットテーブルでデータを集計していますが、月ごとの集計の仕方で悩んでいます。 ピボットテーブル作成はど素人です。 そこで、教えていただきたいのですが、 使っている経理のソフト(エクセル)があります(ネットでダウンロードしました)。 そのソフトでは、仕訳帳シートがピボットテーブルの元のシートになっていて、 別シートにピボットテーブルのシートがあります。 なぜか、仕訳帳シートにはない項目(フィールド)がピボットテーブルリストにはあり、 その方法を知りたいのです。 仕訳帳シートでは、日付の項目しかないのに、ピボットテーブルのフィールドリストには、「日付」のほかに「集計月」という名前のフィールドがあるんです。 この「集計月」のリストはどうやれば作れますか? ちなみに、グループ化という方法も試してみましたが、 まだ未定の行には日付が入力されていないため、 グループ化ができないみたいです。 エクセル2010です。 用語などよくわかっていないので、お手数ですが、わかりやすく教えていただけると助かります。 カテゴリがあっているのかわかりませんが、どうぞよろしくお願いいたします。