Excel (VBA)

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

 
(Windows 10全般 : Excel 2016)
行列貼りつけ等
投稿日時: 20/02/25 10:44:34
投稿者: chokobanana

◆実現したい事
"ああ"(シート名)のC4〜最終行までを
"いい"(シート名)の総括表のタイトルとして行列入れ替えて貼り付けます
 
◆補足
"いい"(シート名)に2つ縦に並んで表があります
下の表のタイトルになります
上の表から下の表までは4行空白にしてます
 
◆困っていること
1)行列入れ替えて貼り付けるという構文の作り方
2)下の表の貼りつけ先の構文の作り方
 
ご指導よろしくお願いします。
 
 
◆マクロの記録
Sub Macro1()
     
    Sheets("ああ").Select
    Range("C4:C17").Select
    Selection.Copy
    Sheets("いい").Select
    Range("B97").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
 
End Sub

回答
投稿日時: 20/02/25 16:37:34
投稿者: WinArrow
投稿者のウェブサイトに移動

困っていることの
1)も2)もマクロの記録でコードが作成可能です。
どこのセルをどこに貼り付けるのか?キチンと説明しましょうね!

投稿日時: 20/02/25 16:49:19
投稿者: chokobanana

コメントありがとうございます
書いたつもりでしたが分かりづらかったようで申し訳ございません
 
>どこのセルをどこに貼り付けるのか?キチンと説明しましょうね!
 
どこを ⇒  "ああ"(シート名)のC4〜最終行までを
どこに ⇒ "いい"(シート名)の上の表の最終行から3行目に(行列入れ替えて)貼り付けます
 
 
一つ目の表の最終行
1
2
3
4 ⇒貼り付け先
二つ目表の最初の行
 
      
      

回答
投稿日時: 20/02/25 17:36:36
投稿者: mattuwan44

>◆困っていること
>1)行列入れ替えて貼り付けるという構文の作り方
>2)下の表の貼りつけ先の構文の作り方

 

Sub Macro1()
    Sheets("ああ").Range("C4:C17").Copy
    Sheets("いい ).Range("B97").PasteSpecial Transpose:=True
End Sub

 
でも、実際に困っていることは違うでしょ?
 
C17セル → C列の最終データ行
B97セル → シート上にある表の内、2番目の表のB列の先頭行
 
のように動的に可変でセルの位置を取得したいということですかね?困っていること。

回答
投稿日時: 20/02/26 10:17:15
投稿者: WinArrow
投稿者のウェブサイトに移動

chokobanana さんの引用:
コメントありがとうございます
書いたつもりでしたが分かりづらかったようで申し訳ございません
 
>どこのセルをどこに貼り付けるのか?キチンと説明しましょうね!
 
どこを ⇒  "ああ"(シート名)のC4〜最終行までを
どこに ⇒ "いい"(シート名)の上の表の最終行から3行目に(行列入れ替えて)貼り付けます
 
 
一つ目の表の最終行
1
2
3
4 ⇒貼り付け先
二つ目表の最初の行
 
      
      

 
この回答は、最初の質問文と同一です。
マクロの記録で作成したコードと同じです。
 
マクロの記録で作成したコードでは、意図したことにつながらないと思っているのではないか?
と推測していますが、その意図したことを説明しないと、キャッチボールになりません。
 

投稿日時: 20/02/26 12:59:56
投稿者: chokobanana

>C17セル → C列の最終データ行
 
Range("C4", Cells(Rows.Count, 3).End(xlUp)).Copy
こんなかんじではだめでしょうか?
 
 
>B97セル → シート上にある表の内、2番目の表のB列の先頭行
 のように動的に可変でセルの位置を取得したいということですかね?
 
そうなのです
表は可変で動きます
最終行は大丈夫ですが2番目の表のB列の先頭行ってどう書けばいいのか困っております
 
 
1)行列入れ替えて貼り付けるという構文の作り方 は
PasteSpecial Transpose:=True
とするのですね勉強になります

回答
投稿日時: 20/02/26 16:37:33
投稿者: mattuwan44

>>C17セル → C列の最終データ行
  
>Range("C4", Cells(Rows.Count, 3).End(xlUp)).Copy
>こんなかんじではだめでしょうか?

そんな感じでいいですが、
複数のシートを扱う場合、どのシートのセルの話かを明示しましょう。
受け取る人(エクセル君等)により好き勝手な解釈をされる可能性があり、
プログラム作成者の意図通りの結果にならない場合が多々あります。
 
Sheets("ああ").Range("C4", Sheets("ああ").Cells(Sheets("ああ").Rows.Count, 3).End(xlUp)).Copy
  
>>B97セル → シート上にある表の内、2番目の表のB列の先頭行
>> のように動的に可変でセルの位置を取得したいということですかね?
  
>そうなのです
>表は可変で動きます
>最終行は大丈夫ですが2番目の表のB列の先頭行ってどう書けばいいのか困っております

 
表と言われても実際にシート上にどんな風に入っているかわかりませんが、
シート上のどこかのセルを選択→
条件を選択してジャンプ→
定数→OK
で2つの表が選択されますか?
そうならば、2つ目の矩形範囲の1行上に張付ければいいように思います。
 
まずはマクロの記録をしてコードを探って下さい。
 
  
>1)行列入れ替えて貼り付けるという構文の作り方 は
>PasteSpecial Transpose:=True
>とするのですね勉強になります

「こんな時はこうする。」
という「暗記」ではまずいです。
ヘルプでPasteSpecialメソッドの使い方を確認し、
何を省略していいのか確認し、
こう書いたらどう動くのか、動作確認も十分に行ってください。

回答
投稿日時: 20/02/26 17:35:13
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
表は可変で動きます
最終行は大丈夫ですが2番目の表のB列の先頭行ってどう書けばいいのか困っております

貼り付け先の表
は、データが入っていない
というのが普通の考え方です。
 
従って、2番目の表の先頭行を取得するのではなく、
1番目の表との相対関係で2番目の表の先頭行を求める
と考えましょう。
 
例、2番目の表の先頭が、1番目の最終行の次の行を考えるならば、
1番目の最終行に+1が2番目の表の先頭行になります。

回答
投稿日時: 20/02/26 23:04:42
投稿者: takesi

WinArrow さんの引用:
[
貼り付け先の表
は、データが入っていない
というのが普通の考え方です。
 

 
"ああ"(シート名)が入力フォームで
"いい"(シート名)リストの1行に追加で収めたいとか

投稿日時: 20/02/27 12:56:04
投稿者: chokobanana

>複数のシートを扱う場合、どのシートのセルの話かを明示しましょう。
 
ご指摘ありがとうございます
次回より気をつけるようにします
 
>シート上のどこかのセルを選択→
>条件を選択してジャンプ→
>定数→OK
>で2つの表が選択されますか?
 
2つの表というか入力がある場所だけが選択されます
1つ目の表は右端と最終行は全部です、他は入力箇所のみでした
2つ目の表は全部入力があるから選択されました
矩形選択で2つ目の表の仕方を調べましたがshift+矢印キー等を教えてみたりと
やってみましたがよく分かりませんでした
やり方が違うのかもしれませんね
 
◆マクロの記録
Sub Macro4()
 
    Selection.SpecialCells(xlCellTypeConstants, 23).Select
End Sub
 

回答
投稿日時: 20/02/27 15:25:16
投稿者: mattuwan44

>>複数のシートを扱う場合、どのシートのセルの話かを明示しましょう。
  
>ご指摘ありがとうございます
>次回より気をつけるようにします

言及されてないことは、指定されてないと同意だということを理解したかなあ。。。。
何回か失敗しないと身に沁みないかも知れませんが。
  
>>シート上のどこかのセルを選択→
>>条件を選択してジャンプ→
>>定数→OK
>>で2つの表が選択されますか?
  
>2つの表というか入力がある場所だけが選択されます
>1つ目の表は右端と最終行は全部です、他は入力箇所のみでした
>2つ目の表は全部入力があるから選択されました
>矩形選択で2つ目の表の仕方を調べましたがshift+矢印キー等を教えてみたりと
>やってみましたがよく分かりませんでした
>やり方が違うのかもしれませんね

 
こちらが想定している「表」と形が違うということです。
 
1つ目の「表」の中にはたくさんの空欄、空白行、空白列が存在するということですかね?
そうなると何を持ってどこからどこまでの範囲が「1つ目の表」と言えるのかを詳しく説明してください。
エクセル君に、
1つ目の表の範囲がここからここ、
2つ目の表の範囲がここからここ、と伝えるための言語がVBAというプログラミング言語なので、
まずは他人に日本語で説明できなければ、
それをVBA語に翻訳しエクセル君に伝えることが、出来ないと思いますが、いかがでしょうか?
 
あ、「2つ目の」というのはマクロの記録では「判断」する部分は記録されませんので、
勉強して表現を覚えるしかないです。

投稿日時: 20/02/27 17:07:43
投稿者: chokobanana

>言及されてないことは、指定されてないと同意だということを理解したかなあ。。。。
>何回か失敗しないと身に沁みないかも知れませんが。
 
ご心配くださりありがとうございます
しつこいぐらい指定していくよう気をつけます
 
 
>1つ目の「表」の中にはたくさんの空欄、空白行、空白列が存在するということですかね?
>そうなると何を持ってどこからどこまでの範囲が「1つ目の表」と言えるのかを詳しく説明してください。
 
はい
1つ目の表は可変ですが空欄、空白行が存在します
 
図で解説させてください
説明下手くそなのでまだ分かりにくかったら教えてください
 
1つ目、2つ目の表の行数や列数はその度に変わります
 
(1つ目の表)
A列と計の列(図ではG列)は最終行まで空白はありません
あと最終行(図では8行目)は最終列まで空白はありません
 
(2つ目の表)
1つ目の表の総括になります
この図でいうとB12をスタートに行列貼りつけたいです
 
    A列    B列    C列    D列    F列    G列  
1    日付    ああ        いい    うう    計  ←1つ目の表
2    1月1日     3        7        10
3    1月3日        4        1    5
4    1月11日        1        3    4
5    1月18日        7        2    9
6    1月29日            7    1    8
7    2月13日     1        7        8
8     計     4    12    21    7    44
9                        
10                        
11                        
12        ああ    いい    うう    計        ←貼り付け先
13    aa    4        7    11        ←2つ目の表
14    bb        21        21    
15    cc    12            12    
16    dd                0    
17    計    16    21    7    44    

回答
投稿日時: 20/02/27 18:34:41
投稿者: sk

引用:
"いい"(シート名)に2つ縦に並んで表があります

引用:
上の表から下の表までは4行空白にしてます

引用:
表は可変で動きます

引用:
1つ目、2つ目の表の行数や列数はその度に変わります

「既に 2 つの表が存在する状態からコードを実行しようとしている」のか、
「 2 つの表(もしくは下の表のみ)を新規作成(もしくは再作成)する
コードを作ろうとしていて、そのコードが実行される過程において
下の表の列見出しを設定しようとしている」のか、どちらなのでしょうか。

回答
投稿日時: 20/02/27 20:00:13
投稿者: mattuwan44

>しつこいぐらい指定していくよう気をつけます
しつこいのも嫌われますよ?(笑)
(気を付けるっていう言葉も信用しないけど。。。)
 
>(1つ目の表)
>A列と計の列(図ではG列)は最終行まで空白はありません
>あと最終行(図では8行目)は最終列まで空白はありません
  
>(2つ目の表)
>1つ目の表の総括になります
>この図でいうとB12をスタートに行列貼りつけたいです

 
ならば、A列だけをみたら、
それぞれの表の始まりと終わりが分かるわけですね?
じゃ、A列だけ選択して、ジャンプ機能で特定できますよね?
 
ジャンプ機能で得られた範囲の
2つ目の矩形範囲の最初のセルを基準に1行上の1列右
と書けばよさそう?
 

Sub test()
    With Worksheets("ああ").Range("C4")
        .Range(.Cells, .End(xlDown)).Copy
    End With
    Worksheets("いい").Range("A:A") _
            .SpecialCells(xlCellTypeConstants).Areas(2).Cells(0, 1).PasteSpecial Transpose:=True
End Sub

 
同じことを何度も言わないでいいようにWith句や変数の使い方も覚えましょう。
 
1番目の表の1行目をコピーしてもいいんじゃ???
Sub test()
    With Worksheets("いい").Range("A1").CurrentRegion
        .Rows(1).Offset(, 1).Copy .Resize(1).Offset(.Rows.Count + 3, 1)
    End With
End Sub
 
表の中のどれかのセルのCurrentRegionプロパティをみると、表の範囲が分かるので、
それからの相対位置で示すことも可能かも?
CellsプロパティやOffsetプロパティ、Areasプロパティ、Currentregionプロパティなど勉強してみてください。
 
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html

投稿日時: 20/02/28 09:34:51
投稿者: chokobanana

>「既に 2 つの表が存在する状態からコードを実行しようとしている」のか、
>「 2 つの表(もしくは下の表のみ)を新規作成(もしくは再作成)する
>コードを作ろうとしていて、そのコードが実行される過程において
>下の表の列見出しを設定しようとしている」のか、どちらなのでしょうか。
 
既に 2 つの表が存在する状態からコードを実行しようとしてます
 
>ならば、A列だけをみたら、
>それぞれの表の始まりと終わりが分かるわけですね?
>じゃ、A列だけ選択して、ジャンプ機能で特定できますよね?
  
マクロの記録できました
Sub Macro5()
 
    Columns("A:A").Select
    Selection.SpecialCells(xlCellTypeConstants, 23).Select
    ActiveWindow.SmallScroll Down:=78
    Range("A1:A97,A98:A101").Select
     
End Sub
 
>ジャンプ機能で得られた範囲の
>2つ目の矩形範囲の最初のセルを基準に1行上の1列右
>と書けばよさそう?
 
With Worksheets("ああ").Range("C4")
        .Range(.Cells, .End(xlDown)).Copy
    End With
 
なぜかC4行〜最終行じゃなく、E7〜E20を貼り付けてます
まだ解決できておりませんが、一旦
Sheets("ああ").Range("C4", Sheets("ああ").Cells(Sheets("ああ").Rows.Count, 3).End(xlUp)).Copy
に変更したらC4行〜最終行となりました
 
 
>1番目の表の1行目をコピーしてもいいんじゃ???
 
図の説明では分かりやすいよう同じにしてましたが、1番目の表の"ああ"(シート名)の
C4〜最終行までの順に並んでいないのです
勉強がてら並べる方法を考えてみます

回答
投稿日時: 20/02/28 18:11:07
投稿者: mattuwan44

>に変更したらC4行〜最終行となりました
ならば、とりあえず解決ですかね?
勉強したらきりがないので、
やりたいことが出来て、一応コードの意味が分かったなら解決でいいのでは?
 
>図の説明では分かりやすいよう同じにしてましたが、
>1番目の表の"ああ"(シート名)の
>C4〜最終行までの順に並んでいないのです
 
他人はエクセル君と同じで書いてあることだけを読んで、
それに対して動きます。
後から、「実は、、、、」みたいな話をしたところで、
無駄な労力をさせるだけです。
 
プログラムはエクセル君に伝える、作業手順書です。
ちゃんと書かないと、他人は勝手に解釈するということを
理解していただけらたら、この一連のやりとりが無駄ではなかったかなと思います。

投稿日時: 20/03/04 09:25:38
投稿者: chokobanana

皆様 色々とありがとうございました。
希望することはできるようになりました。