• ベストアンサー

ExcelのVBAで配列の処理 PHPから移行する新米ですが・・・

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のように変数の内容を表示させるコマンドはあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答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 --------------------------------------------- 以上。  

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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のようにリテラルで、変数に代入することは、めったにありません。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答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/200312_03120111.html ●配列の動的編成ReDimの問題がある。 http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard27.htm

すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

VBAは言語仕様が古いところがあって、最近のスクリプト言語で標準的に使われているお手軽便利な基本データ型は持ってないので、 1)自前で関数/クラスを記述する。 2)便利なCOMコンポーネント(有償/無料含めて)が見つかればそれをインストールして使う。 ――事になります。 例えば、VBA標準の配列への要素の追加(push)については参考URLとか。

参考URL:
http://support.microsoft.com/?scid=kb%3Ben-us%3B142134&x=4&y=16
すると、全ての回答が全文表示されます。

専門家に質問してみよう