[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『sheet1からsheet2へ変則コピー』(OL)
(excel2010) sheet1からsheet2へ、下記の法則でコピーするマクロを教えて下さい。 宜しくお願いします。 ・sheet1のB列に、10個のデータがあります。 ・1(赤)は、値が1でセルが赤で塗ってあるの意味です。 ・昇順でsheet2へ5行毎コピーする。セルの色もコピーする。 ・C列はB列と同じ色にする。E列はD列と同じ色にする。 ・重複した値は1つだけコピーする。
sheet1
A B
1
2 1(赤)
3 3(赤)
4 5(黄)
5 2(赤)
6 6(黄)
7 9(緑)
8 2(赤)
9 10(緑)
10 4(黄)
sheet2
A B C D E
1
2 1(赤) (赤) 6(黄) (黄)
3 2(赤) (赤)
4 3(赤) (赤)
5 4(黄) (黄) 9(緑) (緑)
6 5(黄) (黄) 10(緑) (緑)
数字が1〜10 という前提で。
Sub Sample()
Dim c As Range
Dim sh1 As Worksheet
Dim i As Long
Dim j As Long
Application.ScreenUpdating = False
Set sh1 = Sheets("Sheet1")
With Sheets("Sheet2")
.Cells.Clear
For Each c In sh1.Range("B1", sh1.Range("B" & sh1.Rows.Count).End(xlUp))
If Not IsEmpty(c.Value) Then
i = ((c.Value - 1) Mod 5) + 1
j = ((((c.Value - 1) \ 5) + 2) - 1) * 2
With .Cells(i, j)
.Value = c.Value
.Interior.Color = c.Interior.Color
.Offset(, 1).Interior.Color = .Interior.Color
End With
End If
Next
.Select
End With
Set sh1 = Nothing
Application.ScreenUpdating = True
MsgBox "組み替え完了"
End Sub
同じ数字で違う色があれば後がち
(ぶらっと)
(Mook)さん(ぶらっと)さんへ。思い通りに出来ました。 VBAは始めたばかりですので、このコードで勉強させていただきます。 有難う御座いました。 (OL)
恥ずかしながら質問させて下さい。 戴いたコードの中で、アクティブセルから右1つのセルを選択と解ったのですが、 .Offset(, 1).Interior.Color = .Interior.Color 右3つを範囲選択するにはどの様にすれば良いのでしょうか? ↓ではエラーとなりました。 .Resize(1, 4).Select.Interior.Color = .Interior.Color 宜しくお願いします。 (OL)
.Value = c.Value .Resize(1, 4).Interior.Color = c.Interior.Color (Mook)
>Resize を使えば、この2行で出来そうですね。
あっ、そうか。もともとの仕様でも、2行でよかったね。 もう、年寄りの昼寝の時間帯だったので眠くて眠くて。
(ぶらっと)
(Mook)さん (ぶらっと)さん 有難う御座いました。 出来ました。
もう一つ質問お願いします。 .Resize(1, 4).Interior.Color = c.Interior.Color で出来たのですが、現在2列目はD列に書かれます。 これをG列に書く場合の御指導お願いします。 (OL)
ふっふっふ。今、D列はどうなるのと、レスしようとしていたところ。
ところで、Sheet1のB列のものをSheet2のB列とD列にセットしようとしたとき、それはB列かD列か、そして何行目なのかは
行は i = ((c.Value - 1) Mod 5) + 1
列は j = ((((c.Value - 1) \ 5) + 2) - 1) * 2
この計算で出している。
新しい要件でも行はかわらないので、列の計算式を変えるんだけど、これはVBAの課題ではなく「算数」の課題。
自分でがんばってみない?
ちなみに、j を出しているコードを日本語にすると
j = (Sheet1のセルの値 -1 ) を 5 で割った、商(あまりは無視)に 2 を足したものから 1 を引いて その答えに 2 をかけている。
あっ、今気がついた。2 を足して 1を引くのなら、最初から 1 を足せばよかったね。まぁ、いぃか。ご愛嬌。
追記) あっ!またまた気がついた。アップした j の計算式は、元シートのB列に10以上のどんな値が入っても
それにふさわしい列を求める式だったんだけど、10までに限定するなら 値が 5までなら
B列、6以上ならD列にしたらよかったんだね!
ということは、新しい要件なら、 5 までなら j= 2、6以上なら j=7 。これならできるでしょ?
出血大サービスで
j = ((((c.Value - 1) \ 5) + 2) - 1) * 2
これにかえて
If c.Value > 5 Then
j = 7
Else
j = 2
End If
(ぶらっと)
(ぶらっと) さん 出欠大サービス有難う御座います。 これで解りました。 j = ((((c.Value - 1) \ 5) + 2) - 1) * 2 では解りませんでした。 馬鹿な(OL)でご迷惑お掛けしました。 (OL)
sheet1
A B C
1
2 1(赤) d
3 3(赤) w
4 5(黄) r
5 2(赤) y
6 6(黄) s
7 9(緑) x
8 2(赤) y
9 10(緑) h
10 4(黄) j
sheet2
A B C D E
1
2 1(赤) d(赤) 6(黄) s(黄)
3 2(赤) y(赤)
4 3(赤) w(赤)
5 4(黄) j(黄) 9(緑) x(緑)
6 5(黄) r(黄) 10(緑) h(緑)
(ぶらっと)さんに教えて戴いたマクロです。
Sub Sample()
Dim c As Range
Dim sh1 As Worksheet
Dim i As Long
Dim j As Long
Application.ScreenUpdating = False
Set sh1 = Sheets("Sheet1")
With Sheets("Sheet2")
.Cells.Clear
For Each c In sh1.Range("B1", sh1.Range("B" & sh1.Rows.Count).End(xlUp))
If Not IsEmpty(c.Value) Then
i = ((c.Value - 1) Mod 5) + 1
If c.Value > 5 Then
j = 7
Else
j = 2
End If
With .Cells(i, j)
.Value = c.Value
.Interior.Color = c.Interior.Color
.Offset(, 1).Interior.Color = .Interior.Color
End With
End If
Next
.Select
End With
Set sh1 = Nothing
Application.ScreenUpdating = True
MsgBox "組み替え完了"
End Sub
(OL)
↑でアップされたコードはSheet2のB,G列にしているので、そのまま。(質問サンプルは B,D列になってるけど)
Mookさんのアドバイス、3行で転記せずとも2行でOKというところも加味。
Sub Sample2()
Dim c As Range
Dim sh1 As Worksheet
Dim i As Long
Dim j As Long
Application.ScreenUpdating = False
Set sh1 = Sheets("Sheet1")
With Sheets("Sheet2")
.Cells.Clear
For Each c In sh1.Range("B1", sh1.Range("B" & sh1.Rows.Count).End(xlUp))
If Not IsEmpty(c.Value) Then
i = ((c.Value - 1) Mod 5) + 1
If c.Value > 5 Then
j = 7
Else
j = 2
End If
With .Cells(i, j)
.Resize(, 2).Value = c.Resize(, 2).Value
.Resize(, 2).Interior.Color = c.Interior.Color
End With
End If
Next
.Select
End With
Set sh1 = Nothing
Application.ScreenUpdating = True
MsgBox "組み替え完了"
End Sub
(ぶらっと)
(ぶらっと)さん 度々の回答に感謝致します。 有難う御座いました。
(OL
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.