Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7842 / 13645 ツリー ←次へ | 前へ→

【36480】初心者なのでおしえてください komoro 06/4/1(土) 12:08 質問[未読]
【36483】Re:初心者なのでおしえてください クウガ 06/4/1(土) 16:34 回答[未読]
【36484】Re:初心者なのでおしえてください ちゃう 06/4/1(土) 16:45 発言[未読]
【36486】Re:初心者なのでおしえてください クウガ 06/4/1(土) 17:21 発言[未読]
【36487】Re:初心者なのでおしえてください クウガ 06/4/1(土) 17:31 発言[未読]
【36496】Re:初心者なのでおしえてください komoro 06/4/2(日) 7:12 質問[未読]
【36497】Re:初心者なのでおしえてください クウガ 06/4/2(日) 8:20 回答[未読]
【36518】Re:初心者なのでおしえてください komoro 06/4/2(日) 13:15 質問[未読]
【36525】Re:初心者なのでおしえてください Kein 06/4/2(日) 14:05 回答[未読]
【36528】Re:初心者なのでおしえてください クウガ 06/4/2(日) 14:32 発言[未読]
【36530】Re:初心者なのでおしえてください Kein 06/4/2(日) 14:46 発言[未読]
【36533】Re:初心者なのでおしえてください komoro 06/4/2(日) 17:10 発言[未読]
【36534】Re:初心者なのでおしえてください Kein 06/4/2(日) 17:32 発言[未読]
【36536】Re:初心者なのでおしえてください komoro 06/4/2(日) 19:50 発言[未読]
【36537】Re:初心者なのでおしえてください Kein 06/4/2(日) 22:19 発言[未読]
【36539】Re:初心者なのでおしえてください komoro 06/4/3(月) 8:15 お礼[未読]
【36526】Re:初心者なのでおしえてください クウガ 06/4/2(日) 14:30 回答[未読]
【36532】Re:初心者なのでおしえてください komoro 06/4/2(日) 17:06 発言[未読]
【36535】Re:初心者なのでおしえてください 白い鳩 06/4/2(日) 18:55 発言[未読]
【36540】Re:初心者なのでおしえてください komoro 06/4/3(月) 8:27 お礼[未読]

【36480】初心者なのでおしえてください
質問  komoro  - 06/4/1(土) 12:08 -

引用なし
パスワード
   コードをコンパクトにしたいのですが
どなたかご教示お願いいたします。

<Sheet1> データ
 A    B    C    D
3 コード1     コード2     コード3     金額     
4 1     2     1     33     
5 1     2     1     34     
 1     4     1     9     
 1     3     1     22     
 2     1     1     100     
 2     2     1     45     
 1     3     1     78     
 2     1     1     67


<Sheet2> 転記先
A    B    C
2 コード1     コード2     金額     
3 1     2     67     
4 1     3     100     
 1     4     9     
 1     5     0     
 2     1     167     
 2     2    45

Sub test()
Sheets("Sheet1").Select
  
Range("J2") = 1 'コード3が1の場合
    
  AA = 3
 
For i = 1 To 10

  Sheets("Sheet2").Select
  Range(Cells(AA, 1), Cells(AA, 1)).Select

If Range(Cells(AA, 1), Cells(AA, 1)) > 0 Then
Selection.Copy
  Sheets("Sheet1").Select
  Range("H2").Select 'コード1
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
  Application.CutCopyMode = False
  
  Sheets("Sheet2").Select
  Range(Cells(AA, 2), Cells(AA, 2)).Select
  Selection.Copy
  Sheets("Sheet1").Select
  Range("I2").Select'コード2
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
  Application.CutCopyMode = False
  Range("A1").Select
  
  Range("A3:D20").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
   Range("H1:J2"), CopyToRange:=Range("F3:I3"), Unique:=False
   'Range("H1:J2")=コード1,コード2,コード3,金額
   'Range("F3:I3")"=コード1,コード2,コード3,金額
  
Sheets("Sheet1").Select
  Range("k2").Select'金額の計
  Selection.Copy
  Sheets("Sheet2").Select
  Range(Cells(AA, 3), Cells(AA, 3)).Select
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
  
  
  End If
AA = AA + 1
 Next
End Sub

【36483】Re:初心者なのでおしえてください
回答  クウガ E-MAILWEB  - 06/4/1(土) 16:34 -

引用なし
パスワード
   ▼komoro さん:
こんにちは、クウガです。
まず最初は、マクロの記録から・・・
これはいいことです。
しかしながら、マクロの記録をした後は、
Selectして、Selectして・・・となります。
まず、ここを削りましょう。

Sheets("Sheet2").Range(Cells(AA, 2), Cells(AA, 2)).Copy

Range(Cells(AA, 2), Cells(AA, 2)) は、一つのセルのようですね。
Cells(AA, 2) だけでいいと思います。
それに、コピーでなくてもそのまま値を代入でもよさそうですので、

Sheets("Sheet1").Range("I2") = Sheets("Sheet2").Cells(AA, 2)

With を使ってもまだコンパクトに、
With Sheets("Sheet1")
 .Range("I2") = Sheets("Sheet2").Cells(AA, 2)
End With

どうでしょうか、分かりにくかったでしょうか?
がんばってください。


>コードをコンパクトにしたいのですが
>どなたかご教示お願いいたします。
>
><Sheet1> データ
> A    B    C    D
>3 コード1     コード2     コード3     金額     
>4 1     2     1     33     
>5 1     2     1     34     
> 1     4     1     9     
> 1     3     1     22     
> 2     1     1     100     
> 2     2     1     45     
> 1     3     1     78     
> 2     1     1     67
>
>
><Sheet2> 転記先
> A    B    C
>2 コード1     コード2     金額     
>3 1     2     67     
>4 1     3     100     
> 1     4     9     
> 1     5     0     
> 2     1     167     
> 2     2    45
>
>Sub test()
>Sheets("Sheet1").Select
>  
>Range("J2") = 1 'コード3が1の場合
>    
>  AA = 3
> 
>For i = 1 To 10
>
>  Sheets("Sheet2").Select
>  Range(Cells(AA, 1), Cells(AA, 1)).Select
>
>If Range(Cells(AA, 1), Cells(AA, 1)) > 0 Then
>Selection.Copy
>  Sheets("Sheet1").Select
>  Range("H2").Select 'コード1
>  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
>    False, Transpose:=False
>  Application.CutCopyMode = False
>  
>  Sheets("Sheet2").Select
>  Range(Cells(AA, 2), Cells(AA, 2)).Select
>  Selection.Copy
>  Sheets("Sheet1").Select
>  Range("I2").Select'コード2
>  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
>    False, Transpose:=False
>  Application.CutCopyMode = False
>  Range("A1").Select
>  
>  Range("A3:D20").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
>   Range("H1:J2"), CopyToRange:=Range("F3:I3"), Unique:=False
>   'Range("H1:J2")=コード1,コード2,コード3,金額
>   'Range("F3:I3")"=コード1,コード2,コード3,金額
>  
>Sheets("Sheet1").Select
>  Range("k2").Select'金額の計
>  Selection.Copy
>  Sheets("Sheet2").Select
>  Range(Cells(AA, 3), Cells(AA, 3)).Select
>  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
>    False, Transpose:=False
>  
>  
>  End If
> AA = AA + 1
> Next
>End Sub

【36484】Re:初心者なのでおしえてください
発言  ちゃう  - 06/4/1(土) 16:45 -

引用なし
パスワード
   ▼クウガ さん:
>まず、ここを削りましょう。
>
>Sheets("Sheet2").Range(Cells(AA, 2), Cells(AA, 2)).Select

違いますね。 このような記述は、間違いです。 

必ず先にシートをアクティブにします。 

Sheets("Sheet2").Activate
Range(Cells(AA, 2), Cells(AA, 2)).Select

です。

【36486】Re:初心者なのでおしえてください
発言  クウガ E-MAILWEB  - 06/4/1(土) 17:21 -

引用なし
パスワード
   ▼ちゃう さん:

ごめんなさい。先程気付いて修正しておきました。
Select → Copy
だめですね、久しぶりに回答すると、こんなミスをおかしてしまいます。


>▼クウガ さん:
>>まず、ここを削りましょう。
>>
>>Sheets("Sheet2").Range(Cells(AA, 2), Cells(AA, 2)).Select
>
>違いますね。 このような記述は、間違いです。 
>
>必ず先にシートをアクティブにします。 
>
>Sheets("Sheet2").Activate
>Range(Cells(AA, 2), Cells(AA, 2)).Select
>
>です。

【36487】Re:初心者なのでおしえてください
発言  クウガ E-MAILWEB  - 06/4/1(土) 17:31 -

引用なし
パスワード
   ごめんなさい。
Sheets("Sheet2").Range(Cells(AA, 2), Cells(AA, 2)).Copy
では、いけませんね。

Sheets("Sheet2").Cells(AA, 2).Copy

【36496】Re:初心者なのでおしえてください
質問  komoro  - 06/4/2(日) 7:12 -

引用なし
パスワード
   ▼クウガ さん:
おはようございます。
回答ありがとうございました。
再度質問させてください。

下記の部分は簡略できますでしょうか?
ご教示お願いします。

For i = 1 To 10

  Sheets("Sheet2").Activate
  Cells(AA, 1).Select

If Cells(AA, 1) > 0 Then
Selection.Copy
  Sheets("Sheet1").Activate
  Range("H2").Select 'コード1
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
  Application.CutCopyMode = False

【36497】Re:初心者なのでおしえてください
回答  クウガ E-MAILWEB  - 06/4/2(日) 8:20 -

引用なし
パスワード
   ▼komoro さん:
おはようございます。

If Sheets("Sheet2").Cells(AA, 1) > 0 Then
  Sheets("Sheet1").Range("H2") = Sheets("Sheet2").Cells(AA, 1)
End If

やりたい事をまとめると、こういう事になるのかな?と思われますが、
どうでしょう。


>回答ありがとうございました。
>再度質問させてください。
>
>下記の部分は簡略できますでしょうか?
>ご教示お願いします。
>
>For i = 1 To 10
>
>  Sheets("Sheet2").Activate
>  Cells(AA, 1).Select
>
>If Cells(AA, 1) > 0 Then
>Selection.Copy
>  Sheets("Sheet1").Activate
>  Range("H2").Select 'コード1
>  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
>    False, Transpose:=False
>  Application.CutCopyMode = False

【36518】Re:初心者なのでおしえてください
質問  komoro  - 06/4/2(日) 13:15 -

引用なし
パスワード
   ▼クウガ さん:
ありがとうございます。
うまく動いてます。

もう少しなんとか簡略したいのですが
わがまま言って申し訳けございません。

Sub test()
Sheets("Sheet1").Select
  
Range("J2") = 1
    
  AA = 3
 
For i = 1 To 10

  Sheets("Sheet2").Activate
   Cells(AA, 1).Select

If Sheets("Sheet2").Cells(AA, 1) > 0 Then
  Sheets("Sheet1").Range("H2") = Sheets("Sheet2").Cells(AA, 1)
  
  Sheets("Sheet2").Cells(AA, 2).Copy
  
  Sheets("Sheet1").Activate
  Range("I2").Select
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
  Application.CutCopyMode = False
  Range("A1").Select
  
  Sheets(1).Range("A3:D20").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
   Range("H1:J2"), CopyToRange:=Range("F3:I3"), Unique:=False
  
   Sheets("Sheet1").Range("K2").Copy
  Sheets("Sheet2").Activate
  Cells(AA, 3).Select
  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
  
  End If
AA = AA + 1
 Next
End Sub

【36525】Re:初心者なのでおしえてください
回答  Kein  - 06/4/2(日) 14:05 -

引用なし
パスワード
   Sub Test_同じこと()
  Dim i As Integer
  Dim Sh1 As Worksheet, Sh2 As Worksheet

  Set Sh1 = Worksheets("Sheet1")
  Set Sh2 = Worksheets("Sheet2")
  For i = 12 To 3 Step -1
   If Sh2.Cells(i, 1).Value > 0 Then
     Sh1.Range("H2:I2").Value = Sh2.Cells(i, 1).Value
     Sh1.Range("A3:D20").AdvancedFilter xlFilterCopy, _
     Sh1.Range("H1:J2"), Sh1.Range("F3:I3")
     Exit For
   End If
  Next i
  With Sh2.Range("C3:C12")
   .Formula = "=IF($A3>0,Sheet1!$K$2,"""")"
   .Value = .Value
  End With
  Set Sh1 = Nothing: Set Sh2 = Nothing
End Sub 

このコードの実行結果が、あなたの提示したコードの処理と一致しなかったら、
どこかおかしいということになります。

【36526】Re:初心者なのでおしえてください
回答  クウガ E-MAILWEB  - 06/4/2(日) 14:30 -

引用なし
パスワード
   ▼komoro さん:
クウガでございます。
私は、Select したり、Copy Paste したりするのは、
できるだけ、省いたほうがいいかと思いますので、

>Sub test()

>Sheets("Sheet1").Select
>Range("J2") = 1
ここは、Sheets("Sheet1").Select する必要は無いと思いますので、
Sheets("Sheet1").Range("J2") = 1
でいいのではないのでしょうか。

>    
>  AA = 3
> 
>For i = 1 To 10


>  Sheets("Sheet2").Activate
>   Cells(AA, 1).Select
ここは、いりません。


>If Sheets("Sheet2").Cells(AA, 1) > 0 Then
>  Sheets("Sheet1").Range("H2") = Sheets("Sheet2").Cells(AA, 1)
 
 
>  Sheets("Sheet2").Cells(AA, 2).Copy
>  Sheets("Sheet1").Activate
>  Range("I2").Select
>  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
>    False, Transpose:=False
>  Application.CutCopyMode = False
>  Range("A1").Select
ここは、
Sheets("Sheet1").Range("I2") = Sheets("Sheet2").Cells(AA, 2)
で、よろしいのでは?

  
>  Sheets(1).Range("A3:D20").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
>   Range("H1:J2"), CopyToRange:=Range("F3:I3"), Unique:=False

  
>   Sheets("Sheet1").Range("K2").Copy
>  Sheets("Sheet2").Activate
>  Cells(AA, 3).Select
>  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
>    False, Transpose:=False
ここも、
Sheets("Sheet2").Cells(AA, 3) = Sheets("Sheet1").Range("K2")
で、よろしいのでは?

  
>  End If
> AA = AA + 1
> Next
>End Sub


あと、With を使った場合、省けるところは省けますので、
使った方がいいかと思います。

Sheets("Sheet1").Range("I2") = Sheets("Sheet2").Cells(AA, 2)
Sheets("Sheet2").Cells(AA, 3) = Sheets("Sheet1").Range("K2")

With Sheets("Sheet2")
  Sheets("Sheet1").Range("I2") = .Cells(AA, 2)
  .Cells(AA, 3) = Sheets("Sheet1").Range("K2")
End With

先に、Sheets("Sheet1")を Activate にしておけば、

Sheets("Sheet1").Activate
With Sheets("Sheet2")
  Range("I2") = .Cells(AA, 2)
  .Cells(AA, 3) = Range("K2")
End With

に、なります。
最初から、よーく目を通していけば、
この Selectは、必要かな?とか、省ける所は出てくると思いますので、
色々考えてみてください。

【36528】Re:初心者なのでおしえてください
発言  クウガ E-MAILWEB  - 06/4/2(日) 14:32 -

引用なし
パスワード
   先に、Kein さんがお答えになっていたようですね、
失礼致しました。

【36530】Re:初心者なのでおしえてください
発言  Kein  - 06/4/2(日) 14:46 -

引用なし
パスワード
   かぶるとかナンとかは気にしないで、どんどん自由に書き込んだら良いと思います。
まじめな回答ならどれも、質問者が無視することなど到底できません。

【36532】Re:初心者なのでおしえてください
発言  komoro  - 06/4/2(日) 17:06 -

引用なし
パスワード
   ▼クウガ さん:

本当にありがとうございます。
また大変勉強になりました。

下記のとこだけうまくいきませんでした。
 
>>  Sheets("Sheet2").Cells(AA, 2).Copy
>>  Sheets("Sheet1").Activate
>>  Range("I2").Select
>>  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
>>    False, Transpose:=False
>>  Application.CutCopyMode = False
>>  Range("A1").Select
>ここは、
>Sheets("Sheet1").Range("I2") = Sheets("Sheet2").Cells(AA, 2)
>で、よろしいのでは?
Sheets("Sheet1").Range("I2") = Sheets("Sheet2").Cells(AA, 2)
でして見たのですが金額がゼロ表示になってしまいました。

【36533】Re:初心者なのでおしえてください
発言  komoro  - 06/4/2(日) 17:10 -

引用なし
パスワード
   ▼Kein さん:
ありがとうございます。
コードの書き方も色々あるのですね・・参考になります。

早速試しました。
結果、金額の集計がゼロになりました。
高度すぎてわかりません。
教えてください。

【36534】Re:初心者なのでおしえてください
発言  Kein  - 06/4/2(日) 17:32 -

引用なし
パスワード
   >金額の集計
は、どのシートのどのセルのことでしょーか ?
あと Sheet1 の A3:A12 には、実際にはどんな値が入力されているか、一つずつ
書いて下さい。

【36535】Re:初心者なのでおしえてください
発言  白い鳩  - 06/4/2(日) 18:55 -

引用なし
パスワード
   ▼komoro さん:

初心者だからコード全てを教えてもらおうってわけじゃないんですね?
もし自分でコードの内容を理解しようとか、VBAをもっと理解しようって意識があるなら、自分で調べてみましょう。

まず、Sheets("Sheet1").Range("I2") = Sheets("Sheet2").Cells(AA, 2)
これは、Sheets("Sheet1").Range("I2")にSheets("Sheet2").Cells(AA, 2)を入れる意味です。

金額がゼロ表示されるのであれば、Sheets("Sheet2").Cells(AA, 2)の値が0ってことです。
もしくは、ちゃんとした値が入った後、別のコードで0って上書きされてるか。
MsgboxなどでSheets("Sheet2").Cells(AA, 2)の値を確認してから代入してあげればいいかと思います。
自分の思ったとおりの動作を確認してからMsgboxなどは全部コード内から消してあげればいいと思います。

最初から全部のコードを作るなんてベテランの人もやってないとおもいます。
Msgboxとかいろいろな方法で確認をとりながらコードを作成しています。
確認が取れた時点で、MsgboxとかDebug.Printとか確認の部分を削除してコードが完成します。

【36536】Re:初心者なのでおしえてください
発言  komoro  - 06/4/2(日) 19:50 -

引用なし
パスワード
   ▼Kein さん:
質問の内容がわかりずらくてすみません。。

>>金額の集計
Sheet2 のC列になります。

>あと Sheet1 の A3:A12 には、実際にはどんな値が入力されているか、一つずつ
>書いて下さい。

ランダムに入力されています。
<Sheet1> データ
 A    B    C    D
3 コード1  コード2  コード3  金額     
4 1     2    1    33     
5 1     2    1    34     
 1     4    1    9     
 1     3    1    22     
 2     1    1    100     
 2     2    1    45     
 1     3    1    78     
 2     1    1    67


<Sheet2> 転記先(結果)
A    B    C
2 コード1  コード2   金額     
3 1     2     0     
4 1     3     0     
 1     4     0     
 1     5     0     
 2     1     0     
 2     2     0

【36537】Re:初心者なのでおしえてください
発言  Kein  - 06/4/2(日) 22:19 -

引用なし
パスワード
   Sheet2 の C3:C12 には、=IF($A3>0,Sheet1!$K$2,"") という数式を入力し、値に戻し
ています。つまり「数式の入力行と同じ行のA列の値が0より大きいなら、Sheet1という
名前のシートのK2の値を入れる。そうでなければ空白にする。」という式です。で、
提示された情報によると A3:A12 の範囲がすべて0より大きいということなんで、C3:C12
は「すべてSheet1のK2セルの値」が入力されていることになります。それかすべて空白に
なっているなら、Sheet1のK2が空白だということです。

【36539】Re:初心者なのでおしえてください
お礼  komoro  - 06/4/3(月) 8:15 -

引用なし
パスワード
   ▼Kein さん:
おはようございます。
ご指導ありがとうございます。
アドバイスいただいたことを、確認したいと思います。

【36540】Re:初心者なのでおしえてください
お礼  komoro  - 06/4/3(月) 8:27 -

引用なし
パスワード
   ▼クウガ さん:
いままでアドバイスしていただきありがとうございました。
再度確認しながら作成したいと思います。
本当に感謝しております。

7842 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free