Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2010)
セルを範囲指定した時と、個別指定した時の違いについて
投稿日時: 21/08/21 20:59:12
投稿者: S_SAIKI

お世話になります。
 
配列からセルに代入する際、セルを範囲指定した時と、個別指定した時の違いについて教えて下さい。
 
String型の二次元配列を用意し、数字を代入します。
数字を代入した二次元配列を、範囲指定したセルに代入すると、文字としてセルに代入されます。
範囲指定せず、各セルを個別指定して代入した場合、数値として代入されます。
 
セルを範囲指定した場合、文字として代入され、
セルを個別指定した場合、数値として代入されますが、この違いは、何が違うのでしょうか?

回答
投稿日時: 21/08/21 21:24:00
投稿者: WinArrow
投稿者のウェブサイトに移動

二次元配列の定義に依存します。
   
(1)文字列型
Dim 範囲(1 to 3,1 to 4) As String
   
(2)Valiant型
Dim 範囲(1 to 3,1 to 4)
   
   
文字列型で定議するとセルには文字列で代入されます。
   
Valint型で定義すると、入っているデータの型に対応してセルに代入されます。
※配列の中に文字列があれば、文字列で、数値があれば数値で、日付/時刻の場合は日付型で代入される
ということです。
 
※もともとセルは、Valiant型になっているので、
私は、配列を定義する場合、データ型を定義していません。

回答
投稿日時: 21/08/22 00:26:36
投稿者: simple

文字列型として宣言した配列であっても、
その一要素を単独セルに入力すると、数値になる、
ということですか?
 
それは、Excelのいわゆる"小さな親切、大きなお世話"の類でしょう。
人が入力したときの動作を忖度してくれるのではないですか?
 
こういう質問の時は、事象が再現できる、簡単なコードを提示するといいと思いますよ。

回答
投稿日時: 21/08/22 07:34:21
投稿者: WinArrow
投稿者のウェブサイトに移動

配列定義の違いではなく、
String定義の状態で
セル範囲で代入して時と、セル個別に代入して時の違い
↓の例
 

Dim HHH(1 To 2, 1 To 3) As String, h As Long, J As Long

    HHH(1, 1) = 100
    HHH(1, 2) = 100
    HHH(1, 3) = 100
    HHH(2, 1) = 100
    HHH(2, 2) = 100
    HHH(2, 3) = 100
    
    Range("G1").Resize(2, 3).Value = HHH
    
    For h = 1 To 2
        For J = 1 To 3
            Cells(h, J).Value = HHH(h, J)
        Next
    Next

 
セルG1〜の範囲には文字列で代入されます。
セルA1〜の範囲には、数値で代入されます。
 
違いは、Excelの仕様です。
 
どちらの代入にすべきかを論ずることはしませんが、
その使い方を先に考えることが重要かと思います。

投稿日時: 21/08/22 19:14:33
投稿者: S_SAIKI

WinArrowさん
 
丁寧な回答ありがとうございます。
 
>違いは、Excelの仕様です。
>どちらの代入にすべきかを論ずることはしませんが、
>その使い方を先に考えることが重要かと思います。
Excelの仕様によるものなのですね。
承知しました。
 
また、コード記載いただきありがとうございます。
文字列のセルの範囲に、自身の範囲のセルを代入した場合、文字列が数値になります。
自身のセルの値を入れなおした場合、値に置き換える?と、どこかのサイトで見た気がしますが、
これも、値に置き換えて、かつセルが数値と認識されたという認識で合っていますか?
 

Dim HHH(1 To 2, 1 To 3) As String, h As Long, J As Long

    HHH(1, 1) = 100
    HHH(1, 2) = 100
    HHH(1, 3) = 100
    HHH(2, 1) = 100
    HHH(2, 2) = 100
    HHH(2, 3) = 100
    
    Range("G1").Resize(2, 3).Value = HHH
    [color=red]Range("G1").Resize(2, 3).Value = Range("G1").Resize(2, 3).Value ←ここで範囲指定したセルを再設定すると数値になるのもExcelの仕様でしょうか。[/color]
    
    For h = 1 To 2
        For J = 1 To 3
            Cells(h, J).Value = HHH(h, J)
        Next
    Next

 
何度も質問して申し訳ございません。
よろしくお願いいたします。

投稿日時: 21/08/22 19:16:13
投稿者: S_SAIKI

simpleさん
 
ご回答ありがとうございます。
 
 
>単独セルに入力すると、数値になる、ということですか?
単独セルに入力すると、数値になります。
 
>こういう質問の時は、事象が再現できる、簡単なコードを提示するといいと思いますよ。
そうですね。今後はコードを記載するなどします。
 
ありがとうございます。

回答
投稿日時: 21/08/22 21:14:17
投稿者: simple

追加質問について。
仕様なんでしょうね。
ただし、セル範囲の書式にも依存することに注意が必要です。
 

Sub test()
    Dim HHH(1 To 2, 1 To 3) As String
    Dim s As String
    
    s = "001"
    HHH(1, 1) = s
    HHH(1, 2) = s
    HHH(1, 3) = s
    HHH(2, 1) = s
    HHH(2, 2) = s
    HHH(2, 3) = s

    With Range("G1").Resize(2, 3)
        .NumberFormatLocal = "G/標準"
        .Value = HHH
        .Value = .Value      '結果は  1 となります。 
    End With
    
    With Range("J1").Resize(2, 3)
        .NumberFormatLocal = "@"
        .Value = HHH
        .Value = .Value     '結果は 001 となります。
    End With
End Sub

回答
投稿日時: 21/08/22 23:05:07
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
Range("G1").Resize(2, 3).Value = Range("G1").Resize(2, 3).Value ←ここで範囲指定したセルを再設定すると数
値になるのもExcelの仕様でしょうか。

 
前レスで
>もともとセルは、Valiant型になっている
>Valint型で定義すると、入っているデータの型に対応してセルに代入されます。
 
この両方のことから、
代入の右辺は、Valiant型ということになります。
 
私は、文字列で代入されて数字を数値化するのに、
このようなコードを書いたことがありませんでした。
「目からうろこ」です。
 
ちなみに
表示形式の中に「標準」という指定があります。
一般的にはスタンダードと訳しますが、
そういう意味ではなく、私は、「Excelにお任せ」と解釈しています。
 

投稿日時: 21/08/28 22:25:38
投稿者: S_SAIKI

simpleさん
 
返信ありがとうございます。
返信が遅くなり申し訳ございません。
 
>仕様なんでしょうね。
>ただし、セル範囲の書式にも依存することに注意が必要です。
 
仕様なのですね。
コードも記載頂き、とても分かりやすかったです。
本当にありがとうございました。