重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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

A 回答 (5件)

コメントなしのコードを提示しても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
---------------------------------------------
以上。
 
    • good
    • 0

こんばんは。

#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
    • good
    • 0

こんにちは。

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のようにリテラルで、変数に代入することは、めったにありません。
    • good
    • 0

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 …
    • good
    • 0

VBAは言語仕様が古いところがあって、最近のスクリプト言語で標準的に使われているお手軽便利な基本データ型は持ってないので、


1)自前で関数/クラスを記述する。
2)便利なCOMコンポーネント(有償/無料含めて)が見つかればそれをインストールして使う。
――事になります。

例えば、VBA標準の配列への要素の追加(push)については参考URLとか。

参考URL:http://support.microsoft.com/?scid=kb%3Ben-us%3B …
    • good
    • 0

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