質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2270閲覧

【VBA】splitとarrayで作成した配列の違いについて

inari_ken

総合スコア34

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/09/03 05:44

こんにちは。VBAでの質問です。
splitで作成した配列と、arrayで作成した配列とで、シートに貼り付けた際の結果が異なるようです。(①②を参照)
ウォッチリストで配列の中身を確認しても、同じ"string"型なので、どちらの命令で作成しても作成された配列は「同じもの」というように見えます。

①②で貼り付けの結果が異なるのはなぜなのでしょうか?

【①splitで配列を作成した場合】

下記コードより、1行目のB列は数値型(右寄せ)で格納されます。
しかし、2行名のB列は文字型(左寄せ)で格納されます。

vba

1Sub test() 2 Dim arr As Variant 3 arr = "あああ, 2" 4 Dim ww 5 ww = Split(arr, ",") 6 7 Cells(1, 1) = ww(0) 8 Cells(1, 2) = ww(1) 9 10 Range(Cells(2, 1), Cells(2, UBound(ww) + 1)) = ww 11End Sub

【②arrayで配列を作成した場合】

下記コードより、1行目のB列は数値型(右寄せ)で格納されます。
2行名のB列も数値型(右寄せ)で格納されます。

vba

1Sub test2() 2 Dim arr As Variant 3 arr = Array("あああ", "2") 4 5 Cells(1, 1) = arr(0) 6 Cells(1, 2) = arr(1) 7 8 Range(Cells(2, 1), Cells(2, UBound(arr) + 1)) = arr 9End Sub

以上、今回もよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

配列の中身を確認しても、同じ"string"型なので

配列の中身は確かにstringなのですが、
配列そのものの型が少し違いますね。
①はVariant/String、②はVariant/Variant になります。
これが原因かどうかはわかりませんが、違いといえばここくらいですね。

投稿2018/09/03 06:02

takushi168

総合スコア228

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inari_ken

2018/09/03 06:20

ご回答ありがとうございます。 Splitで配列を作成した場合は、必ず配列は文字列(String固定)になり、 Arrayで配列を作成した場合は、設定値によって型を変換してくれる  という違いがある ということですね。
inari_ken

2018/09/03 06:29

つまり、①(split方式)の Range(Cells(2, 1), Cells(2, UBound(ww) + 1)) = ww は、配列の中身全てがstring型のため、全て文字列となるわけですね。 疑問があるのですが、 Cells(1, 2) = ww(1)はなぜ数値型として変換出力してくれるのでしょうか? 配列の中身がstringなのであれば、こちらも文字型で出力されるような気がします。が、そうはなりません。 どうして Range(Cells(2, 1), Cells(2, UBound(ww) + 1)) = ww は文字列出力で、 Cells(1, 2) = ww(1) は数値型出力となるのでしょう?
takushi168

2018/09/03 06:36

> Splitで配列を作成した場合は、必ず配列は文字列(String固定)になり こちらはその通りで、stringをstringとして分割しているので、 明示的に「中身がstringの配列」としているようなもの、と思ってOKかと思います。 >Arrayで配列を作成した場合は、設定値によって型を変換してくれる こちらについては、VBAでは型が明示されていない場合はVariantになる、というのが正しいかと思います。 しかし、これだけでExcel側で勝手に書式を変えないでほしいですよね…。 もしいずれかに揃えたいというお話でしたら、 配列の型を揃えるよりもVBA側で書式を設定してしまう方が確実ですし楽に済むのではないかと思います。
takushi168

2018/09/03 06:43

おっとすみません、すれ違いました。 Cellsで1つずつ入れていくときとRangeに一括で入れるときの違いはちょっとわかりかねます。 CellsではValue値を設定しているだけ( Cells(1, 1).Value = arr(0) と同等 )のはずなので 書式が勝手に付くことはない、と思います。 Rangeでの設定時は何か違うのかな、と思うのですが…
inari_ken

2018/09/03 07:29

ご回答ありがとうございます。 Rangeで1つずつ入れていく場合と範囲で入れていく場合でも結果に違いがありますね。 ①でたとえば、 Range("A1") = ww(0) Range("B1") = ww(1) としても、B1の結果は数値型になります。これはセルの書式が優先されているのかなと思います。 ただ、Rangeで配列を一括で入れた場合は、セルの書式よりも配列の型が優先される様です。 この件については別途質問を立ち上げようかと思います。 とにかく、「splitで取得した配列をすべて正しい型でシートに出力」したい場合などは、 VBA側で書式を設定してしまうか、ループ回すなりしてセルに対して1つずつセットしていく方が良い という結論になりました。 ありがとうございました。
FKD

2018/09/04 03:06

TypeName関数でwwとarrの型を確認できます。TypeName(ww)は「String()」=String型の配列、TypeName(arr)は「Variant()」=Variant型の配列となります。(もちろん回答の通り) String型の配列代入とVariant型の配列代入で動作が異なり、ww(0)、arr(0)と要素まで指定すると両方String型なので動作が同じになるのだと思います。
guest

0

最初の例では、"あああ"と、" 2"で分けられます。
先頭にスペースが入るから文字型になるんじゃないかと。

arr = "あああ,2"

でやってみてください

投稿2018/09/03 05:52

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inari_ken

2018/09/03 06:18 編集

ご回答ありがとうございます。 試しましたが、動作変わらずでした。 ※上記は勘違いでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問