[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『(追加)現状のプログラムに追加で行を下に移動させるプログラム等を作りたいのですが』(Lexus)
はじめましてLexusと申します。
現在マクロVBAでプログラムを組んでおり、それに新たにプログラムを追加したいのですが分からず困っています。
現状のプログラム内容は
E列の数字<D列の数字だと行全体が上に移動し、C列の名称が赤色に変化(Sheet2に反映)
条件に当てはまらない場合は移動もなしで色もそのままです。
これに新たに追加して最終的に以下のプログラム内容にしたいと思ってます。
@E列の数字(以下E列)がD列の数字(以下D列)より大きい場合C列の文字(以下C列)が赤色になり行が上に行く
AE列とD列の数字が等しい場合文C列が緑色になり行の移動はなし。
BE列がD列より小さい場合C列が青色になり行が下に行く
どなたか教えて頂けないでしょうか?よろしくお願い申し上げます。
※現状のプログラム
Sub 振り分け検知()
Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRow As Long Dim lngColumn As Long Dim lngRowMax As Long Dim lngColumnMax As Long Dim vntData As Variant Dim lngResultRow1 As Long Dim lngResultRow2 As Long Dim t As Single
t = Timer Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2")
With WS2.Rows(2) .Resize(.Worksheet.Rows.Count - .Row + 1).Delete End With
lngColumnMax = 9 ReDim vntResultData1(1 To 65536, 1 To lngColumnMax) As Variant ReDim vntResultData2(1 To 65536, 1 To lngColumnMax) As Variant
vntData = WS1.Range("B1").CurrentRegion.Resize(, lngColumnMax).Value lngRowMax = UBound(vntData, 1)
For lngRow = 2 To lngRowMax If vntData(lngRow, 3) < vntData(lngRow, 4) Then lngResultRow1 = lngResultRow1 + 1 For lngColumn = 1 To lngColumnMax vntResultData1(lngResultRow1, lngColumn) = vntData(lngRow, lngColumn) Next Else lngResultRow2 = lngResultRow2 + 1 For lngColumn = 1 To lngColumnMax vntResultData2(lngResultRow2, lngColumn) = vntData(lngRow, lngColumn) Next End If Next
If lngResultRow1 > 0 Then WS2.Range("B2").Resize(lngResultRow1, lngColumnMax).Value = vntResultData1 WS2.Range("B2").Offset(, 1).Resize(lngResultRow1).Font.ColorIndex = 3 End If If lngResultRow2 > 0 Then WS2.Range("B2").Offset(lngResultRow1).Resize(lngResultRow2, lngColumnMax).Value = vntResultData2 End If
Debug.Print "処理を終了しました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss"), vbInformation
End Sub
Excel2000使用、Windows7です。
違う手法で...
Sub test() Dim a, i As Long, n As Long, b() As Range Dim myIndex As Long, t As Long, s As Single s = Timer Application.ScreenUpdating = False With Sheets("sheet1").Range("b1").CurrentRegion a = .Value: t = .Columns.Count: n = 2 ReDim b(1 To 3) For i = n To UBound(a, 1) Select Case True Case a(i, 3) > a(i, 4): myIndex = 1 Case a(i, 3) = a(i, 4): myIndex = 2 Case Else: myIndex = 3 End Select If b(myIndex) Is Nothing Then Set b(myIndex) = .Rows(i) Else Set b(myIndex) = Union(b(myIndex), .Rows(i)) End If Next End With With Sheets("sheet2") .Cells.Clear Sheets("sheet1").Rows(1).Copy .Range("a1") For i = 1 To 3 If Not b(i) Is Nothing Then b(i).Copy .Range("b" & n) .Range("c" & n).Resize(b(i).Cells.Count / t).Font.ColorIndex = _ Choose(i, 3, 4, xlNone) n = n + b(i).Cells.Count / t End If Next End With Erase a, b Application.ScreenUpdating = True Debug.Print Format(Timer - s, "#.000000") End Sub (seiya)
実行時エラー”1004”
FontクラスのColorIndexプロパティを設定できません。
と表示され
.Range("c" & n).Resize(b(i).Cells.Count / t).Font.ColorIndex = _
Choose(i, 3, 4, xlNone) の部分が黄色く表示されてしまいます。。。
★が修正・追加した部分 元コードが理解できていれば、↓の意味もわかると思います。
Sub 振り分け検知2() Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRow As Long Dim lngColumn As Long Dim lngRowMax As Long Dim lngColumnMax As Long Dim vntData As Variant Dim lngResultRow1 As Long Dim lngResultRow2 As Long Dim lngResultRow3 As Long '★ Dim t As Single t = Timer Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") With WS2.Rows(2) .Resize(.Worksheet.Rows.Count - .Row + 1).Delete End With lngColumnMax = 9 ReDim vntResultData1(1 To 65536, 1 To lngColumnMax) As Variant ReDim vntResultData2(1 To 65536, 1 To lngColumnMax) As Variant ReDim vntResultData3(1 To 65536, 1 To lngColumnMax) As Variant '★ vntData = WS1.Range("B1").CurrentRegion.Resize(, lngColumnMax).Value lngRowMax = UBound(vntData, 1) For lngRow = 2 To lngRowMax If vntData(lngRow, 3) < vntData(lngRow, 4) Then lngResultRow1 = lngResultRow1 + 1 For lngColumn = 1 To lngColumnMax vntResultData1(lngResultRow1, lngColumn) = vntData(lngRow, lngColumn) Next ElseIf vntData(lngRow, 3) = vntData(lngRow, 4) Then '★ lngResultRow2 = lngResultRow2 + 1 For lngColumn = 1 To lngColumnMax vntResultData2(lngResultRow2, lngColumn) = vntData(lngRow, lngColumn) Next Else lngResultRow3 = lngResultRow3 + 1 '★ For lngColumn = 1 To lngColumnMax '★ vntResultData3(lngResultRow3, lngColumn) = vntData(lngRow, lngColumn) '★ Next End If Next If lngResultRow1 > 0 Then WS2.Range("B2").Resize(lngResultRow1, lngColumnMax).Value = vntResultData1 WS2.Range("B2").Offset(, 1).Resize(lngResultRow1).Font.ColorIndex = 3 End If If lngResultRow2 > 0 Then WS2.Range("B2").Offset(lngResultRow1).Resize(lngResultRow2, lngColumnMax).Value = vntResultData2 WS2.Range("B2").Offset(lngResultRow1, 1).Resize(lngResultRow2).Font.ColorIndex = 10 End If If lngResultRow3 > 0 Then '★ WS2.Range("B2").Offset(lngResultRow1 + lngResultRow1).Resize(lngResultRow3, lngColumnMax).Value = vntResultData3 '★ WS2.Range("B2").Offset(lngResultRow1 + lngResultRow1, 1).Resize(lngResultRow3).Font.ColorIndex = 5 '★ End If '★ Debug.Print "処理を終了しました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss"), vbInformation End Sub
WS2.Range("B2").Offset(lngResultRow1 + lngResultRow2).Resize(lngResultRow3, lngColumnMax).Value = vntResultData3 '★ WS2.Range("B2").Offset(lngResultRow1 + lngResultRow2, 1).Resize(lngResultRow3).Font.ColorIndex = 5 '★
xlNone を xlAutomatic に変更してみてください。 もし、それでもエラーが出るならDebug時の i の値を調べてください。 (seiya)
としたところできました。
chooseの前の_の削除と4の後に5を追加しましたらできました。
(Lexus)
変ですね... こちらでは動作確認をして、問題なく動いています。 (seiya)
それはあり得ません。 Coose関数のヘルプを参照してください。 i = 1 to 3 なので > Choose(i, 3, 4, 5, xlNone) の xlnoneは 対象外になるはずです。 (seiya)
seiyaさんが上で書いてますが、xlAutomaticにすればいいかと。
マナさん 話がややこしくなるから、余計なことはやめましょう。 (seiya)
(Lexus)
@E列の数字(lngRow, 4)=<G列の数字(lngRow, 6)であれば上の行に移動しC列の文字(lngRow, 2)が赤色に
AE列の数字>G列の数字であればそのまま
BE列の数字>=F列の数字(lngRow, 5)であれば下の行に移動しC列の文字が青色に
CE列の数字<F列の数字であればそのまま
というプログラムを作成したいのですがわからなくて困っております。
現状のプログラムは
@E列の数字(lngRow, 4)=<G列の数字(lngRow, 6)であれば上の行に移動しC列の文字(lngRow, 2)が赤色に
AE列の数字>G列の数字であればそのまま
というプログラムのみです
Sub Sample()
Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRow As Long Dim lngColumn As Long Dim lngRowMax As Long Dim lngColumnMax As Long Dim vntData As Variant Dim lngResultRow1 As Long Dim lngResultRow2 As Long Dim t As Single
t = Timer Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2")
With WS2.Rows(2) .Resize(.Worksheet.Rows.Count - .Row + 1).Delete End With
lngColumnMax = 9 ReDim vntResultData1(1 To 65536, 1 To lngColumnMax) As Variant ReDim vntResultData2(1 To 65536, 1 To lngColumnMax) As Variant
vntData = WS1.Range("B1").CurrentRegion.Resize(, lngColumnMax).Value lngRowMax = UBound(vntData, 1)
For lngRow = 2 To lngRowMax If vntData(lngRow, 4) <= vntData(lngRow, 6) Then lngResultRow1 = lngResultRow1 + 1 For lngColumn = 1 To lngColumnMax vntResultData1(lngResultRow1, lngColumn) = vntData(lngRow, lngColumn) Next Else lngResultRow2 = lngResultRow2 + 1 For lngColumn = 1 To lngColumnMax vntResultData2(lngResultRow2, lngColumn) = vntData(lngRow, lngColumn) Next End If Next
If lngResultRow1 > 0 Then WS2.Range("B2").Resize(lngResultRow1, lngColumnMax).Value = vntResultData1 WS2.Range("B2").Offset(, 1).Resize(lngResultRow1).Font.ColorIndex = 3 End If If lngResultRow2 > 0 Then WS2.Range("B2").Offset(lngResultRow1).Resize(lngResultRow2, lngColumnMax).Value = vntResultData2 End If
Debug.Print "処理を終了しました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss"), vbInformation
End Sub
どうかお願い申し上げます。
> @E列の数字(lngRow, 4)=<G列の数字(lngRow, 6)であれば上の行に移動しC列の文字(lngRow, 2)が赤色に > AE列の数字>G列の数字であればそのまま > BE列の数字>=F列の数字(lngRow, 5)であれば下の行に移動しC列の文字が青色に > CE列の数字<F列の数字であればそのまま
具体的にイメージ出来ない.... 条件が重複するのでは?
例 E列 < G列 (上の行に移動しC列の文字(lngRow, 2)が赤色) 且つ E列 > F列 (下の行に移動しC列の文字が青色) (seiya)
では変更しました。
@F列の数字(lngRow, 5)=<H列の数字(lngRow, 7)であれば上の行に移動しC列の文字(lngRow, 2)が赤色に
AF列の数字>H列の数字であればそのまま
BE列の数字(lngRow, 4)>=G列の数字(lngRow, 6)であれば下の行に移動しC列の文字が青色に
CE列の数字<G列の数字であればそのまま
でお願い致します。
(Lexus)
B C D E F G H コード 名称 前場始値 前日始値 前日始値 売気配 買気配 1662 石油資源 3175 3175 3175 3200 3195 1721 コムシス 1067 1067 1067 1076 1074 1801 大成建設 219 219 219 222 221 1802 大林組 346 346 346 352 350 1812 鹿島建設 214 214 214 218 217
Sheet1はこういう感じになっております。
重複するためEをコピーしたのをFに作成しました。
(Lexus)
衝突..
@F列の数字(lngRow, 5)=<H列の数字(lngRow, 7) - 上の行に移動しC列の文字(lngRow, 2)が赤色 で且つ BE列の数字(lngRow, 4)>=G列の数字(lngRow, 6)- 下の行に移動しC列の文字が青色 の場合は?
条件判定の項目が増えれば、条件そのものはもっと複雑になるはず。 (seiya)
簡単にはできませんよ? あり得る条件を列挙して、それに対する処理を記述しないとコードは書けません。
まず一息入れて、よく考えてみましょう。 (seiya)
(Lexus)
重複というのは、E列をF列ともG列とも比較していることではありません。 上に移動する条件と下に移動する条件が同時に成り立つ可能性があったからです。 その場合どうするのか。 でも、例を見ると、必ずG列>H列 という隠れた条件がありそうですが、いかがですか。 (cai)
> 私はVBA初心者なので全くプログラム組めません。。。 > このプログラムも組んでもらっております。 > なので動作内容しか私には投稿できません。。。
これVBAとは関係ありませんよ? 矛盾のない詳細な条件が明示されないと、コードが書けない、ということです。
例えば、 1) F =< H で 1) - 1. E <= G の場合 1) - 2. E > G の場合 2) F > H で 2) - 1 E <= G の場合 2) - 2 E > G の場合 とか... (seiya)
G列とE列はそのとおりですね。
株式は必ず売り気配値のほうが>買い気配値より上にきます。
あとから変更しました
@F列の数字(lngRow, 5)=<H列の数字(lngRow, 7)であれば上の行に移動しC列の文字(lngRow, 2)が赤色に
AF列の数字>H列の数字であればそのまま
BE列の数字(lngRow, 4)>=G列の数字(lngRow, 6)であれば下の行に移動しC列の文字が青色に
CE列の数字<G列の数字であればそのまま
であれば重複しないのではないでしょうか?
(Lexus)
では
@ F =< H で
1→ E <= G の場合何もなし 2→ E > G の場合何もなし A F > H で 2) - E <= G の場合何もなし 2) - E > G の場合何もなし BE >= G で 1→ F >= H の場合何もなし 2→ F < H の場合何もなし A E< G で 2) - F >= H の場合何もなし 2) - F < H の場合何もなし これでどうでしょうか? (Lexus)
全て何も無し? (seiya)
ゆっくり考えてください。 コーディングの一番重要な部分ですから。 (seiya)
1→ E <= G の場合、上に移動しC列の文字が赤くなる 2→ E > G の場合何もなし A F > H で 2) - E <= G の場合、上に移動しC列の文字が赤くなる 2) - E > G の場合何もなし BE >= G で 1→ F >= H の場合下に移動しC列の文字が青くなる 2→ F < H の場合何もなし A E< G で 2) - F >= H の場合下に移動しC列の文字が青くなる 2) - F < H の場合何もなし これで大丈夫と思います。 (Lexus)
1→ E <= F の場合、上に移動しC列の文字が赤くなる 2→ E > F の場合何もなし A E > G で 2) - E <= F の場合、上に移動しC列の文字が赤くなる 2) - E > F の場合何もなし BE >= Fで 1→ E >= G の場合下に移動しC列の文字が青くなる 2→ E< G の場合何もなし A E< F で 2) - E >= Gの場合下に移動しC列の文字が青くなる 2) - E < G の場合何もなし
これで重複「しないですか?
(Lexus)
@ E =< G で 1→ E <= F の場合、上に移動しC列の文字が赤くなる 2→ E > F の場合何もなし A E > G で (@ 以外の場合) 2) - E <= F の場合、上に移動しC列の文字が赤くなる 2) - E > F の場合何もなし
こういうことですか? これ以外の条件は考えられないのですが? (seiya)
最終決定しました。。
@ E =< G で
1→ E < F の場合、上に移動しC列の文字が赤くなる 2→ E > F の場合何もなし 3→ E = F の場合何もなし A E > G で 1) - E < F の場合、上に移動しC列の文字が赤くなる 2) - E > F の場合何もなし 3) - E = F の場合何もなし B E >= Fで 1→ E > G の場合下に移動しC列の文字が青くなる 2→ E< G の場合何もなし 3→ E = G の場合何もなし A E< F で 1) - E >= Gの場合下に移動しC列の文字が青くなる 2) - E < G の場合何もなし 3) - E = G の場合何もなし
これで正式決定します。
何度も訂正すいません
これで大丈夫でしょうか?
1→ E < F の場合、上に移動しC列の文字が赤くなる 2→ E > F の場合何もなし 3→ E = F の場合何もなし A E > G で 1) - E < F の場合、上に移動しC列の文字が赤くなる 2) - E > F の場合何もなし 3) - E = F の場合何もなし B E >= Fで 1→ E > G の場合下に移動しC列の文字が青くなる 2→ E< G の場合何もなし 3→ E = G の場合何もなし C E< F で 1) - E > Gの場合下に移動しC列の文字が青くなる 2) - E < G の場合何もなし 3) - E = G の場合何もなし
E と G E と F
の比較ですよね?
条件は 1) E =< G で 1-1 E < F 1-2 E > F 1-3 E = F 2) E < G (1 以外で) 2-1 E < F 2-2 E > F 2-3 E = F
だけですよね? (seiya)
E と G
E と F の比較であっております。
1) E =< G で
1-1 E < Fの場合上に移動しC列の文字が赤くなる 1-2 E > Fの場合下に移動しC列の文字が青くなる 1-3 E = Fの場合下に移動しC列の文字が青くなる 2) E > G (1 以外で) 1-1 E < Fの場合上に移動しC列の文字が赤くなる 1-2 E > Fの場合下に移動しC列の文字が青くなる 1-3 E = Fの場合下に移動しC列の文字が青くなる
こうです。
(Lexus)
1) E =< G で 1-1 E < Fの場合上に移動しC列の文字が赤くなる 1-2 E >= Fの場合下に移動しC列の文字が青くなる 2) E > G (1 以外で) 1-1 E < Fの場合上に移動しC列の文字が赤くなる 1-2 E >= Fの場合下に移動しC列の文字が青くなる
ということですね?
前出の表の結果は全て青になります。
Option Explicit
Sub test() Dim a, i As Long, n As Long, b(1 To 2) As Range Dim myIndex As Long, t As Long, s As Single s = Timer Application.ScreenUpdating = False With Sheets("sheet1").Range("b1").CurrentRegion a = .Value: t = .Columns.Count: n = 2 For i = n To UBound(a, 1) Select Case True Case a(i, 4) <= a(i, 6) If a(i, 4) < a(i, 5) Then myIndex = 1 Else myIndex = 2 End If Case Else If a(i, 4) < a(i, 5) Then myIndex = 1 Else myIndex = 2 End If End Select If b(myIndex) Is Nothing Then Set b(myIndex) = .Rows(i) Else Set b(myIndex) = Union(b(myIndex), .Rows(i)) End If Next End With With Sheets("sheet2") .Cells.Clear Sheets("sheet1").Rows(1).Copy .Range("a1") For i = 1 To 2 If Not b(i) Is Nothing Then b(i).Copy .Range("b" & n) .Range("c" & n).Resize(b(i).Cells.Count / t).Font.Color = _ Choose(i, vbRed, vbBlue) n = n + b(i).Cells.Count / t End If Next End With Erase a, b Application.ScreenUpdating = True Debug.Print Format(Timer - s, "#.000000") End Sub (seiya)
上のウィンドウもスクロールできるのでしょうか?
(Lexus)
Hummmm... どのような状況なのか... それは私にはわかりません。 (seiya)
それは、分割画面のアクティブ(クリックする)な方だけに反応するはずです。 (seiya)
本当にありがとうございました。
(Lexus)
最後に、 、 > 一つ補足ですが必ずF<Gという結果になります。
これは条件になりません。 F = G 又は F > G が存在する場合は条件の一部になり得ますが...
次に質問するする際は、仕様を整理して、わかりやすく伝えるように 努力してください。 プログラム作成の第一歩であり、最も重要な部分です。 (seiya)
次回からはきちんと考えてから投稿いたします。
本当にありがとうございましたseiya様
(Lexus)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.