[[20201210163848]] 『セル範囲を値貼り付け』(しのみや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セル範囲を値貼り付け』(しのみや)

 結果シートのセル範囲に式を入れて、値貼り付けをしたかったので

 With Sheets("結果")       

    with .Range("C4:C13,C15:C19,C21:C27,C29:C33,C35:C41,C43:C52,C54:C58,T4:T12,T14:T17,T19:T26,T28:T38,T40:T43,T45:T49,T51:T55")
        .formulaR1C1="=RC[1]+RC[2]"
        .Value = .Value
    end with

 End With

 このようにしました。

 そうすると、C列は問題なく T列がC4のセルを値貼り付けしたようになりました。

 少し調べてみたのですが、列が変わると2次元配列になる?のでしょうか。

 Range("C4:C13").Copy
 Range("C4").PasteSpecial Paste:=xlPasteValues
 このように、一塊の範囲でコピー&ペーストをしていくのでしょうか。

 *先日OffsetやResizeを勉強したところなのですが、
  こちらが使えるのでしょうか

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 へー、面白い現象ですね・・と言ったら不謹慎か。

 我々、凡人ユーザーは RangeオブジェクトのValueプロパティ(取得と設定)が
 どのような振る舞いをするのか分かっていないことを痛感させてくれますね。

 泥縄的解決策としては、エリア単位の処理でどうですか?

 Sub test篠()
     Dim rArea As Range
     With Sheets("結果")
         With .Range("C4:C13,C15:C19,C21:C27,C29:C33,C35:C41,C43:C52,C54:C58,T4:T12,T14:T17,T19:T26,T28:T38,T40:T43,T45:T49,T51:T55")
             .FormulaR1C1 = "=RC[1]+RC[2]"

             For Each rArea In .Areas 'エリア単位に値化
                 rArea.Value = rArea.Value
             Next
         End With
     End With
 End Sub

(半平太) 2020/12/10(木) 17:31


 > そうすると、C列は問題なく T列がC4のセルを値貼り付けしたようになりました。

 因みに、C列でも問題は生じています。

(半平太) 2020/12/10(木) 17:55


Valueプロパティの振る舞いを調べるために下記のような簡単なテストをしてみます。

 Sub testValue()
    Dim a
    a = Range("A1:A3,A6:A8").Value

    Debug.Print UBound(a) & "," & UBound(a, 2)

 End Sub

イミディエイトウィンドウには
3,1
と出力されます。
3×1の2次元配列になってます。

そこで、

Sub testValue()

    Dim a
    a = Range("A1:A3,A6:A8").Value

    Debug.Print a(1,1)
    Debug.Print a(2,1)
    Debug.Print a(3,1)

 End Sub

を実行すると、A1からA3セルの値が出力されます。

Rangeで複数のセル範囲(エリア)を指定しても、Valueは最初のエリアだけ配列で返すということのようです。配列が複数のエリアを持つということはできませんので当然の結果と言えます。

ということで、半平太さんの提示されたコードのようにエリア単位で処理するしかないということになります。

(hatena) 2020/12/11(金) 00:28


https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.value
 マイクロソフトのHPでも
 >最初の領域に複数のセルが含まれている範囲の場合、 
 >Valueは、最初の範囲の個々のセルに含まれる値の
 >2次元配列を含むバリアント型 (Variant ) の値を返します。

 と解説されていますね
(とおりすがり) 2020/12/11(金) 07:28

 Valueの取得については、比較的簡単に理解できるが、
 Valueの設定の方はそんなに単純じゃない。

 規則性はあるように見えますが、解明するのは容易じゃないし、
 解明できたところで使い道は限られているので、
 あれこれ考えるのは時間の無駄と言う気がします。

(半平太) 2020/12/11(金) 07:53


 参考までに、下記A、B列を配列にいれて、D,E,F,Gに代入した1例を挙げておきます。

  Sub 飛び飛びテスト()
     Dim v     
     v = Range("A1:B3,A5:B6,A8:B11").Value     
     Range("D1:G3,D5:G6,D8:G11").Value = v
 End Sub

  行 _A_ _B_ _C_ __D__ __E__ __F__ __G__
   1  A   J        A     J    #N/A  #N/A 
   2  B   K        B     K    #N/A  #N/A 
   3  C   L        C     L    #N/A  #N/A 
   4                                    
   5  E   M        A     C     K    #N/A 
   6  F   N        B     J     L    #N/A 
   7                                    
   8  G   O        A     J    #N/A  #N/A 
   9  H   P        B     K    #N/A  #N/A 
  10  I   Q        C     L    #N/A  #N/A 
  11  J   R       #N/A  #N/A  #N/A  #N/A 

 何かマニアックな使い方ができそうな気がしないでもない。

(半平太) 2020/12/11(金) 09:33


 ありがとうございます

 エリア単位で進める方法があるのですね…

 自力で調べていて、
 わかったようなわからないような状態でしたが、
 いろんな検証下さり理解が深まりました。
 丁寧に回答下さりありがとうございました。
(しのみや) 2020/12/14(月) 10:37

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.