dポイントプレゼントキャンペーン実施中!

エクセルのVBAで配列を使おうと考えています。
データ配列 = Split(データ源, Chr(13))
として、1次元配列に取り込んだところ、chr(10)だけが入力されたデータ配列(?)が出来てしまいました。このデータ配列を詰めたいのですが、何かいい方法が無いでしょうか?教えてください。
元の配列
データ配列(0)  "てすと1"
データ配列(1)  chr(10)
データ配列(2)  "テスト2"
とすれば、
詰めたあと、
データ配列(0)  "てすと1"
データ配列(1)  "テスト2"
となるようにしたいのです。(配列の最大数が減る必要が必ずしもありません。)
for each で回せばいいのでしょうか?
Dim 仮 AS Variant
for Each 仮 In データ配列
   処理をここに書く
Next
では、上手く行きませんでした。
どなたか?詳しい方がいらっしゃいましたら教えてください。宜しくお願い致します。

A 回答 (6件)

すみません。

コメントが一部不適切でした。

  ' Filter 関数で Chr(10)を含むデータを取り除く



  ' Filter 関数で ・を含むデータを取り除く

の誤りです。もちろん Chr(10) を含むデータを取り除くことも可能です。
これだけだと、しょうもない回答なので、横レスになってしまい、恐縮ですが、、

> 変数をカウント(例:i=i+1)に使わないと分からないのでしょうか?

その場合は、通常 For Each ではなくて、最初から For ~ Next を使います。

> 配列から条件に一致したするものを取得した場合にどの配列番号から取得
> したのか?

Application.Match で調べられます。

> 2バイト文字を使うと誤動作...半分、見栄えや、入力のしやすさだけで、
> 使わないのかと思っていましたが?

例えば、

Dim strText

と宣言してあると、コーディング時に strtext と入力しても自動的に strText
に変換されます。コーディング時に入力のパンチミスを発見できるわけですが、
2バイト文字の場合、この機能は使えません。合理的な理由としてはこれ。

可読性については人それぞれなので、自分で使う分には2バイトを使っても構わ
ないかもしれませんが、私はコメントとコードの境界がなくなって「読み難い」
し、嫌う人は多いです。

2バイト文字の変数やプロシージャ名が原因で誤動作するかどうかについて、
誤動作する可能性があるとの話は聞いたことがあります。しかし、実際に自分で
体験したことはありません。
    • good
    • 0
この回答へのお礼

重ね重ねの質問にも、丁寧に丁寧を重ねたご回答有難う御座います。
>For Each ではなくて、最初から For ~ Next
は、For ~ Nextよりも、For Each の方が内部処理が早いと聞いたもので、使えないかと思いましたが、やはり無理なんですね?当然、その差が問題になるようなコードを書いているわけではないのですが、少し背伸びをしてみただけです。
Application.Match については、是非、活用させていただきたいと思います。何せ、よく分かっていないので、ヘルプなどを見ても、その書いている文章の価値が理解出来ないので、応用が利かないのが現実です。一寸したヒントでも頂けると凄く助かります。
2バイト文字については、今後良く考えて行きたいと思います。

お礼日時:2006/08/05 22:06

Wendy02です。



>変数をカウント(例:i=i+1)に使わないと分からないのでしょうか?

私は、個々の問題に対して回答をしましたが、For Each .. In ... が、For i = LBound(..) To Ubound(..) であろうが、あまり大差を感じているわけではありません。また、Filter関数を使うか使わないかは、ご自身の選択の範囲だと思います。

ただ、私個人は、一律にデータが規則どおりになっていればよいのですが、そうとは限らないので、実際には、Filter関数では、あまりうまく行かないような気がするので、使わないだろうと思っています。

最終的な目的が何か、ということが大事なので、

「Filterで、配列から条件に一致したするものを取得した場合にどの配列番号から取得したのか?を得る方法ってあるのでしょうか?」

というような実験的なものに対しては、直接的な回答は出来かねます。Filter関数を使わなくてはならない意味と、それによって配列の添え字を取得することは、私の経験にはないことです。その意義を見出せません。ご自身が、いろいろやってみることだと思います。

>2バイト文字を使うと誤動作ってするのですか?

VBE内は、Unicodeですから、それが、あまり問題は少ないだろうとは思っています。特に、私の使用しているExcelは、日本語バージョンですので、トラブルは経験したことはありません。おそらく、これは、他の言語のVBAを想定したものかもしれません。事実、私の使用しているVBEユーティリティでは、日本語の部分は、文字化けしてしまいます。

それは別としても、これは、VBAの基礎のルールとして掲げられているものですから、回答する立場の私としては、コードを公にする以上は、一応、但し書きとしては書かざるを得ないのです。ご質問者個人が、プライベートでお使いになる分には、誰も関知するものではありません。
    • good
    • 1
この回答へのお礼

なんだか?お怒りのようで、誠に申し訳ありません。
便乗質問したのが気に入らなかったようで、すみません。確かに、個々が、各々の条件でやろうとしていることを全て把握して答えるのは難解を極めると思います。もう少し、補足の使い方には重々に注意していきたいと思います。
これに、懲りずに今後とも宜しくお願い致します。
Wendy02さんのおかげで、随分VBAも自由に組めるように(当然、Wendy02さんの足元にも及ばないですが)なってきました。本当に、本当に有難う御座いました。

お礼日時:2006/08/05 22:11

こんにちは。

KenKen_SP です。

Chr(10)って vbLf のことですよね....どんなデータなのでしょうか?
今回の用途なら Filter 関数一行で済むと思いますが。

便宜上、Chr(10)を”・”にして、それを含む配列要素を取り除いています。


Sub Sample()

  Dim A(5) As String
  Dim Buf As Variant
  
  ' テスト用配列データ
  A(0) = "てすと1"
  A(1) = "・"
  A(2) = "テスト2"
  A(3) = "TEST3" & "・"
  A(4) = "・" & "TEST4"
  A(5) = "・"
  
  ' 処理前のデータを表示
  MsgBox Join$(A, vbLf)
    
  ' Filter 関数で Chr(10)を含むデータを取り除く
  Buf = Filter(SourceArray:=A, _
         Match:="・", _
         Include:=False)
  
  ' 取り除かれたか確認表示
  MsgBox Join$(Buf, vbLf)

End Sub
    • good
    • 0

こんにちは。



データ配列 = Split(データ源, Chr(13))

果たして、そのようなことがありえるのか、データの入手方法が見えていないので、なんとなく、そういう配列の生成がヘンな気がしますが、それは置いておいて、すでに、データ配列という配列変数が出来上がったとすれば、後を以下のようにすれば、取れますね。

Dim データ配列 As Variant
Dim 仮 As Variant

'配列変数が、ここで出来上がったとして

Dim データ配列2() As Variant
Dim i As Long

For Each 仮 In データ配列
  If 仮 > Chr(30) Then
  ReDim Preserve データ配列2(i)
   データ配列2(i) = 仮
   i = i + 1
  End If
Next

(便宜的に、ここでは、2バイト文字の変数を使いました。本来は、誤動作の元になりますので、使ってはいけません。)

この回答への補足

いつもいつも有難う御座います。
なるほど、別の動的配列を用意すればいいのですね?有難う御座います。あわせて、ご質問したいのですが、For Each で配列をループさせている時に、ある条件でIF文で引っかかった時に何番目の配列要素かどうかは、変数をカウント(例:i=i+1)に使わないと分からないのでしょうか?
また、Filterで、配列から条件に一致したするものを取得した場合にどの配列番号から取得したのか?を得る方法ってあるのでしょうか?
重ね重ねよろしくお願いします。
2バイト文字を使うと誤動作ってするのですか?英語が苦手な私としては、可読性のために使っていますが??(プログラミングのどの本を読んでも、2バイトを使っている本って見たことありませんが・・・?半分、見栄えや、入力のしやすさだけで、使わないのかと思っていましたが?)

補足日時:2006/08/05 19:27
    • good
    • 0

データ配列 = Split(データ源, Chr(13))


の前に
データ源 = Replace(データ源, Chr(10), "")
を入れてみたらどうでしょうか
    • good
    • 0
この回答へのお礼

今回の質問の条件では、chibita_papaさんの仰る方法が合理的だと思いました。本当に有難う御座いました。点数が割り振れなくて誠に申し訳ありません。
今後とも宜しくお願い致します。

お礼日時:2006/08/05 22:16

テストしていませんが


 Join(データ配列)
で一旦各配列を結合して、再度Chr(10)を区切り文字として分割してはどうですか?
    • good
    • 0

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

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