
PHPからVBAに移行を考えているのですが、VBAの考え方が難しい?わからず難儀しております。
ExcelのVBAで配列の処理を考えているのですが、以下のPHPと同じ動作をするVBAを書きたいのですが、どうすればよいのでしょうか?
<?php
// 配列を使って、$aを北海道、青森とする。$bは、単なる受け皿です。
// これをエクセルVBAではどのように記述するのでしょうか?
$a = array();
$b = array();
array_push($a, "青森");
array_push($a, "青森");
array_push($b, array_pop($a));
array_unshift($a, "北海道");
array_unshift($a, "北海道");
array_push($b, array_shift($a));
var_dump($a);
var_dump($b);
exit;
?>
また、PHPにはvar_dumpという便利なものがありますが、VBAでは
VBEのローカルやウォッチ式で見るというのが普通でしょうか?
イミディエイトにvar_dumpのように変数の内容を表示させるコマンドはあるのでしょうか?
No.2ベストアンサー
- 回答日時:
コメントなしのコードを提示してもPHPを弄ったことない人には、ん?って感じだとは思いませんか?
ま、おおよそのことは分かるけれども。。。
----------------------------------------------------
Sub Test()
Dim R As Integer
Dim a As Variant
a = Array("青森", "北海道")
'var_dump
'イミディエイトへ表示
For R = LBound(a) To UBound(a)
Debug.Print a(R)
Next R
End Sub
---------------------------------------------
以上。
No.5
- 回答日時:
こんばんは。
#4 の Wendy02です。>以下のPHPと同じ動作をするVBAを書きたいのですが、どうすればよいのでしょうか
まったく系統の違う言語を持ち出して、これと同じにしてくれという問題は、やはり、ここのカテゴリでは無理があります。逆のことを考えてみたらお分かりになるはずです。コードは読みきりましたが、VBAには、array_push や array_shift などに該当するものは、VB(6)系では備わってはおりません。
VBAで、本当は何がしたいのか明らかにしてほしいものです。PHPの言語をVBAに移植するというようなことはありえないからです。しかし、今回、#1さんのご指摘のような方法で試しに作ってみました。
'標準モジュール
Sub TestArray1()
Dim arA() As Variant
Dim arB() As Variant
ReDim arA(0)
ReDim arB(0)
arA() = vbPush(arA(), "青森")
arA() = vbPush(arA(), "青森")
arB() = vbPush(arB(), vbPop(arA()))
arA() = vbUnShift(arA(), "北海道")
arA() = vbUnShift(arA(), "北海道")
arB() = vbPush(arB(), vbShift(arA()))
End Sub
Function vbUnShift(ar() As Variant, arg As Variant)
Dim i As Long
ReDim Preserve ar(UBound(ar()) + 1)
For i = UBound(ar()) To LBound(ar()) + 1 Step -1
ar(i) = ar(i - 1)
Next i
ar(LBound(ar)) = arg
vbUnShift = ar()
End Function
Function vbShift(ar() As Variant)
Dim i As Long
For i = LBound(ar()) To UBound(ar()) - 1
ar(i) = ar(i + 1)
Next i
ReDim Preserve ar(UBound(ar()) - 1)
'If UBound(ar()) = 0 Then
vbShift = ar(0)
'Else
' vbShift = ar()
'End If
End Function
Function vbPop(ar() As Variant)
ReDim Preserve ar(UBound(ar()) - 1)
If UBound(ar()) = 0 Then
vbPop = ar(0)
Else
vbPop = ar()
End If
End Function
Function vbPush(ar() As Variant, arg As Variant)
If ar(LBound(ar())) <> Empty Then
ReDim Preserve ar(UBound(ar()) + 1)
End If
ar(UBound(ar())) = arg
vbPush = ar()
End Function
たとえば、配列の中をひっくり返すだけなら、以下のようにします。
しかし、このようなコードさえも、VBAでは、あまり登場しません。特にExcel VBAは、ワークシートから、加工してワークシートに出力するためにあるのであるです。
Sub TestArray2()
Dim arA() As Variant
Dim i As Long
Dim j As Long
Dim arB() As Variant
ReDim arA(1)
arA(0) = "青森": arA(1) = "北海道"
ReDim arB(UBound(arA()))
For i = LBound(arA()) To UBound(arA())
j = UBound(arA()) - i
arB(j) = arA(i)
Next i
Debug.Print Join(arB(), ";")
End Sub
No.4
- 回答日時:
こんにちは。
Wendy02です。一旦、PHPは忘れて、VBAに徹することでしょうね。
PHPとVBScript なら、話は見えますが、VBAとでは、関係があまりありません。VBAは、あくまでも、Office Applicationに付随したもので、それを特出して使ったところで便利度は高くありません。
今回のような質問は、VBAが優れているのは、それなりに、VB(6)に準拠しているので、イミディエイトウィンドウのほかにも、ローカルウィンドウやウォッチウィンドウ、オブジェクト・ブラウザや、外部ツールも備えて高度な処理まで出来るようになっております。
>PHPにはvar_dumpという便利なものがありますが、VBAではVBEのローカルやウォッチ式で見るというのが普通でしょうか?
それが、一般的だと思います。記録に残すなら、イミディエイト・ウィンドウに出しますが、あまり多くはありません。コードが削除しないと残っていくのと、他の言語と併用すると、他の言語側の出力に邪魔することがあります。
ブレイクポイントやSTOPステートメントを用いて、そこで、ローカルウィンドウで、配列の構造とイメージを把握します。
今まで、他の言語でやってきた自信は、おありでしょうけれども、一旦、白紙に戻して、1からやり直したほうが早いかもしれません。やろうとしていることと、実際の技術のバランスが取れていないように思います。VBAの習得自体は、そんなに時間は掛かりません。しかし、VBAは、VBよりも、理屈に合わないおかしな部分があるので、とても、他の言語から、すぐに実用的なコードを書くレベルには、なかなか至りません。
なお、一般的には、個数の決まらない配列は、VBAでは、動的配列を用います。前回も書いたかもしれませんが、VBAでは、Arrayのようにリテラルで、変数に代入することは、めったにありません。
No.3
- 回答日時:
VBAで配列は、
dim a(100)
のように、要素数(いわば座席の数)を多め(最大を見繕って)に取って定義します。
そしてarray_push()のように最後に詰め込むイメージでなく、自分で(プログラマが)要素数(いわば席番地、添字)を指定して、=で値を代入します。
a(3)="秋田"
また
array_popのように末尾から採るのでなく、任意の席番号を要素数を指定して、代入演算子(実は取得とか移転の意味)で取得します
b=a(3)
Pushのような機能にするには、配列要素の実質的な採集用素数を
変数で管理して(覚えて・記録しおいて)、1ずつ減らしたり、加えたりして、要素ポインターを変えます。
Popも同じく、最終の配列要素のポインターを別途保持して、管理しないとダメです。
array_unshiftは先頭に追加するのですが、VBAではこれ名1発では
難しい。1つづつ既存全体をヅラす必要がある。
POP-PUSHの構造はVBでは取り上げられていない=>旧いといえるかもしれません。
var_dump はこれは(も)関数なのですが、PHPでは
$a = array (1, 2, array ("a", "b", "c"));
のようなことを考えるようですが
VBAなら配列の中に配列を作るようなのは余り考えない。
ーー
あと、
●配列の値の初期化
Array関数を使う方法があります。
通常の配列ではまとめてのクリア以外の、初期化はできませんので、
コードで要素1つ1つ地道にセットする必要がある。.NET以後の
VBはできるようです。
http://homepage1.nifty.com/MADIA/vb/vb_bbs/20031 …
●配列の動的編成ReDimの問題がある。
http://homepage1.nifty.com/rucio/main/dotnet/sho …
No.1
- 回答日時:
VBAは言語仕様が古いところがあって、最近のスクリプト言語で標準的に使われているお手軽便利な基本データ型は持ってないので、
1)自前で関数/クラスを記述する。
2)便利なCOMコンポーネント(有償/無料含めて)が見つかればそれをインストールして使う。
――事になります。
例えば、VBA標準の配列への要素の追加(push)については参考URLとか。
参考URL:http://support.microsoft.com/?scid=kb%3Ben-us%3B …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Visual Basic(VBA) vbaエクセルマクロについて RemoveDuplicatesを使わずに、重複行を削除すらマクロを作 3 2023/03/02 22:03
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP ランキングを表示する際の画像の大きさを固定することは可能でしょうか? <?php if ( has_ 1 2022/07/21 14:55
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/02/07 09:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/04 09:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの関数について
-
エクセル GROUPBY関数について...
-
Excelで4択問題を作成したい
-
エクセルの複雑なシフト表から...
-
エクセル
-
Amazonでマイクロソフトオフィ...
-
エクセルシートの見出しの文字...
-
グループごとの個数をカウント...
-
【マクロ】変数に入れるコード...
-
エクセルのリストについて
-
【マクロ】別ファイルへマクロ...
-
グループごとの人数のカウント
-
エクセルについて
-
グループごとの人数のカウント
-
【マクロ】左のブックと右のブ...
-
【マクロ】元データと同じお客...
-
【マクロ】数式を入力したい。...
-
【マクロ】【相談】Excelブック...
-
【マクロ】実行時エラー '424':...
-
他のシートの検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA ListViewの選択Itemを削除する
-
エクセルで検索結果をユーザー...
-
エクセルマクロ(VBA)でテ...
-
因数分解について質問させてく...
-
この問題の解き方を教えてください
-
アルミ電解コンデンサで、20...
-
「整理」と「整頓」は何が違いますか?
-
Σ(n=0,N-1)e^cn(初項1,項比e^c...
-
★花の名前を教えて頂けないでし...
-
Pythonの3Dグラフ表示に関する...
-
PCで地デジを見るとき・・・
-
ExcelのVBAで配列の処理 PHPか...
-
エクセル(VBもしくは、VBA)を使...
-
YouTubeでvrを見る時画面を2分...
-
sumif関数で列を数字で指定でき...
-
「★」を境に文字を分割し隣のセ...
-
合っていますか? Por favor
-
i-とn-のちがい
-
3次元アイドル と 二次元 アイ...
-
psvrを買おうと思っていたので...
おすすめ情報