Excel (VBA)

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

 
(Windows 10 Pro : Excel 2013)
特定の範囲のデータを右方向に貼り付けていきたい
投稿日時: 18/05/24 20:48:29
投稿者: reason69

計sheetのAには項目、B1:B14に項目に対する日々の値が入ります。
項目は一意で順番等の変更はありません。B列の値が日々変動します。
この計sheetB1:B14の値をグラフ化したいため
グラフ元sheetのB1:B14を起点にして日々列方向に(C1:C14、D1:D14〜)
貼り付けていきたいと考えています。
                     
やりたいこと
         B列    C列     D列  E列    F列
B1(日付) 5月25日 5月26日 5月27日 5月30日   略
B2(項目A) 15 13 11 16   略
B3(項目B) 2 4 1 6    略

                     
                     
途中まで作成して修正しているものが以下になりますが、
貼り付け先の指定がうまくできないため、
グラフ元sheetのB1:B14から列右方向に蓄積して貼り付けていくことが出来ません。
セル1つだと列方向に貼り付けさせる動きを確認することが出来たのですが
セル範囲だと、考えているように貼付することが出来ません。
                     
Sub tikuseki()
    Sheets("計").Select
    Range("B1:B14").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("グラフ元").Select
   Range("B1").Select
      Cells(1, Columns.Count).End(xlToLeft).Select
      Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False
                           
End Sub
                     
入力されている一番右列をセル指定しようとしているのがいけないのかと思いますが
B1を起点として列方向に貼り付けたい場合にはどのようなオプションを使用し
指定すれば良いでしょうか。

回答
投稿日時: 18/05/24 22:02:26
投稿者: mattuwan44

右に書き込むんじゃなくて、最後の行の1行下に行列を入れ替えて貼り付けたいんですよね?
 
Sub test()
     Sheets("計").Range("B1:B14").Copy
     With Sheets("グラフ元")
        .Cells(.Rows.Count, "B").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues, Transpose:=True
    End With
End Sub
 

回答
投稿日時: 18/05/24 22:37:57
投稿者: WinArrow
投稿者のウェブサイトに移動

コードの記述については、いろいろ問題はありますが、
動作します。
 
しかし、意図した結果になることを保証するものではありません。
 
で、・・・・
意図する結果をこのコードを実行した結果がどのように違うおか?
を説明してください。
 
最初の記述に打ち手の問題の解決は、それからにしましょう。

投稿日時: 18/05/25 09:29:17
投稿者: reason69

コメントを下さった皆様ありがとうございます。
私の記述した内容に漏れがありわかりにくく申し訳ありません。
 
データ元の記載が漏れていました。
計sheet
    A列   B列
1行  日付   5/25  
2行  項目A   15
3行  項目B   2
4行   略   略
 
 
グラフ元sheet
         B列    C列     D列  E列    F列
B1(日付) 5月25日 5月26日 5月27日 5月30日   略
B2(項目A) 15 13 11 16   略
B3(項目B) 2 4 1 6    略
 略
 
行列等の入れ替えはなく、計sheetのB列の値をグラフ元sheetの列方向に順に貼り付けていきたいです。
計sheetに5/26のデータが入ったら、計sheetB列のデータをグラフ元sheetのC列に貼り付け、
計sheetのに入ったデータをグラフ元sheetの列方向に蓄積して貼り付けていきたいと考えています。
 
 

回答
投稿日時: 18/05/25 10:17:19
投稿者: mattuwan44

あぁ、なるほど。寝ぼけてましたね。
 
現状の表の範囲を取得して、その表の列数+1の位置に転記したい
という事でしたか。。。
 
Sub test()
    Sheets("計").Range("B1:B14").Copy
    With Sheets("グラフ元").Range("B1").CurrentRegion
        .Columns(.Columns.Count + 1).PasteSpecial Paste:=xlPasteValues
    End With
End Sub
 
これで、意味が解りますかね?

回答
投稿日時: 18/05/25 14:25:34
投稿者: WinArrow
投稿者のウェブサイトに移動

文章訂正
>最初の記述に打ち手の問題の解決は、それからにしましょう。

 
最初の記述についての問題の解決は、それからにしましょう。
 
 
mattuwan44 さんからのレスで、お分かりのように、
シートのSelect(選択)もセルのSelect(選択)も、
コードの中には、記述がありませんよね・・・・
従って、Selection.〜というコードも存在しません。
 
マクロの記録で、コードを作成すると殆どの場合、
Select月のコードになります。
最初はマクロの記録で作成したコードを基に勉強するのですが、
VBAへのスキルアップの第一歩としてSelectを止める(記述しない)工夫をお勧めします。
 
Selectを記述するデメリット(Actvateも同じ)
Selectは間違いではありませんが、
(1)レスポンスが悪い・・・・遅い
(2)コードの読みにくい・・・メンテナンスの苦労する(後継者へ引継げない)
等があげられます。
 
例えば,次のようなコードは、下の例1簡略版のようになります。

Sheets("sheet1").Select
Range("A1").Select
Selection.Copy
Sheets("sheet2").Select
Range("B5").Select
Sheets("Sheet2").Paste
Application.CutCopyMode = False

例1簡略版
Sheets("Sheet1").Range("A1").Copy Destination:=Sheets("sheet2").Range("B5")

 
 

投稿日時: 18/05/25 18:01:49
投稿者: reason69

mattuwan44さん、ありがとうございました。
同じコードを使って試していた時にどうしてもB2のみにしか貼り付かなかったのでセル指定しているのがいけないのかと思っていました。
おかげさまで問題なく列方向へ更新貼り付けし続けることができました。
基本がわかっていないからこういうことになってしまうのだと思いますが、CurrentRegionについて調べて、実際のファイルの体裁を整えながら動きを確認しました。勉強になりました。
 
WinArrowさんもご回答ありがとうございました。
いただいたコードについて週明けもう一度いろいろ試してみたいと思います。
本件は解決いたしましたのでクローズさせていただきます。