• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SGN関数を使った2つの動的配列の初期化判定)

SGN関数を使った2つの動的配列の初期化判定

Hayashi_Trekの回答

回答No.1

Sgn関数の引数に配列を渡しているけど、エラーにならないんですか? VBAのヘルプでは、「任意の数式を指定できる」となっているが配列は対象外では?

iori16
質問者

補足

動的配列を初期化(redim)されているかどうかを判定するのにsgn関数を使うというのはよく聞くテクニックなのですが、確かにSGN関数の本来の使い方とは異なるようです。だからこそ、どうしてこうなるのか仕組みを理解しておきたいのです。「not not」を使うなんて方法も書いてあるサイトもありますがこちらもどうしてこうなるかはよくわかっておりません。動的配列を初期化されているかどうか明確な方法が他にあるということであればもちろんそちらを使います。

関連するQ&A

  • 動的配列が存在(要素が有る)か否かを判定できますか?

    VBAで、「For ループが初期化されていません」エラーが発生します。 動的配列が要素0の時に発生するようです。 動的配列の要素が生成された場合だけ、Forループしたいのですが、 どうやって判定すればよいのでしょうか? ------------------------------- Dim 配列() As Integer Dim i As Integer i = 0 If (i < 0) Then ' 本当は真になったり偽になったり ReDim 配列(0 To i) 配列(i) = a + b i = i + 1 End If '' if ★★★ then '' 配列が有るか確認 For Each c In 配列 MsgBox c Next '' end if -------------------------------

  • C#で配列が空かを判定するには?

    C#で配列が空かどうかを判定するにはどうしたらようでしょうか? VB.NETではIsNothingで出来るのですが、C#の方法が分かりません。 -- C# --- int[] a={0,1,2}; int[] b; //bが空なのを判定したい --VB.NET--- Dim a() As Int16 = {0, 1, 2} Dim b() As Int16 MsgBox(IsNothing(a)) 'Falseを返す MsgBox(IsNothing(b)) 'Trueを返す ---- VS.NET2003/Windows2000Pro

  • VBA 乱数と配列

    VBA 乱数と配列 配列(0)~配列(5)の一次元配列の中に、1から6までの数字を重複しないように入れたいのですが、 上手くいきません。 ご指導の程、お願いします。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer Dim フラグ As Integer For カウントA = 0 To 5 Do サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop Until フラグ > 0 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • 複数の、Falseの判定方法について

    現在ゲームを作っているんですが、 どうしても、コーディングが、長くなってしまうので、 やりかたを教えて欲しいのですが、 複数の、オブジェクトの判定のやり方を、知りたいのです。 SHAPEを、コントロール配列にして、 0~4までが、全部Falseだったら、 チェックを入れる。 という風にしたいのです。 現在は If (Shape(0).Visible = False) And (Shape(1).Visible = False) And ~省略~ Then    hanntei = True 'Boolean形 end if という風に、全部書いてます。 まだまだ、SHAPEは増やす予定なので、 そうするとどうしても、長くなってしまうので、どうにかしたいのですが、思いつきません。 どなたか、教えてください。

  • シートの条件選択

    EXCEL2003で下記のようにユーザーフォーム上のオプションボタンと チェックボックスの選択状況に応じてシートを選択するようにしていました が、EXCEL2007で実行したら、「sel_sw」のところで 「コンパイルエラー:プロジェクトおよびライブラリが見つかりません」 とエラーが出てしまいました。 EXCEL2007ではどのように記述すればよいか、教えていただけますでしょうか。 よろしくお願いします。 --------------------------------------------------------------- Private Sub 印刷する_Click() UserForm9.Hide With UserForm9 If .OptionButton1 = False And .OptionButton2 = False Then MsgBox ("オプションボタン選択") GoTo error End If If .CheckBox2 = False And .CheckBox3 = False And .CheckBox4 = False And .CheckBox5 = False Then MsgBox ("チェックボックスを選択") GoTo error Else sel_sw = True If .CheckBox2 = True And .OptionButton1 = True Then Sheets("A").Select sel_sw sel_sw = False End If If .CheckBox2 = True And .OptionButton2 = True Then Sheets("B").Select sel_sw sel_sw = False End If If .CheckBox3 = True And .OptionButton1 = True Then Sheets("C").Select sel_sw sel_sw = False End If If .CheckBox3 = True And .OptionButton2 = True Then Sheets("D").Select sel_sw sel_sw = False End If If .CheckBox4 = True Then Sheets("E").Select sel_sw sel_sw = False End If If .CheckBox5 = True Then Sheets("F").Select sel_sw sel_sw = False End If End If End With Exit Sub error: UserForm9.Show End Sub

  • Excel VBAで別ブックのマクロから配列を取る

    Excel VBAで別ブックのマクロで計算した結果を配列で渡したいのですが、上手い方法が見つかりません。 同じブック内であれば、 Function GetAry(Imax As Integer, ByRef MyAry As Variant) as Boolean のような関数を作れば、GetAry = True の時に返値の MyAry が有効であるという判断ができますが、この関数を別ブックから使う場合は、参照渡しができません。 これはVBAの仕様なので仕方ないとして、以下のようなマクロを組んでみました。 '------------------------------------------------------- ' Book1.xlsm(呼び出される側) '------------------------------------------------------- Function MyAry(Imax As Integer) As Variant Dim i As Integer Dim SubAry() As Variant If Imax > 10 Then MyAry = False Else For i = 1 To Imax ReDim Preserve SubAry(i) SubAry(i) = i Next MyAry = SubAry End If End Function '------------------------------------------------------- ' Book2.xlsm(呼び出す側) '------------------------------------------------------- Sub GetMyAry() Dim DataAry As Variant Dim Imax As Integer Imax = 11 DataAry = Application.Run("Book1!MyAry", Imax) If DataAry <> False Then MsgBox UBound(DataAry) Else MsgBox DataAry End If End Sub '------------------------------------------------------- Imax = 11 であれば、メッセージボックスに False が表示されますが、Imax = 10 だと当然ですが「型が一致しません」というエラーになります。 エラートラップで誤魔化そうかとも思ったのですが、もっとスマートな方法がないでしょうか。 よろしくお願いします。

  • linest関数に配列を渡す

    こんばんは。 回帰分析をやってくれるワークシート関数にLinestとうのがありますが、 それの引数に、配列を渡したいのですが、うまくいきません。 データ自体はRangeではなく、Variant型の配列となっているのですが、Linestを 使うときは、一旦、シートに貼り付けて、配列→Range型に変換するなどするしか 対応できませんでしょうか。 もしくは、Linestと同等な自作関数を作っても良いのですが、もともと機能として あるなら、Linestを使用したいと思ってます。 うまくいかない例^^; Sub test() Dim a(1 To 3) as Variant Dim b(1 To 3, 1 To 2) as Variant a(1) = 1 a(2) = 3 a(3) = 2 b(1, 1) = 4 b(2, 1) = 5 b(3, 1) = 6 b(1, 2) = 12 b(2, 2) = 15 b(3, 2) = 19 MsgBox WorksheetFunction.LinEst(a, b, True, True) End Sub -- エクセル2003

  • 配列表示と間引き

    配列の間引きをを教えて下さい。 下記文を書きました Sub 配列() Dim u As Integer '左 Dim v As Integer '中 Dim w As Integer '右 Dim x As Integer '左 Dim y As Integer '中 Dim z As Integer '右 Dim row As Integer '行カウンタ Dim col As Integer '列カウンタ Dim intSheet As Integer 'シートカウンタ Dim blnNextPage As Boolean '次シートフラグ '初期値セット u = 1 v = 2 w = 3 x = 4 y = 5 z = 5 row = 0 col = 1 intSheet = 1 Do While (1) 'zカウント z = z + 1 If z > 20 Then 'zが20以上ならy+1 y = y + 1 If y > 19 Then 'yが20以上ならx+1 x = x + 1 If x > 18 Then 'xが20以上ならy+1 w = w + 1 If w > 17 Then 'wが20以上ならx+1 v = v + 1 If v > 16 Then 'wが20以上ならx+1 u = u + 1 '終了条件 If (x = 19 And y = 19 And z = 20) Then Exit Do 'v初期化 = x+1 v = u + 1 End If 'w初期化 = y+1 w = v + 1 End If 'x初期化 = x+1 x = w + 1 End If 'y初期化 = y+1 y = x + 1 End If 'z初期化 = y+1 z = y + 1 End If If z > 20 Then Exit Sub '行カウント row = row + 1 If row > 1000 Then '1000で次の列か次のページへ If blnNextPage Then '行・列カウンタ初期化 col = 1 row = 1 '次のシートへ intSheet = intSheet + 1 '次のシートが無い場合は追加 If intSheet > Worksheets.Count Then Sheets.Add After:=Worksheets(Worksheets.Count) End If 'シートをアクティブに Worksheets(intSheet).Select 'フラグ消去 blnNextPage = False Else '次の列へ col = col + 6 row = 1 'blnNextPage = True End If End If If col = 6 * 3 + 1 Then blnNextPage = True End If 'データ表示 Worksheets(intSheet).Range(Chr(64 + col) & row).Cells = u Worksheets(intSheet).Range(Chr(64 + col + 1) & row).Cells = v Worksheets(intSheet).Range(Chr(64 + col + 2) & row).Cells = w Worksheets(intSheet).Range(Chr(64 + col + 3) & row).Cells = x Worksheets(intSheet).Range(Chr(64 + col + 4) & row).Cells = y Worksheets(intSheet).Range(Chr(64 + col + 5) & row).Cells = z Loop End Sub 上記文で表示をしますが、 6列目までの間に3列の連数字の時には表示を行わず、次に移る様にしたいのですが、どうすれば良いでしょうか? 1,2,5,6,10,12はOKです 1,2,3,5,6,10又は1,3,4,5,10,11等3連の数字は表示を行わない。

  • VBAで配列のNULL判定

    VBAで下記のように配列に設定したNULL値を判定しようとしました。 Dim str() ReDim Preserve str(2) str(0) = "aaa" str(1) = Null str(2) = "bbb" 以下(1)、(2)の分岐処理ではNullと判定されませんでした。 どのように判定すれば良いでしょうか? (1) If str(1) = Null Then Debug.Print "Null値です" End If (2) If str(1) = "" Then Debug.Print "Null値です" End If

  • IF関数で違う値もTRUEになる

    0502501G1、502500の二つの値を、=exact(A1,B1)で比べた結果がなぜかTrueになります。 関数が入ったセルをF2で開き、変更をせずにEnterを押すとFalseになります。 この現象について、3つ質問があります。 1.マクロでの比較でも方法によっては同じ現象がおきるでしょうか? 例えば if cells(1,1).value= cells(1,2).value thenや、 A1 = cells(1,1).value B1 = cells(1,2).value IF A1= B1 then など、比較方法は色々有ると思います。 2.このバグを直す方法ありますか? 3.このバグの原因はなんでしょうか? 非常に困っていますし、もし同一の原因でマクロなどでも似たような現象、あるいは全く異なるバグがおきるかもしれないと考えたら、ひじょうに不安です。