2016-05-06 17 views
1

VBAにはまったく新しいですが、JavaとCでのプログラミングはかなり大変です。ByRef引数型の不一致、Excel VBA

残念なことに古典的なエラーと思われるものがあります。この問題を抱えた他の人々は、問題と同じ根拠を持っていないようです。その理由は、関数呼び出しでフラグが見つかった他の投稿のエラーです。関数定義上の私のエラーフラグ!

宣言:

Dim aktier() As String 
ReDim aktier(antalTr) As String 
Dim unikaAktier() As String 
ReDim unikaAktier(antalTr) As String 

Dim antalTr As Integer 
Dim Kop As Integer 
Kop = 1 
Dim Salj As Integer 
Salj = 2 
Dim antalUnika As Integer 
antalUnika = 0 

forループで関数呼び出し。ここにはエラーフラグはありません。

For o = 1 To antalUnika 
    Cells(o + 1, 3).Value = snittInkopEllerSalj(unikaAktier(o), antalTr, Kop) 
    Cells(o + 1, 4).Value = snittInkopEllerSalj(unikaAktier(o), antalTr, Salj) 
Next o 

機能。最初の行にフラグを立てる。

Function snittInkopEllerSalj(bolag As String, antalTr As Integer, InUt As Integer) As Integer 

Dim totKopSalj As Integer 
Dim totAktier As Integer 
totKopSalj = 0 
totAktier = 0 

For i = 1 To antalTr 
    If Sheet1.Cells(i, 4).Value = bolag Then 
     If InUt = 1 Then 
      If isCorrectTrans(i, InUt) = True Then 
       totKopSalj = totKop + Sheet1.Cells(i, 7) 
       totAktier = totAktier + Sheet1.Cells(i, 5) 
      End If 
     Else 
      If isCorrectTrans(i, InUt) = True Then 
       totKopSalj = totKop + Sheet1.Cells(i, 7) 
       totAktier = totAktier + Sheet1.Cells(i, 5) 
      End If 
     End If 
    End If 
Next i 

snittInkopEllerSalj = Round(totKopSalj/totAktier) 

End Function 

なぜこのエラーが発生するのか理解できません。私はすべてがよく定義されているように感じる?

+0

'int'を使用する代わりに' long'を試してください。 – findwindow

答えて

0

常にすべてのモジュールの最初の行にOption Explicitを置く必要があります。これにより、すべての変数を宣言する必要があります。

欠落している変数宣言をすべて追加すると、コードが機能するはずです。 はまた、antalTrはあなたの問題に関連していないReDim aktier(antalTr) As String

でそれを使用する前に宣言しますが、する必要があります:あなたはIntegerタイプを使用しないでください

  • 。代わりにLongを使用してください。 VBAの整数はわずか16ビットですが、今日のコンピュータは16ビットのレジスタを持たないため、とにかく32ビットの長さで格納されます。さらに、32767境界を壊す心配もありません。
  • 明示的に機能の範囲を指定してください。先頭に「Private」または「Public」と入力しないと、後者がデフォルトになります。
  • すべてのパラメータは、デフォルトで参照(ByRef)によって渡されます。あなたがしたくない場合は、Sub宣言またはFunction宣言の中でパラメータ名の前にByValを入れてください。
関連する問題