[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロ 不規則な行列入れ替えを繰り返したい』(スヌーピー)
データの一部を行列入れ替えをして貼り付けを行っており、
入れ替えたい行の下に必要行数の空白を入れるマクロまでは出来たのですが、
そこから先がうまくいきません
どのようなVBAにすれば良いでしょうか?
やりたい事
R列にW列〜AF列までの間にデータが入ってるものだけ行列置き換えて貼り付ける
下記表では
R2に「じゃがいも」 R3に「ピーマン」。
R8に「もも」R9に「すいか」R10に「みかん」R11に「ぶどう」R12に「さくらんぼ」 となります。
W列〜AF列のデータ個数はA列の自然数+1 になります。
最終行数や空白行などはデータによって毎回変わります。
よろしくお願い致します。
A … R S T U V W X Y Z AA AB AC AD AE AF 0 りんご 94 91 -3 0 0 0 0 0 0 0 0 0 0 0 1 やさい #N/A #N/A 24 25 じゃがいも ぴーまん 0 0 0 0 0 0 0 0
0 トマト 58 46 -12 0 0 0 0 0 0 0 0 0 0 0 0 にんじん 58 57 -1 0 0 0 0 0 0 0 0 0 0 0 0 ぶどう 1 -1 -2 0 0 0 0 0 0 0 0 0 0 0 0 きゃべつ 0 -2 -2 0 0 0 0 0 0 0 0 0 0 0 3 くだもの #N/A #N/A 50 52 もも すいか みかん ぶどう さくらんぼ 0 0 0 0 0
0 かき #N/A #N/A -1 0 0 0 0 0 0 0 0 0 0 0
< 使用 Excel:Office365、使用 OS:unknown >
それを提示してください。
Option Explicit
Sub test() Dim c As Range Dim n As Long
n = 1 For Each c In Range("A1:A10") If c.Value > 0 Then Cells(c.Row, "W").Resize(, 10).Copy Cells(n, "R").PasteSpecial Transpose:=True End If n = n + c.Value + 1 Next
End Sub
(マナ) 2020/02/01(土) 05:22
古いシートが要らなければ削除してしまえばいいわけですし。。。
(まっつわん) 2020/02/01(土) 07:54
Option Explicit
Sub test() Dim c As Range
For Each c In Range("A1:A10") If c.Value > 0 Then Cells(c.Row, "W").Resize(, 10).Copy Cells(c.Row, "R").PasteSpecial Transpose:=True End If Next
End Sub
(マナ) 2020/02/01(土) 07:58
ここも修正が必要でした。
(マナ) 2020/02/01(土) 08:05
>入れ替えたい行の下に必要行数の空白を入れるマクロまでは出来たのです
>それを提示してください。
空白行を追加するマクロは下記で処理してます。
Sub 空白行追加()
Dim i As Long For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 With Cells(i, 1) If VarType(.Value) = vbDouble And .Value > 0 Then If CLng(.Value) = .Value Then Rows(i + 1 & ":" & i + .Value).Insert Shift:=xlDown End If End If End With Next End Sub
マナさんのコードを試したのですが、これだと元々記入されていたR列の必要なデータまで
上書きされてしまいます。
上の例ですと、4行目のトマト 5行目にんじん などは残したままにしたいんです。。
まっつわんさん 挿入までは、マクロで処理できてるので、別シートでも結局は行列入れ替えの貼り付けが必要になってしまいます。。
(スヌーピー) 2020/02/01(土) 13:22
回答者のみなさん、良くこの質問に答えられますね。 質問の意味がさっぱり解らないのだけれど・・・。 (BJ) 2020/02/01(土) 14:19
こんにちは!
回答しようとチャレンジしましたが、、さっぱりわかりませんでした。(^^;
ご自身のBookでお試しになりたい気持ちはわかりますが、、こういう掲示板では、アドレスがすごく大切です。
要は、、こういう事です。という例え話のサンプルを提示されてそれをご自身で応用された方がいいと思います。
あと、不評ですけど、、レイアウトを作成するツールもあります。。。ご希望であれば、、、ですが、、、 (SoulMan) 2020/02/01(土) 14:29
これで問題ないなら、提示いただいた行挿入のマクロに組み込むとよいです。
(マナ) 2020/02/01(土) 14:42
私がわからなかった点を少し。。。 >下記表では >R2に「じゃがいも」 R3に「ピーマン」。
これは、 りんご やさい のことですか?
>R8に「もも」R9に「すいか」R10に「みかん」R11に「ぶどう」R12に「さくらんぼ」 となります。 これも??ですけど、、 トマト にんじん ぶどう きゃべつ くだもの のことですか?
あと、、↓この関係がよくわかりません。 >W列〜AF列のデータ個数はA列の自然数+1 になります。
特にA列の 3 のところは +1だと 4 ですが、、 >「もも」R9に「すいか」R10に「みかん」R11に「ぶどう」R12に「さくらんぼ」 だと 5 つ ですよね???
それから、、R2 R3 ときて なぜ? R8 R9・・・・と飛ぶのですか???
まぁ、、ご返信いただいてもお答え出来ないと思いますけど、、何かの足しにでもなれば幸いです。。。。 (SoulMan) 2020/02/01(土) 15:08
SoulManさん こんにちは
>> あと、不評ですけど、、レイアウトを作成するツールもあります なかなか便利なツールですよ (#^^#)v
自然数って、たしか 1、以上の整数でしたかね。じゃや2以上の【整数】ってことっすかね (?v?);え。。。 実数、負、正、整数、自然数。。。????なにやら数学みたいな。。。^^; 解らなくなっってきました、最近、失態が多いので ← もちろん私。これにて 失礼いたします。でわでわ m(_ _)m (隠居じーさん) 2020/02/01(土) 15:22
でした。
(マナ) 2020/02/01(土) 15:27
隠居じーさん さん こんにちは!!!
お馬ちゃんの合間に回答しようと思ったら、、全然、、さえなくて_| ̄|○です。(^^;
>最近、失態が多いので
いやいや、、ご活躍をチラッちっらっと陰ながら拝見しておりますですよ。。。
引き続きご活躍を願っております。。。。
では、、では、、また、、よろしくお願いします。(^^; (SoulMan) 2020/02/01(土) 15:32
あと、、W X Y のとこは、、X が 0 なので
>R列にW列〜AF列までの間にデータが入ってるものだけ行列置き換えて貼り付ける
パス するんでしょうね??? 多分??? (SoulMan) 2020/02/01(土) 15:39
A7セルは「4」のミスだとすると、 オリジナルのコードに 以下の2行挿入すればいいんじゃないですか?
If CLng(.Value) = .Value Then Rows(i + 1 & ":" & i + .Value).Insert Shift:=xlDown
'ここに2行挿入 Cells(.Row, "W").Resize(1, .Value + 1).Copy Cells(.Row, "R").PasteSpecial Paste:=xlPasteAll, Transpose:=True
End If
(半平太) 2020/02/01(土) 16:02
行列の入れ替えは、ワークシート上で使う用に、用意されている、
「Transpose関数」
を使うと容易に行列の入れ替えが出来ます。
(形式を指定して貼り付けでもできますね。)
Sub test() Dim r As Range '行 Dim c As Range '行の一部のセル Dim n As Long 'データの数 Dim i As Long '最後の行までちゃんと見てるか検証用にループの回数を数えてみる
For Each r In ActiveSheet.UsedRange.Rows i = i + 1 Set c = r.Range("W1:AF1") With WorksheetFunction 'W列からAF列までの文字列のデータの数を数える n = .CountA(c) - .Count(c) 'もし、データが2つ以上あれば If n > 1 Then '行挿入 r.EntireRow.Resize(n - 1).Offset(1).Insert '行列を入れ替えて値の転記 r.Range("R1").Resize(n).Value = .Transpose(c) End If End With Next Debug.Print i 'イミディエイトウィンドウに結果を出力 End Sub
(まっつわん) 2020/02/01(土) 16:14
回答者同士の挨拶はやめましょう。
質問者のみならず他の閲覧者にも不愉快を与え迷惑です。
(閲覧迷惑者) 2020/02/01(土) 22:10
Dim i As Long, j As Long, c As Range, r As Range For i = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1 If Val(Range("A" & i).Value) > 0 Then For j = 0 To Val(Range("A" & i).Value) Rows(i + 1).Insert Shift:=xlDown Next j Set r = Range("R" & i + 1) For Each c In Range("S" & i & ":AF" & i) If Not (IsNumeric(c.Value) Or Left(c.Text, 1) = "#") Then r.Value = c.Value Set r = r.Offset(1) End If Next c End If Next i End Sub (mm) 2020/02/03(月) 14:20
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.