Excel VBA質問箱 IV

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

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


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

【78102】アクティブ行の列を選択してセルの色を変更したい HIRO 16/4/4(月) 17:54 質問[未読]
【78105】Re:アクティブ行の列を選択してセルの色を... β 16/4/4(月) 19:21 発言[未読]
【78106】Re:アクティブ行の列を選択してセルの色を... β 16/4/4(月) 19:56 発言[未読]
【78107】Re:アクティブ行の列を選択してセルの色を... マリオ 16/4/4(月) 20:44 回答[未読]
【78108】Re:アクティブ行の列を選択してセルの色を... β 16/4/4(月) 20:47 発言[未読]
【78109】Re:アクティブ行の列を選択してセルの色を... HIRO 16/4/5(火) 13:27 お礼[未読]

【78102】アクティブ行の列を選択してセルの色を変...
質問  HIRO  - 16/4/4(月) 17:54 -

引用なし
パスワード
   はじめまして。VBAで苦戦しており、質問させていただきます。

売上集計シートの行を1つ選択(任意)して、
別の帳票シートに値をコピーし、帳票を印刷するマクロを設定しています。
帳票に記載する内容が正しければそのまま印刷し、
売上集計シートの行・59および60列目のセルの色を変更します。
これは実行できました。

が、帳票に記載する内容が間違っている場合に、いったん帳票シートで修正をかけ、
出力ボタンで印刷するのですが、
その際に、元の売上集計シートの行・59および60列目のセルの色が変更できません。

印刷が成功した後に以下のようなコードを付けていますが

Sheets(ShName).Activate
   Dim gyou As Long
   gyou = ActiveCell.Row
    
   Range(Cells(gyou, 59),Cells(gyou,60)).Select 'エラー'
   Selection.Interior.ColorIndex = 10

どうしてもエラーが発生し、思うように動作してくれません。
gyou = ActiveCell.Rowは正しく取得できているのですが・・・

お知恵を拝借できると助かります。
どうぞよろしくお願いいたします。

【78105】Re:アクティブ行の列を選択してセルの色...
発言  β  - 16/4/4(月) 19:21 -

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

この処理を行うためにシートをActivateしたり、セルをSelectしたりしないでも
できますし、そうしないのが基本ですけど、それはそれとして。

エラー のエラー番号とメッセージは、どういうものでしたか?

【78106】Re:アクティブ行の列を選択してセルの色...
発言  β  - 16/4/4(月) 19:56 -

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

もう1つ。
このコードはどこに書かれていますか?

標準モジュールですか?
シートモジュールですか?

【78107】Re:アクティブ行の列を選択してセルの色...
回答  マリオ  - 16/4/4(月) 20:44 -

引用なし
パスワード
   これだと、どうでしょうか?エラーになりますか?

  Dim sh As Worksheet
  Set sh=Sheets(ShName)
  sh.Activate
  Dim gyou As Long
  gyou = ActiveCell.Row
  
  'アクティブシート名を確認
  Debug.Print Activeheet.Name
  
  '念のためもう一度、
  sh.Activate
  
  '★Cellsの前もシートを指定する
  sh.Range(sh.Cells(gyou, 59),sh.Cells(gyou,60)).Select
  
  Selection.Interior.ColorIndex = 10

【78108】Re:アクティブ行の列を選択してセルの色...
発言  β  - 16/4/4(月) 20:47 -

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

少しお先走ることになるかもしれませんが。

もし、このコードが Sheets(ShName) ではないシートのシートモジュールに書かれていた場合は
Range(Cells(gyou, 59),Cells(gyou,60)).Select 
このコードで、1004エラー RangeクラスのSelectメソッドが失敗しましたよいうエラーになります。

Sheets(ShName).Activate

これで、確実に Sheets(ShName) がアクティブシートになります。

gyou = ActiveCell.Row

ActiveCell はブックに1つしかありません。今アクティブになっているシートのアクティブになっているセルです。
ですから、このコードも、確実に Sheets(ShName) のアクティブセルを参照します。

問題はそのあと。

Range(Cells(gyou, 59),Cells(gyou,60)).Select 

セル領域に どのシートなのかという情報を明示しない場合、
・標準モジュールなら、今、アクティブになっているシート とみなされます。
 で、このコードは問題なくOKになるはずです。
・シートモジュールの場合は、そのコードが書かれたシートということになります。
 そのコードが書かれたシートが Sheets(ShName) ではなかった場合、
 Range(Cells(gyou, 59),Cells(gyou,60)) という領域は、今アクティブになっていないシートの領域になります。
 アクティブではないシートの領域は Select できません。なので、Select仕様とすると、
 それはエクセルのルールに反している!! と叱られます。

対応策は2つ。

1.このコードを標準モジュールに書く。
2.シートモジュールであれば

  With Sheets(ShName)
    .Activate   'これはActiveCell取得のためやむなし
    gyou = ActiveCell.Row
    'セル領域にシート修飾(ピリオド)をつける    
    .Range(.Cells(gyou, 59), .Cells(gyou, 60)).Interior.ColorIndex = 10
  End With

【78109】Re:アクティブ行の列を選択してセルの色...
お礼  HIRO  - 16/4/5(火) 13:27 -

引用なし
パスワード
   ▼β さん:
ありがとうございます!

迅速にご対応いただいたのに
確認が遅くなって非常に申し訳ありませんでした。

見事に成功しました!

シートに書かれているコードで、標準モジュールではなかったので
苦心していたところでした。
セル領域にシート修飾(ピリオド)をつけるという技に感動しました。
本当にありがとうございます。
そしてわかりやすい解説も付けていただき、感激しました。

まだまだ勉強が足りないな、と心から思いました。
今後とも何かあればご教示いただけますと幸甚です!

ありがとうございました。

>▼HIRO さん:
>
>少しお先走ることになるかもしれませんが。
>
>もし、このコードが Sheets(ShName) ではないシートのシートモジュールに書かれていた場合は
>Range(Cells(gyou, 59),Cells(gyou,60)).Select 
>このコードで、1004エラー RangeクラスのSelectメソッドが失敗しましたよいうエラーになります。
>
>Sheets(ShName).Activate
>
>これで、確実に Sheets(ShName) がアクティブシートになります。
>
>gyou = ActiveCell.Row
>
>ActiveCell はブックに1つしかありません。今アクティブになっているシートのアクティブになっているセルです。
>ですから、このコードも、確実に Sheets(ShName) のアクティブセルを参照します。
>
>問題はそのあと。
>
>Range(Cells(gyou, 59),Cells(gyou,60)).Select 
>
>セル領域に どのシートなのかという情報を明示しない場合、
>・標準モジュールなら、今、アクティブになっているシート とみなされます。
> で、このコードは問題なくOKになるはずです。
>・シートモジュールの場合は、そのコードが書かれたシートということになります。
> そのコードが書かれたシートが Sheets(ShName) ではなかった場合、
>  Range(Cells(gyou, 59),Cells(gyou,60)) という領域は、今アクティブになっていないシートの領域になります。
> アクティブではないシートの領域は Select できません。なので、Select仕様とすると、
> それはエクセルのルールに反している!! と叱られます。
>
>対応策は2つ。
>
>1.このコードを標準モジュールに書く。
>2.シートモジュールであれば
>
>  With Sheets(ShName)
>    .Activate   'これはActiveCell取得のためやむなし
>    gyou = ActiveCell.Row
>    'セル領域にシート修飾(ピリオド)をつける    
>    .Range(.Cells(gyou, 59), .Cells(gyou, 60)).Interior.ColorIndex = 10
>  End With

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