新生活!引っ越してから困らないように注意すべきことは?>>

度々お世話になります。
Const+Evaluateの使い方ついてお教えください。

VBA内で「RANDBETWEEN」を使いたくて
long型の変数Valに対し
Constした「数」(10)を使い
Val=Evaluate("RANDBETWEEN(1,数)")
とか
Val=[RANDBETWEEN(1,数)]
とかしたら
「型が合わない」と、お叱りを受けました。

そこで
ウオッチに登録すると
エラー 2029
となっていました。

一方で
Application.WorksheetFunction.Ceiling(1 数)
は、問題ありません。

マイクロソフトサポートによると
( http://support.microsoft.com/kb/823604/ja )
「イミディ エイト ウィンドウ、Visual Basic エディターで、次のコマンドを入力し、ENTER キーを押しますと、この問題が発生可能性があります
application.Evaluate("=SUM(xyz(),apple)")」
とのことなのですが、

これ、
セルを使わない回避の技、ありますか?

どうぞ宜しくお願い致します。

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

使い方 VBA」に関するQ&A: VBA Rangeの使い方

A 回答 (2件)

これで良いのでは?


Val = Evaluate("RANDBETWEEN(1," & 数 & ")")
    • good
    • 0
この回答へのお礼

有り難うございます。

ですよね 滝汗…
文字列の中では変数を数値に変換してくれないですものね

失礼しました。

お礼日時:2013/05/07 17:35

2013版ではworksheetfunctionにあります。


他の版ではどうなのか・・・。確認してみてください。
MsgBox Application.WorksheetFunction.RandBetween(10, 30)
    • good
    • 0
この回答へのお礼

有り難うございます。
指定間乱数、と 云うのでしょうか…
追加されたのですね。

お礼日時:2013/05/07 17:36

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

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

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

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

QEvaluateを使ってマクロに記述した関数に変数を使う方法

Evaluateを使ってマクロに記述した関数に変数を使う方法

"=SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C100<=10))"

という関数を普段使用しています。
ふとこの関数をマクロで実行させようと思い(理由はありません、思い付きです)、

Range("D1").Value = Evaluate("SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C100<=10))")

としてみました。うまくいきました。
次に、

Dim i As Long
For i = 1 To 5
Range("D" & i).Value = Evaluate("SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C100<=10))")
next

としてみました。ここで考えたのですが、

FIND(A1,B1:B100)

この部分の「A1」を「i」を使って(つまりRange("D" & i)に連動させて)変数にすることは出来るのでしょうか?
ご教示願います。

今回は単なる好奇心で普段使っている関数をマクロで表現できないかなと思った次第で、どうしても知りたい!必要だ!というわけではありません。
お暇なときにお願いします。

Evaluateを使ってマクロに記述した関数に変数を使う方法

"=SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C100<=10))"

という関数を普段使用しています。
ふとこの関数をマクロで実行させようと思い(理由はありません、思い付きです)、

Range("D1").Value = Evaluate("SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C100<=10))")

としてみました。うまくいきました。
次に、

Dim i As Long
For i = 1 To 5
Range("D" & i).Value = Evaluate("SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C...続きを読む

Aベストアンサー

>今回は単なる好奇心で普段使っている関数をマクロで表現できないかなと思った次第で、どうしても知りたい

今回のようなマクロで、配列数式を埋め込むというのは、マクロとは少し違う問題です。それに、Evaluate 内は、SUMPRODUCT 関数は必要ないのです。配列数式に、インクリメンタル変数を埋め込むのは簡単ですが、Excelのバージョンなどに影響受けてしまいますから、あまり多用すべきではないと思います。
それを、一般プロシージャで表現できて、始めて、マクロが分かるということになると思います。

'-------------------------------------------

Sub Test1()
  Dim i As Long
  For i = 1 To 5
    Cells(i, 4).Value = Evaluate("SUM((ISERROR(FIND(A" & i & ",B1:B100))=FALSE)*(C1:C100<=10))")
  Next
End Sub

'以下は同じ内容のプロシージャです。
'-------------------------------------------
Sub Test2()
  Dim i As Long, j As Long
  Dim strTxt As String
  Dim cnt As Long
  For i = 1 To 5
    strTxt = Cells(i, 1).Value
    For j = 1 To 100
      If Cells(j, 2).Value Like "*" & strTxt & "*" Then
        If Cells(j, 3).Value <= 10 Then
          cnt = cnt + 1
        End If
      End If
    Next
    Cells(i, 5).Value = cnt
    cnt = 0
  Next
End Sub

>今回は単なる好奇心で普段使っている関数をマクロで表現できないかなと思った次第で、どうしても知りたい

今回のようなマクロで、配列数式を埋め込むというのは、マクロとは少し違う問題です。それに、Evaluate 内は、SUMPRODUCT 関数は必要ないのです。配列数式に、インクリメンタル変数を埋め込むのは簡単ですが、Excelのバージョンなどに影響受けてしまいますから、あまり多用すべきではないと思います。
それを、一般プロシージャで表現できて、始めて、マクロが分かるということになると思います。

'----...続きを読む

QVBA Evaluate関数 型が一致しません

Excel2003

VBAのEvaluateで以下の数式を実行すると
エラー「型が一致しません」となってしまいます。

類似の質問を検索していろいろ参考にしてみたのですが
解決できなかったので質問させてください。


Sub test()

Dim aa, bb, cc As String
Dim y As Byte
y = 1

With Sheets("Sheet1")
aa = ".Cells(y, 1) > 0"
bb = Left(aa, InStr(aa, "y") - 1)
cc = Mid(aa, InStr(aa, "y") + 1)
If Evaluate(bb & y & cc) Then ←ここでエラーになります。
y = 2
End If
End With

End Sub

.Cells(1, 1)には10が入力されています。



宜しくお願い致します。

Excel2003

VBAのEvaluateで以下の数式を実行すると
エラー「型が一致しません」となってしまいます。

類似の質問を検索していろいろ参考にしてみたのですが
解決できなかったので質問させてください。


Sub test()

Dim aa, bb, cc As String
Dim y As Byte
y = 1

With Sheets("Sheet1")
aa = ".Cells(y, 1) > 0"
bb = Left(aa, InStr(aa, "y") - 1)
cc = Mid(aa, InStr(aa, "y") + 1)
If Evaluate(bb & y & cc) Then ←ここでエラーになります。
...続きを読む

Aベストアンサー

こんにちは。

.Evaluateメソッドの練習でしょうか?
.Evaluateメソッドを使う必要も必然性もないですから、
コードの提示だけでは実際に何をしたいのか判断付きませんけれど、
ご提示のコードを(正しくやりたいことを表現できているものとして)素直に読んで
修正を加えるとするば、以下のようになります。

' ' ///
Sub Re8383252()
    Dim 数式雛型 As String, 数式 As String
    Dim y As Long

    数式雛型 = "A1>0"
    y = 1
    数式 = Replace(数式雛型, "1", y)
    With Sheets("Sheet1")
        If .Evaluate(数式) Then
            y = 2
        End If
    End With
End Sub
' ' ///

ご提示のコード内の変数の値等を確認してみると、
aa ⇒ ".Cells(y, 1) > 0"
bb ⇒ ".Cells("
bb ⇒ ", 1) > 0"
bb & y & cc ⇒ ".Cells(1, 1) > 0"
(値はすべて 文字列値 ↑)
のようになっています。
Evaluate(bb & y & cc)
は、
Evaluate(".Cells(1, 1) > 0")
を実行していることになり、
Excel側で".Cells(1, 1) > 0"を評価した結果として
「エラー 入力した数式は正しくありません」
が返り、
VBA側では、If文にエラー値を渡すことになるので
「実行時エラー '13' 型が一致しません」
という結果になります。

そもそも.Evaluateメソッドは、文字列式を渡して、
Excelに評価(計算)させる為のメソッドですから、
If Evaluate("A1>0") Then
のようにExcel数式を引数に渡してこそ成立しますが、
"Cells"という関数も名前もExcelにはありませんから、必然エラーになります。

ご提示のコードでおかしな点を指摘しておきます。

> Dim aa, bb, cc As String
3つの変数の内、文字列型で宣言されているのは、cc、だけです。
 Dim aa As String, bb As String, cc As String
と書くのが意図にそった正しい書き方なのではないでしょうか?

> Dim y As Byte
行位置を扱う変数には、Long 型を使うのが正解です。
Byte型は本来、バイナリデータの配列を格納する為に用意されているもので、
通常は、数値を格納することはない(間違い)、と覚えてください。
今から20年も前ならば、少しでもメモリを節約する目的で、
無理矢理Byte型を使うような悪いお手本も見かけましたが、
今日的には、如何なる目的であろうとも間違いは間違いです。


> With Sheets("Sheet1")
・・・
> End With
Withフレーズを使うのは、
  Sheets("Sheet1").Cells(1, 1).Value = 10
  Sheets("Sheet1").Cells(1, 2).Value = 20
のような例で、Sheets("Sheet1")への参照を繰り返すのは無駄が多いので、
  With Sheets("Sheet1")
    .Cells(1, 1).Value = 10
    .Cells(1, 2).Value = 20
  End With
のようにオブジェクトへのアクセスを一つにまとめる意味です。
Withフレーズを書いているのに、一度も使っていないのでは意味がありませんし、
読み手は困惑してしまいます。
こちらで提示したコードでは、.Evaluate のように、
Sheets("Sheet1")への参照を一度だけ活用していますが、
そのままなら、わざわざWithブロックを使う必要はありません。

> aa = ".Cells(y, 1) > 0"
> bb = Left(aa, InStr(aa, "y") - 1)
> cc = Mid(aa, InStr(aa, "y") + 1)
> If Evaluate(bb & y & cc) Then
元の数式としてのaaは間違いですが、
それ以外の処理のしかたは間違っていません。
ただ、Replace関数を使って数式の一部(行位置)を置換する方が簡単です。

> .Cells(1, 1)には10が入力されています。
具体的なシートの状況を説明する時は、
「数値 10 」なのか、「文字列値 "10" 」なのか、明示的に書き分けるのがベターです。
「数値 10 」のような書き方ならば、見やすく全角で書いたものとして伝わりますが、
「10」のようにただ全角で書くのは誤解の元です。
VBAを扱うのならば、データ型には注意しましょう。

やりたいことは何となく想像は付くのですが、
何故.Evaluateメソッドなのか、把握できていませんので、
そちらの実際にやりたいことに、擦寄るような回答は書きません。
ご質問文に書かれたお尋ねに対しては、十分にお応え出来たものと思っています。
そちらで尚も不足が残るようでしたらば、スレッドを改め、質問を再構築してください。

以上です。

こんにちは。

.Evaluateメソッドの練習でしょうか?
.Evaluateメソッドを使う必要も必然性もないですから、
コードの提示だけでは実際に何をしたいのか判断付きませんけれど、
ご提示のコードを(正しくやりたいことを表現できているものとして)素直に読んで
修正を加えるとするば、以下のようになります。

' ' ///
Sub Re8383252()
    Dim 数式雛型 As String, 数式 As String
    Dim y As Long

    数式雛型 = "A1>0"
    y = 1
    数式 = Replace(数式雛型, "1", y)
    With S...続きを読む

Q定数配列の書き方

VB6で定数を定義する場合は次の通りです。

  Const strTest As String = "TEST"

では、定数配列を定義する場合はどのように書けばいいのでしょう?

  Const astrTest() As String = Array("A", "B", "C")      '→NG
  Const astrTest(0 To 2) As String = Array("A", "B", "C")  '→NG

いろいろな書き方を試して見たのですが、上記のような書き方でも文法的にエラーになるようです。

どのように書けばいいのでしょうか?

それとも定数を配列で定義するのは無理なんでしょうか?

Aベストアンサー

残念ですが、VBでご希望のことをすることはできません。

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

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 オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QVBAで配列引数を値渡しできない理由

Sub TestB(ByVal MyArray() As Integer)

のようにして、
配列引数をByValで渡そうとすると
エラーが出てしまいます。

http://vba.doorblog.jp/archives/51291826.html

このページにあるように
variantとして渡せば
エラーは出ないのですが
byrefとして扱われてしまいます。

なぜVBAでは配列を値渡しすることができないのでしょうか?
何が問題なのでしょうか?

Aベストアンサー

VBで配列を引数で渡す場合、先頭のアドレス(住所)を渡しています。
(C言語のポインター)
その為、サブルーチンの引数の型は、その「アドレスを表す変数」が値渡しか参照渡しかを表すことであって、配列の中身を値渡しか参照渡しかを指定している訳ではありません。
つまり、
Sub TestB(Byref MyArray() As Integer)
※MyArray変数がByref
Sub TestB(Byval MyArray As Variant)
※MyArray変数がByval

詳しくは、以下のサイトを参考にしてみてください。
https://msdn.microsoft.com/ja-jp/library/eek064h4.aspx

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

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

QVBAでループ内で使う変数名を可変にできないか。

次のような処理で・・・、
 Cnt_1 = Cnt_1 + 1
 Cnt_2 = Cnt_2 + 1
   :
実際には一つの変数(Cnt_1など)ごとに処理がもっとあるのですが、
変数はCnt_1からCnt_5まであり、すべて同じ処理をするので、変数名を
可変にして同じループで書けないかと思うのですが、可能でしょうか?

たとえば、
For I=1 to 5
 Cnt_I = Cnt_I + 1
Next I
と書くと、「Cnt_I」という変数の処理になってしまいますね・・。

なにかいい方法はないでしょうか?

Aベストアンサー

こんばんは。

配列変数を使えばいいでしょう。
変数を5個用意して、すべて1~5まで足すという処理の場合です。
Dim Cnt(4) As Integer
Dim i As Integer
Dim j As Integer
For i = 0 To 4
For j = 1 To 5
Cnt(i) = Cnt(i) + j
Next j
Next i
どうでしょうか。


人気Q&Aランキング