質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

5643閲覧

オーバーフローを回避?出さなくしたい

Naoko_Coco

総合スコア54

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/05/28 07:51

いつもありがとうございます。
先日までは普通に動いていたんですが、他のBOOKからマクロを動かしたらオーバーフローとなってしまいました。
更に単体で動かしてもオーバーフローとのエラーが出てしまいます。

VBA

1Sub SQL抽出() 2 3Dim firstday As String 4Dim lastday As String 5Dim jan As Variant 6Dim path As String 7Dim wbpi As Workbook 8Dim wb As Workbook 9Dim re As String 10Dim r As Long 11Dim s As Long 12Dim i As Long 13 14 15Set wbpi = ThisWorkbook 16firstday = wbpi.Worksheets("グラフ").Range("B2") 17lastday = wbpi.Worksheets("グラフ").Range("D2") 18jan = wbpi.Worksheets("グラフ").Range("B3")

最終行でjanに値を入れるとオーバーフローになります。
当初、String型にしていたのですが、それでオーバーフローになってしまったので
Variant型に変更したんですが、それでもオーバーフローになります。
変数Janの名の通りに、Janコードが入ります。
1つの場合もありますが、複数の場合には、4902705116542,4901730077583のようにカンマ区切りの値が入ります。
末に.valueをつけてもダメです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2019/05/28 07:58

変数宣言しないでやったらどうなりますか?(Option Explicit宣言してたらコメントアウトしてください)ステップ実行して変数janの型が何になるか見てみてください。
otn

2019/05/28 07:59

エラーメッセージを書いてください。
Naoko_Coco

2019/05/28 08:22 編集

ttyp03さん 変数宣言しないというのはどういうことでしょうか? 型を指定しないということでよい?それでもオーバーフローしてしまうので janに値が入らずTypeNameまで行ってくれないです。 janはEmptyのままです。 otnさん エラーメッセージは 実行時エラー6でオーバーフローしました。です。
ttyp03

2019/05/28 08:26

Dim janの行をコメントアウトするということです。 VBAは宣言しなくても自動で最適な型で動作する仕組みがあります。
Naoko_Coco

2019/05/28 08:34

やりました。 どうやら、janが1つしかないときにオーバーフローするようです。 カンマがついているときにはStringで読み込んでます。
Naoko_Coco

2019/05/28 08:44

cLngやcStrで突っ込んでもオーバーフローになります。
ttyp03

2019/05/28 08:46

こちらで試してみたけど、何をやってもエラーにならないんですよね。
ttyp03

2019/05/28 08:46

少なくとも複数個入る可能性があるなら、Stringを使うのは正しいと思います。
Naoko_Coco

2019/05/28 08:49

他のBookでも同じような処理やってるんですが、そっちはオーバーフローにもならず、ちゃんtStringで入ってるんですよね。。。 なんで急にオーバーフローになってしまったのか。。。謎なんです。。。 なんか解決策ってありますでしょうか?
Naoko_Coco

2019/05/28 08:55

原因がわかりました! セルの書式が日付になってました。 これを標準にすることで問題なく値を受け取れました! 今までできてたってことはだれかいじったのかな?
ttyp03

2019/05/28 08:57

あまりお役に立てなかったですけど、原因わかってよかったです。
Naoko_Coco

2019/05/28 09:00

いえ、こちらこそいつもありがとうございます。 また、よろしくお願いします。
PineMatsu

2019/05/28 09:07

Janコードが1つの時、セルのプロパティを文字列にすればどうでしょうか?「4902705116542」って4バイト符号付き整数を超えちゃうので、VBAではDouble型か文字列で持つしかないように思います。
Naoko_Coco

2019/05/29 06:22

PineMatsuさん janを読み込む前に書式を変更にしました。 wbpi.Worksheets("グラフ").Range("B3").NumberFormatLocal = "@" これをいれたところ、思い通りに動いてくれました。 ありがとうございます。
guest

回答2

0

解決したと思い込んでいるようですが、本質的には解決していません。

これを標準とすることでオーバーフローがなくなりました。

セルの書式を標準にするということは、入力された値が何かExcel君の判断にまかせるということです。
数値ぽっい値を入力すると、数値だろうと判断して、数値の書式を自動で適用するということです。
これは便利なんですが、Excel君が判断間違いすることもあります。
たまたま、うまくいっているだけで、場合によってはうまく判断してくれない可能性が残ります。

当初、String型にしていたのですが、それでオーバーフローになってしまったので
Variant型に変更したんですが、それでもオーバーフローになります。

まず、JANコードは数字の羅列ですが、数値ではありません。
数字(文字)の羅列ですので、String型にすべきです。
Variant型はどんな型でも代入出来て便利なんですが、これもどのような型になるのか曖昧なので想定通りの動きにならない危険性を含んでいます。

結論として、JANコードの場合、最善の方法は、
セルの書式設定は「文字列」にして、
変数は String型にすべきです。

ついでに言うと、

vba

1Dim firstday As String 2Dim lastday As String

これも、変数名からいうと、日付データを格納するのだと思いますが、
だとしたら、String型でなく、Date型で宣言すべきです。
代入するセルの書式設定は、日付にします。

データ型を曖昧にしておくと、思わぬところで想定外の動作になる危険性があります。

投稿2019/05/28 11:03

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Naoko_Coco

2019/05/29 02:31

回答ありがとうございます。 なぜかjanを読み込む際に日付形式になってしまうので 読み込む前に文字列に書式設定を変更するコードを入れました。 型もStringにしてあります。 日付データも最終的に文字列変換するのでStringにしてます。 アドバイスありがとうございます。
guest

0

自己解決

原因がわかりました。
セルの書式設定が日付になってました。
これを標準とすることでオーバーフローがなくなりました。

お騒がせしました。

投稿2019/05/28 08:57

Naoko_Coco

総合スコア54

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2019/05/29 07:57

やはり書式でしたか。良かったですね。
Naoko_Coco

2019/05/29 08:03

janを読み込む前に書式を変更するコードを書いて、無事にできました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問