毎度お世話になります。
質問はオブジェクト変数の取扱方について、
と、言えると思います。
具体的には取りあえず2つ
1、シート関数で云うところのif(IsEmpty("A:A"),結果1,結果2)
的な事ってそのまま配列数式的に一括で出来ますか?
(※注:「なんちゃって」してぶっ込んでますね、IsEmptyなんて構文、シートにはないかも 汗)
ここ数日、いろんな方に対して書き込みを行っていたのですが、
見ていると、それらしいのを見つけたのです。
が、ちんぷんかんぷんで…
IF構文とかで素直な描き方が出来たら良いな…
と、感じます。
2、object変数 仮に変数名を「オブジェクト」としますが、
Dim オブジェクト() As object
と、配列で宣言して
SET オブジェクト = Nothing
で、配列要素の全てと、各要素のobject内に対してNothingが適応されますか?
そんなこと自分でやって試せば、VBEの挙動で解るヤン!! ぷんぷん 怒り
と、突っ込みが来そうなんですが、
お教え下さい。
No.3ベストアンサー
- 回答日時:
こんにちは。
> これってシート関数を評価するもの、
はい。その通りです。
> つまりシート関数そのままですよね?
概ねそうです。
ワークシート関数の配列数式の中でも、
配列のサイズに合わせた大きさの範囲を選択してから、数式を入力し、
範囲全体を纏めてCtrl+Shift+Enterするタイプの配列数式ですので、
単一のセルに適用するタイプの、よく見かける配列数式とは勝手が違います。
戻りが配列ですからVBAにとっては"在リ難イ"存在だと思います。
> VBAオリジナルでは出来ないのですか?
今回の設問に答えるなら、出来ないです。
VBAで直接、配列→配列を扱う関数となると、今思いつくのはFilter関数とかですかね、
殆どまったくといっていい位に用意されていません。
関数名を書く代わりに、ループと条件分岐を書く、という感覚で
私は最近あまり気にしなくなりましたけれども、
それでも、早く片付けたい、とか、文字数を減らしたい、とか、
訳ありな場合には、Excelの機能を活用して楽させて貰うことが多いです。
Visual Basic for Application ですからねー。
Excelの機能を融合的に活用するというのは、考え方によっては王道かも知れない、
とか思うこともあります。
もっとも多く見かけるのは、
Application.Transpose(配列)
とかですね。
普通にループした方が処理は"速い"けど、
その場限りの処理なら"早く"片付けられる
ということを意識して使い分けたりします。
書く人が少ないけど私が良く使うのでは
Application.Text(配列, "書式")
も便利です。
使える場面は限定されますけれど、
一応、簡単な条件分岐は出来なくもない(数値→文字列)ですし。
他、連想配列なら簡易的な意味ではCollectionオブジェクトもあります。
外部オブジェクトですけれど、Dictionaryの方が便利でよく使いますが。
そういう意味ではVBAは、"なんでもござれ"ではないですけれど、
拡張性を残しながら、コンパクトによくまたまったツールだと思っています。
やってもやっても、まだ、新しい面白い発見がありますねぃ。
以上です。
迅速なご対応、痛み入ります。
>Excelの機能を融合的に活用するとい…
全く同感です。
>今回の設問に答えるなら、出…
残念です、
VBAのループも、もしかしたら
並列実行に展開されているのかも知れないですが、
望みは薄そうですよね?
シート関数、特に配列数式が早いのは
コンパイルコードのせいもあるでしょうが、
並列化の恩恵だと 勝手に思っています。
スペシャルセルズのように、
ループ無しに処理できるものは
そのコード単体では 内部的には
並列処理される可能性も あるでしょうが、
ユーザーが書いたコードまで 並列化して貰えるとは、…
インタプリタです(ヨネ?)しね、
並列処理前提の環境が 折角定着しているので、
なるだけ並列処理の 恩恵を授かりたく思いました。
甘かったですね。
いや!!、でも、
「Collection」重白いですね。
事前に構造定義して
組み立てて、組み立てて、静的に構築しなくても
構造体が扱えそうに思いました。
最悪、テキスト形式のコードを吐かせて、それをインクルードすることでしか
構想対や構造体名、構造体要素数やメンバー(て、云うんですか?)の変数の型などを
動的に思いのままに扱えないのかな?
と、思っていました。
(※注:要素数は 限定的ですが、動的に変えられますね、失礼しました)
これは… ひょっとしたらひょっとしますよね?
目がキラキラです。
仰るとおり、
「やってもやっても、まだ、新しい面白い発見がありますねぃ。」
ですね
(※注:「やってもやっても」と、いえる程やっていませんが… 汗)
学ばさせて頂きました、
わくわくが増えました。
有り難うございます。
No.2
- 回答日時:
Sub testA2()
' ' "一行コード"的に使うなら
Range("B1:B5").Value = Evaluate("INDEX(IF(ISBLANK(A1:A5),""結果1"",""結果2""),0)")
Range("C1:G1").Value = Evaluate("TRANSPOSE(IF(ISBLANK(A1:A5),""結果1"",""結果2""))")
End Sub
有り難うございます、学ばせて頂きました
またどうぞ宜しくお願い致します。
これってシート関数を評価するもの、
つまりシート関数そのままですよね?
VBAオリジナルでは出来ないのですか?
No.1
- 回答日時:
こんにちは。
Sub testA()
Dim rtn
Dim hoge As String
Dim piyo As Range
' ' 二次元
rtn = Evaluate("INDEX(IF(ISBLANK(A1:A5),""結果1"",""結果2""),0)")
' ' 一次元
rtn = Evaluate("TRANSPOSE(IF(ISBLANK(A1:A5),""結果1"",""結果2""))")
' ' 文字列変数を使う場合は
hoge = "A1:A5"
rtn = Evaluate("INDEX(IF(ISBLANK(" & hoge & "),""結果1"",""結果2""),0)")
' ' range型変数を使う場合は
Set piyo = Range("A1:A5")
rtn = Evaluate("INDEX(IF(ISBLANK(" & piyo.Address & "),""結果1"",""結果2""),0)")
' ' Evaluate()、引数は文字列式。例示の引数の内容はワークシート関数の配列数式。
' ' 標準モジュールでは Application. 省略可。
' ' 他のモジュールで Application. を省略すると Me.Evaluate()の意。
End Sub
Sub testO()
' ' 動的配列の場合
Dim obj() As Object
' ' とりあえず、redim
ReDim obj(1)
' ' とりあえず、要素格納
Set obj(0) = Cells(1)
Set obj(1) = Cells(2)
' ' すべてをNothingにするには
ReDim obj(1)
' ' 変数を初期化するには
Erase obj
' ' 静的配列の場合
Dim objS(1) As Object
' ' とりあえず、要素格納
Set objS(0) = Cells(1)
Set objS(1) = Cells(2)
' ' すべてをNothingにするには
Erase objS
' ' Set obj = Nothing は無効です。
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで配列の計算
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
変数を動的に作るには?
-
遅延バインディングを使用でき...
-
EXCEL VBA で、0から?1から?
-
C言語 重複しない4ケタの乱数...
-
動的配列が存在(要素が有る)か...
-
javaプログラムについて
-
VBで作った乱数を一度も重複さ...
-
ジャグ配列とは
-
配列にある重複要素を削除した...
-
ログデータを表示するグラフに...
-
VB.net 引数で配列変数を渡す際...
-
VBでbyte配列型のインスタンス...
-
複数のテキストボックスに同じ...
-
配列の要素数を超えた参照のコ...
-
空き番号探し
-
VBA 配列数式的に一括してR...
-
五目並べのプログラムを配列と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
IF関数でEmpty値を設定する方法。
-
EXCEL VBA で、0から?1から?
-
変数を動的に作るには?
-
動的配列が存在(要素が有る)か...
-
VB.net 引数で配列変数を渡す際...
-
遅延バインディングを使用でき...
-
VBで作った乱数を一度も重複さ...
-
複数のテキストボックスに同じ...
-
配列の要素数を超えた参照のコ...
-
C言語 重複しない4ケタの乱数...
-
For文と配列
-
C#の質問
-
VBでbyte配列型のインスタンス...
-
Excel VBAで配列の途中から(X)M...
-
マップチップの当たり判定の出し方
-
ジャグ配列とは
-
五目並べのプログラムを配列と...
-
10進数を4桁のバイト配列に格納...
おすすめ情報