MyString = Array("0です","1です","2です")

↑これの後ろに、"3です" を追加したいのですが、
どうしたらいいですか?

Perl で言う、Push関数の様なものが欲しいのですが。。

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

A 回答 (2件)

あとで追加する。

という事でしょうか?
だったら、普通に配列の数を増やして、そこに値を代入すればいいと思います。

手順は 
(1)UBound で配列の最大を取得してカウントを1加算する。
(2)求めたカウントで ReDim する。そのとき Preserve を使い配列の値の初期化を止める。
(3)配列に値を代入する。

という具合です。
ヘルプで UBound、ReDim を調べればすぐコーディングできると思います。
できなかったら↓↓参考にしてください。

Private Sub Command1_Click()

Dim MyString As Variant
Dim lCnt As Long

MyString = Array("0です", "1です", "2です")

lCnt = UBound(MyString) + 1
ReDim Preserve MyString(lCnt)
MyString(lCnt) = "3です"


End Sub
    • good
    • 0
この回答へのお礼

お時間を割いて答えて下さり、
ありがとうございます。

やっぱり ReDim Preserve するしかないんでしょうか。

Perl の Push関数は

Push(配列名,文字列);

という、
あえて配列のサイズを指定する必要のない、
とても簡単なものだったので、
そういう関数があるかなぁ?と思ったのですが。 (T-T)

お礼日時:2001/07/02 10:19

前に一度そういうの探した事があったんですけど、めぼしいものが見つかりませんでした。

あると便利なんですけどね。
    • good
    • 0
この回答へのお礼

ReDim で進めてみます。
お手数を取らせまして、申し訳ありません。

ありがとうございました。

また、何かありましたら
よろしくお願いいたします。( ̄∇ ̄)

お礼日時:2001/07/02 15:34

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

Perl 関数」に関するQ&A: PHPとPerlの違い

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

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

QVBAで配列内のマッチ

VBAでfor文などループを使わないで配列の文字列とマッチするかの判定を行いたいのですが、良い方法はありますか?

Dim vrnArray As Variant
vrnArray = Array("A", "B", "C", "D", "E", "F", "G")



ret = match???? (vrnArray, "C")
retは真
のようなことがしたいです。

Aベストアンサー

Sub try()
Dim v, vv

v = Array("A", "B", "C", "D", "E")

vv = Not IsError(Application.Match("C", v, 0))

MsgBox vv
End Sub

とか?

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q配列にある重複要素を削除したい(VBA)

エクセルVBAにて、あるルールで対象となるセルの値を配列に格納しております。
配列の要素には重複しているものもあるため、重複要素を配列から削除したいのですが
その方法が分かりません。
どなたか、よろしくご教授下さい。

Aベストアンサー

一例です。
連想配列を利用した方法ですが如何でしょうか。
現在の配列の再構成をしています。

Set db = CreateObject("Scripting.Dictionary")
For Each c In 配列
db(c) = 1  'セル値をキーにして重複分を吸収
Next c
 個数 = db.Count '参考.新配列の個数
配列 = db.Keys '新配列の展開

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)
で切り上げです。

引数で、対象桁を変更できます。

QVB6 配列を初期化したい

VB6でループさせて配列に値を入れて、計算させて最終的に求めたい値をRとします。そのときループで繰り返すためか同じ配列に値を入れてどんどん値がでかくなりRの値がおかしくなってしまいます;
おそらく問題は一回前に入れた配列がそのままのこってしまってるからなのだと思うのですが;
配列の中の値をクリアする方法はないものでしょうか?
一応、配列=0として初期化しようとしても値は変わらず前のが残ったままになってしまっています;
どなたかわかる方いらっしゃいましたらご回答宜しくお願いします

その他何かいい方法があればそれも教えていただけたらと思います

Aベストアンサー

Eraceステートメントを使用

  Dim a() as Long
  Dim s(100) as String
  Dim x() as Long

  Erase a     ’要素が0になる
  Erase s     ’要素が""になる

  Redim x(100) as Long

  Erase x      ’メモリを解放

注)VB2005の場合は動作が異なるので注意して下さい。

QエクセルVBAで配列の追加

エクセル2000です。
1行4列のセル範囲のデータを配列に取り込んで、後から別の1行4列のセル範囲のデータを配列に追加し、2次元配列として吐き出そうと思います。
最初の範囲がA1:D1、追加範囲がA4:D4とした場合、こんな不細工なコードになってしまいました。
これでも動きますが、どう修正すべきでしょうか?

Sub test()
Dim myAr()
myAr = Application.Transpose(Range("A1:D1").Value)
ReDim Preserve myAr(1 To 4, 1 To 2)
For i = 1 To 4
myAr(i, 2) = Cells(4, i)
Next i
Range("F1").Resize(UBound(myAr, 2), UBound(myAr, 1)).Value = Application.Transpose(myAr)
End Sub

Aベストアンサー

申し訳ない...orz
FormulaArrayを使えば良かったです。失念しておりました。

Sub pre()
  Dim v
 
  v = Array("A", "B", "C", "D")
  Call test4(v)
End Sub

Sub test4(v)
  Dim x  As Long
  Dim n  As Long
  Dim i  As Long
  Dim cnt As Long
  Dim z

  x = UBound(v) - LBound(v) + 1
  With Range("A1").CurrentRegion.Resize(, x)
    n = .Rows.Count
    ReDim w(n)
    w(0) = v
    For i = 1 To n
      If Not IsEmpty(.Cells(i, 1)) Then
        cnt = cnt + 1
        w(cnt) = .Rows(i).Value
      End If
    Next
  End With
  ReDim Preserve w(cnt)
'  With Application
'    z = .Transpose(.Transpose(w))
'  End With
'  Range("F1").Resize(cnt + 1, x).Value = z
  Range("F1").Resize(cnt + 1, x).FormulaArray = w
End Sub

ジャグ配列というより、「多段階配列」という認識をしておけば良いと思います。
wの各要素が配列なので、そのままValueではセットできません。
FormulaArrayプロパティを使うか、Transposeを介して二次元配列に整理し直してセットします。
ただし、セルにセットできるのは各要素が一次元配列か、最初の次元が単一の二次元配列の場合です。
乱暴な言い方をすれば、「多段階配列」を立体的な配列と捉えてみてください。
そのままではセル範囲のような平面的な行列にセットできないという事ではないでしょうか。

ついでに参考コード。[ローカルウィンドウ]を活用して配列の構造の違いを把握しておいたほうが良いでしょう。
Sub test5()
  Dim w(1), x, y
 
  Cells.ClearContents
  Range("A1:C2").Value = [{11,12,13;21,22,23}]
  w(0) = Range("A1:C1").Value
  w(1) = Range("A2:C2").Value
  With Application
    y = .Transpose(w)
    x = .Transpose(.Transpose(w))
  End With
  Stop 'ここで[ローカルウィンドウ]確認。
  Range("E1").Resize(UBound(y, 1), UBound(y, 2)).Value = y
  Range("I1").Resize(UBound(x, 1), UBound(x, 2)).Value = x
  Range("M1").Resize(UBound(w) + 1, UBound(w(0), 2)).Value = w
  Range("M4").Resize(UBound(w) + 1, UBound(w(0), 2)).FormulaArray = w
End Sub

Sub test6()
  Dim x1, x2           '一次元配列
  Dim xx, yy, xy         '二次元配列
  Dim v1(1), v2(1), v3(1), vv(1) '一次元配列
  Dim w1, w2, w3, ww, z(1, 1), w '二次元配列

  Cells.ClearContents
  Range("A1:D2").Value = [{11,12,13,14;21,22,23,24}]

  x1 = Array(11, 12, 13, 14)
  x2 = Array(21, 22, 23, 24)
  xx = Range("A1:D1").Value
  yy = Range("A1:A2").Value
  xy = Range("A1:D2").Value

  v1(0) = x1
  v1(1) = x2
  Range("F1:I2").Formula = v1
  Range("F5:I6").FormulaArray = v1
  w1 = Application.Transpose(v1)
  Range("F9").Resize(UBound(w1, 1), UBound(w1, 2)).Value = w1
  Cells.ClearContents

  v2(0) = xx
  v2(1) = xx
  Range("F1:I2").Value = v2
  Range("F5:I6").FormulaArray = v2
  w2 = Application.Transpose(v2)
  Range("F9").Resize(UBound(w2, 1), UBound(w2, 2)).Value = w2
  Cells.ClearContents

  '以降はエラー
  v3(0) = yy
  v3(1) = yy
  Range("F1:I2").Value = v3
  Range("F5:I6").FormulaArray = v3
  w3 = Application.Transpose(v3)

  vv(0) = xy
  vv(1) = xy
  ww = Application.Transpose(vv)

  z(0, 0) = x1
  z(0, 1) = x2
  z(1, 0) = x1
  z(1, 1) = x2
  w = Application.Transpose(z)
End Sub

申し訳ない...orz
FormulaArrayを使えば良かったです。失念しておりました。

Sub pre()
  Dim v
 
  v = Array("A", "B", "C", "D")
  Call test4(v)
End Sub

Sub test4(v)
  Dim x  As Long
  Dim n  As Long
  Dim i  As Long
  Dim cnt As Long
  Dim z

  x = UBound(v) - LBound(v) + 1
  With Range("A1").CurrentRegion.Resize(, x)
    n = .Rows.Count
    ReDim w(n)
    w(0) = v
    For i = 1 To n
      If Not IsEmpty(.C...続きを読む

QエクセルVBAで#N/Aのようなエラー値を含むセルの検出は

エクセルVBAでセルに#N/Aのようなエラー値を含む場合Ifを使った構文で制御したいのですが、エラー値であるかどうかを調査するにはどうすれば良いでしょうか。教えてください。

Aベストアンサー

ワークシート関数のISERRORを使えばよいようです。

#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL! のいずれでもTRUEが返ります。

エラーの種類を検出するには、ERROR.TYPE関数を使用します。ただし、ERROR.TYPE関数でエラーのないセルを参照すると、#N/A が返ります。

詳細は、キーワード「エラー」または「IS関数」でヘルプをご参照ください。

VBAを使う場合は、CVErr 関数でエラー値を検出できます。
(詳細は、キーワード「セルのエラー値」で。)

Q配列の内容に重複をなくすには・・・

いつもお世話になっています。

今回VB6でプログラムを作成していて壁にぶち当たってしまいました。
分かる方がいましたらご教授下さい。

タイトル通りなんですが配列の内容の重複をなくした新しい配列を作成したいと考えています。


配列A: 1, 1, 2, 6, 5, 2, 3, 3

配列B: 1, 2, 6, 5, 3

と配列Aの先頭から順に配列Bに入れていきたいのです。

また、配列を動的配列で宣言していますが、配列Bの終わりが不定なので、最後に終端コード?を入れる
必要があるのか??と思っているのですが”EOF”なのでしょうか?

for i=0 to EOF
配列B[i]
next i
とすればすべて取り出せるのでしょうか?


補足が必要でしたら言ってください。
よろしくお願いいたします。

Aベストアンサー

ユーザー定義型の配列にすれば動的配列にできますよ。
フォームの中とか標準モジュールに定義します。
「a」とか「b」とかは適当に。
Type UType
a As Integer
b As String
End Type

~~~以下は私の前回回答を修正~~

Dim A(7) As UType
Dim B() As UType
と宣言して、
col.Add A(i).a & "|" & A(i).b, A(i).a & "-" & A(i).b
に変えて下さい。
Set col = Nothingの上に出力処理で
For i = 1 To col.Count
'出力(例ではイミディエトウィンドウに書いてます)
Debug.Print col.Item(i)
Next

QFunctionの戻り値を配列にしたいのですが

vbを始めたばかりですがよろしくお願いします。

Functionの戻り値を配列にしたいのですが

Function fnc(ByVal a As Byte, ByVal b As Byte) As Integer()
fnc(0) = a + b
fnc(1) = a - b
End Function
というような使い方はできないのでしょうか?
一つのFunctionで二つの計算結果をかえすには
どうしたらよいのでしょうか?
お願いします。

Aベストアンサー

ローカル変数を使えば可能だと思いますよ

VB6.0の場合
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  fnc = ar
End Function

VB.NETなら
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  return ar
End Function

VB.NETでも fnc = ar と言った記述も出来ます

呼び出し側では 動的配列として返り値を受けます
dim results() as Integer
results = fnc( 5, 3 )
と言った具合です


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング