以下のマクロ実行時にたまにオーバーフローが出てしまい
マクロが止まってしまうときがあります。

毎回出るのであれば、原因を突き止めやすいのすが、
出なくなると全く出なくなりとても困っています。

もしわかる方がいらっしゃいましたら、御教授して頂けると
幸いです。



内容:データが元々10個単位であり、Sheet1に500×10、
Sheet2に500×10のデータを2次元配列に格納する。


Dim RES_CAM1(1 To 4000, 1 To 10) As Integer
Dim RES_CAM2(1 To 4000, 1 To 10) As Integer

Sub Macro10()
'
'
Dim i, j As Integer

....................................................
....................................................

Sheets("Sheet1").Select
For i = 1 To 500
For j = 1 To 10
RES_CAM1(i, j) = Cells((i - 1) * 10 + j, 19) ← ☆
Next j
Next i

Sheets("Sheet2").Select
For i = 1 To 500
For j = 1 To 10
RES_CAM2(i, j) = Cells((i - 1) * 10 + j, 19) ← ☆
Next j
Next i


....................................................
....................................................

End Sub



上記☆のところでオーバーフローで止まったりします。。。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

NO.2です。



>ただやはり、Integerでもうまくいくときがあるのが???
19列(S列)の全ての値が
32,767未満だったらエラーにならないはずですが

ヘルプより
整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、
-32,768 ~ 32,767 の範囲の値をとります。
    • good
    • 0
この回答へのお礼

ありがとうございました。
意図していない箇所で32767を越えた値が入っておりました。
大変お騒がせしてごめんなさい!!

何度も本当にInteger宣言していて、32767以上が入っていない
かを確認することを気付かせてくれて本当にありがとうござい
ました。

お礼日時:2007/04/17 19:16

こんにちは。



質問の回答ではないですが。

Sheet1とSheet2に対して、同じ処理をしていますね。しかもシートを開く必要がない処理です。
たいていの処理はSelectやActineをしないで出来ます。あと、プロパティは省略しない方がいいです。
2つをまとめると

For i = 1 To 500
For j = 1 To 10
RES_CAM1(i, j) = Worksheets("Sheet1").Cells((i - 1) * 10 + j, 19).Value
RES_CAM2(i, j) = Worksheets("Sheet2").Cells((i - 1) * 10 + j, 19).Value
Next j
Next i

このようになります。どうでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました。
なるほど、こっちの書き方のほうがスマートっぽいですね。

お礼日時:2007/04/16 15:17

19列(S列)の値が32,767を越えた時エラーになります。


RES_CAM1,RES_CAM2 は、LONGで宣言すべきです。

質問とは直接関係ありませんが、
Dim i, j As Integerと宣言すると
i はバリアント型になります。
Dim i As Integer, j As Integer
又は、
Dim i As Integer
Dim j As Integer
と宣言します。
    • good
    • 0
この回答へのお礼

ありがとうございました。

ただやはり、Integerでもうまくいくときがあるのが???
になっています。

お礼日時:2007/04/16 15:16

ぱっと見て思っただけですが、


Dim RES_CAM1(1 To 4000, 1 To 10) As Long
Dim RES_CAM2(1 To 4000, 1 To 10) As Long

でもダメですか?Integerで扱える範囲を超えているものがあるだけのように感じましたが…
    • good
    • 0
この回答へのお礼

ありがとうございました。
2の方もおっしゃられていたようにLongですか。
配列に入れるデータの中身が-32767~32768までだったので
Integer宣言したのがまずかったのかな。

お礼日時:2007/04/16 15:13

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qvbaでオーバーフローしてしまいました。

Dim i As Long
Dim k As Long
For i = 1 To 829
For k = 1 To 995
Worksheets("2").Cells(k,i) = Worksheets("1").Cells(k,i) /Worksheets("1").Cells(996,i)
Next k
Next i

これを実行したらオーバーフローしてしまい、途中までしか計算できませんでした。
解決方法を教えて頂きたいです。よろしくお願いします。

Aベストアンサー

以下のように変更してみてください。

Sub test()
  Dim i As Long
  Dim k As Long
  
  For i = 1 To 829  '←EXCEL2007 ならOK /EXCEL2007以外の場合は 256まで
    For k = 1 To 995
      If Val(Worksheets("1").Cells(k, i)) > 0 And _
        Val(Worksheets("1").Cells(996, i)) > 0 Then
        '0/0 の場合はオーバーフローになるので
'0以外の時のみ計算する
        Worksheets("2").Cells(k, i) = Worksheets("1").Cells(k, i) / Worksheets("1").Cells(996, i)
      End If
    Next
  Next
End Sub

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QVBAで一時的にオーバーフローを回避したい

こんにちは

とあるハッシュ値のようなものを作成するプロセスで困っています。

次のようなコードを書いています。

Dim MAXLONG As Long
MAXLONG = &H7FFFFFFF 'Long型の正の数の上限です。

result = num1 * num2
If ( result > MAXLONG) Then
'数値を減らす処理

計算結果が Long 型の最大値を超えている場合に上限に収まるよう調整する処理をしたいのですが、最大値を超えている時点で result 変数に格納できずにエラーになってしまいます。

変数を事前にすべて As Long で宣言し、数値ではなく &H付きの 16 進数で代入してみたり、Clng() で囲ってみたり・・・いろいろ試したのですができません。

最終的には Long 型の範囲内に収めてその数値を使いたいのですが、一時的に溢れたかどうかをどのように判定すればよいのでしょうか?

補足すべき事があれば教えてください。

Windows 7 Pro 64bit Excel 2007 (これは32bit)

こんにちは

とあるハッシュ値のようなものを作成するプロセスで困っています。

次のようなコードを書いています。

Dim MAXLONG As Long
MAXLONG = &H7FFFFFFF 'Long型の正の数の上限です。

result = num1 * num2
If ( result > MAXLONG) Then
'数値を減らす処理

計算結果が Long 型の最大値を超えている場合に上限に収まるよう調整する処理をしたいのですが、最大値を超えている時点で result 変数に格納できずにエラーになってしまいます。

変数を事前にすべて As Long で宣言し、数値ではなく &H付きの 16...続きを読む

Aベストアンサー

num1,num2を16ビット.8ビット,8ビットに分解します

num1=n1h * 2^16+n1m*2^8+n1l
num2=n2h * 2^16+n2m*2^8+n2l

num1*num2を計算すると
(n1h*n2h)*2^32
+(n1h*n2m+n1m*n2h)*2^24
+(n1h*n2l+n1m*n2m+n1l*n2h)*2^16
+(n1m*n2l+n1l*n2m)*2^8
+ n1l*n2l
となります。

(n1h*n2h)*2^32 から、 n1h*n2h<>0 ならば、33ビット以上が確実です。
n1h*n2h=0なら、残りが32ビット以上(2^31以上)ならMAXLONG超となります。

n1h*n2m+n1m*n2hは 16bit*8bitで最大24bit、24bit+24bitで最大25bitなのでオーバーフローはありません
この値を m3=m3h*2^7+m3l (m3lは7ビット分) とすると
+(n1h*n2m+n1m*n2h)*2^24
= (m3h*2^7+m3l ) * 2^24
= m3h*2^31 + m3l * 2^24
よって、m3h>0ならMAXLONG超となります。

同様に
+(n1h*n2l+n1m*n2m+n1l*n2h)*2^16
は 24bit+24bit+16bitで最大26bit 。 m2=m2h*2^15+m2lとすると
= (m2h*2^15+m2l ) * 2^16
=m2h*2^31+m2l*2^16

m3l * 2^24+m2l*2^16 = (m3l*2^8+m2l)*2^16
k=m3l*2^8+m2l = kh * 2^15+kl とすると
(m3l*2^8+m2l)*2^16
= kh*2^31+kl*2^16

+(n1m*n2l+n1l*n2m)*2^8 + n1l*n2l はオーバーフロー無しで計算できるので
kl*2^16 +(n1m*n2l+n1l*n2m)*2^8 + n1l*n2l > MAXLONG
kl*2^16 > MAXLONG - ((n1m*n2l+n1l*n2m)*2^8 + n1l*n2l)


これは、大小判定のみにして、余計な計算を省いたものです。

「'数値を減らす処理」が「オーバーフローした桁を無視する」なら、
-MAXLONG + kl*2^16 +(n1m*n2l+n1l*n2m)*2^8 + n1l*n2l
で求められます。

しかし、resultから足したり割ったりするなら、上記で計算を省略した X * 2^31 の部分が必要です。
こちらだと、「多倍長数」「任意精度数」と呼ばれる手法が必要です。

例えば
num1=n1(0)+n1(1)*2^8+n1(2)*2^16+n1(3)*2^24
として
result=num1+num2

d=n1(0)+n2(0)
r(0)=d mod 256 ' dの下8bit
c = d \ 256 '繰り上がり分
d=n1(1)+n2(1)+c '繰り上がり分を足す
r(1)=d mod 256
c = d \ 256
....
と筆算の要領で「桁」毎に計算します。

あるいは、外部の多倍長精度ライブラリをアドオン等の形でVBAに取り込む方法があります。
試していませんが、検索で最上位に来たものです。
http://supermab.com/biginteger.html

num1,num2を16ビット.8ビット,8ビットに分解します

num1=n1h * 2^16+n1m*2^8+n1l
num2=n2h * 2^16+n2m*2^8+n2l

num1*num2を計算すると
(n1h*n2h)*2^32
+(n1h*n2m+n1m*n2h)*2^24
+(n1h*n2l+n1m*n2m+n1l*n2h)*2^16
+(n1m*n2l+n1l*n2m)*2^8
+ n1l*n2l
となります。

(n1h*n2h)*2^32 から、 n1h*n2h<>0 ならば、33ビット以上が確実です。
n1h*n2h=0なら、残りが32ビット以上(2^31以上)ならMAXLONG超となります。

n1h*n2m+n1m*n2hは 16bit*8bitで最大24bit、24bit+24bitで最大25bitなのでオーバーフローはありません...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Q【エクセルVBA】「インデックスが有効範囲にありません」というエラーがでます

こんにちは。VBA初心者ですが、下記コードを実行すると
エラーが出てしまいました。

シート(シート1)のセルから別シート(シート2)のセルに
値のみコピーするVBAを組んでいます。
適宜、シート1に入力したものを読みこませていきたいので
変数を使用しています。

-------------------------------------------------------------
Sub セルのコピー()

Dim X As Integer

X = 3
Y = 2
Do While Cells(X, "A").Value <> ""
Sheets("シート1").Cells(X, "A").Copy

Sheets("シート2").Activate
Sheets("シート2").Cells(Y, "F").PasteSpecial _ Paste:=xlPasteValues ⇒エラー対象
Application.CutCopyMode = False

X = X + 1
Y = Y + 1

Loop

End Sub

------------------------------------------------------------
つまり、シート1のA3セルを先頭にA4,A5,A6・・・と続くセルの値
をシート2のF2を先頭としたセル(以下、F3,F4・・・)に値のみコピー
していきたいのですが。。

実行すると「インデックスが有効範囲にありません」というエラーが
でます。デバック対象は上記、「⇒エラー対象」の構文です。

変数の設定の仕方がおかしいのでしょうか。。
ご教示のほどよろしくお願いいたします。

こんにちは。VBA初心者ですが、下記コードを実行すると
エラーが出てしまいました。

シート(シート1)のセルから別シート(シート2)のセルに
値のみコピーするVBAを組んでいます。
適宜、シート1に入力したものを読みこませていきたいので
変数を使用しています。

-------------------------------------------------------------
Sub セルのコピー()

Dim X As Integer

X = 3
Y = 2
Do While Cells(X, "A").Value <> ""
Sheets("シート1").Cells(X, "A").Copy

Sheets("シート2").Activat...続きを読む

Aベストアンサー

>Sheets("シート2").Cells(Y, "F").PasteSpecial _ Paste:=xlPasteValues ⇒エラー対象
で、「PasteSpecial _ Paste:=xlPasteValues」 の “_” を消去してください。
また、
 Sheets("シート2").Activate で "シート2" を Activate にすると、 Do Loop の頭に返ってきたとき、
 Do While Cells(X, "A").Value <> "" の Cells(X, "A") は "シート2" の Cells(X, "A") を見に行きますので、 思っているような動作はしません。
 最後の Loop の前に、 Sheets("シート1").Activate を入れるか、While の後の Cells(X, "A").Value の頭に、Sheets("シート1"). をつければ、この問題を回避することができます。

コピー先のシートは、アクティブにしなくても、ペーストする方法があります。

あなたのコードを少し変更します。

 Sub セルのコピー2()
   Dim X As Integer, Y As Integer

   X = 3
   Y = 2
   Do While Cells(X, "A").Value <> ""
     Sheets("シート1").Cells(X, "A").Copy Destination:=Sheets("シート2").Cells(Y, "F")
     X = X + 1
     Y = Y + 1
   Loop
   Application.CutCopyMode = False
 End Sub

注) 使っているブラウザの見る条件によって、「Sheets("シート1").Cells(X, "A").Copy Destination:=Sheets("シート2").Cells(Y, "F")」と「Destination:=Sheets("シート2").Cells(Y, "F")」が2行になったように見えることがあるかもしれません。 2つのコードはスペースを1つはさみ、続けて書いてください。

変更したコードの場合、"シート1" が常時表示されたままになります。

行数が200行くらいとのこと、速度を早くしたい場合は、最初に
 application.ScreenUpdating=False
最後に、
 application.ScreenUpdating=True
を加えます。

なお、シート名は "Sheet1" ですか、"シート1"ですか、どちらかに揃えましょう。 、"シート1"と、"シート2"がブックの先頭から順になっているときは、シート名を使わなくてそれぞれ Sheets(1)、Sheets(2) でもいけます。 (1)、(2) は左から 1番目のシート、2番目のシートという意味です。

試してみてください。

>Sheets("シート2").Cells(Y, "F").PasteSpecial _ Paste:=xlPasteValues ⇒エラー対象
で、「PasteSpecial _ Paste:=xlPasteValues」 の “_” を消去してください。
また、
 Sheets("シート2").Activate で "シート2" を Activate にすると、 Do Loop の頭に返ってきたとき、
 Do While Cells(X, "A").Value <> "" の Cells(X, "A") は "シート2" の Cells(X, "A") を見に行きますので、 思っているような動作はしません。
 最後の Loop の前に、 Sheets("シート1").Activate を入...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Qなぜオーバーフローになるのでしょうか。

VB6です。 こんな現象初めてでびっくりしました。
変数A、h、mはLong型です。
A = 9 * 3600 + 54 * 60 ->オーバーフロー発生

A = 35640 ->オーバーフローにならない

h = 9 : m = 54
A = h * 3600 + m * 60 ->オーバーフローにならない

変数ではなく、実数で計算するとオーバーフローする意味がわかりません。また、計算結果を直接実数で代入した場合、なぜオーバーフローは
発生しないのかも意味不明です・・・

なぜ、オーバーフローが発生したりしなかったりするのでしょうか。

Aベストアンサー

何の指定もなく実数(整数)で計算を行うとInteger型で
計算されるからです。

A = CLng(9) * CLng(3600) + CLng(54) * CLng(60)
または
A = CLng(9 * 3600) + CLng(54 * 60)
として下さい。

Q単純【エクセルVBA】なぜオーバーフローになる?

環境
Excel2003
Win7 64bit

--------------
Const C as Currency = 50000000

Sub Test()
  Dim A as Currency
  Dim B as Currency

  B = 6823695200
  A = B \ C '←ここでオーバーフロー
End Sub
---------------

「A = B \ C」
↑この式はオーバーフロー時、ウォッチ式上では、
型: Integer と表示されますが、これも不思議。

また、「A = B \ C」を、
A = CCur(B) \ CCur(C)
としても、オーバーフロー。

それと、
「Const C as Currency = 50000000」を、
「Const C = 50000000」 としても、同様にオーバーフロー。

Currency型は、
-922,337,203,685,477.5808~922,337,203,685,477.5807
のはず。

このオーバーフローは、一体なぜ?

Aベストアンサー

>どのようにして行えば良いのでしょうね。

No2です。
先のの回答に書いたんですけどねぇ。
A = Int(B / C)
通常の余算演算子 / を使用します。
小数点以下を切り捨てる場合は Int() 関数で切り捨てます。


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

人気Q&Aランキング

おすすめ情報