[[20180504223139]] 『二つのマクロの統合するマクロ』(GW) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『二つのマクロの統合するマクロ』(GW)

こんばんは
どうしても二つのマクロの統合がきちんと動かず、お助けください

記事を参考にしたマクロが二つありまして、その二つのマクロを統合させるマクロを一番下に書いております
しかし、不完全でボタンを作って試してみても、反応しません
どこに問題があるのかネットの情報をさがしましたがたどりつきませんので、
どなたかお助けをお願いします

 Option Explicit

 Dim 次は再表示 As Boolean

 Sub test2()
    Const pw As String = "00001"
    Dim r As Range
    Dim c As Range

    ActiveSheet.Unprotect Password:=pw

    Set r = Range("J7:J1006")

    If 次は再表示 Then
        r.EntireRow.Hidden = False
        次は再表示 = False
    Else
        For Each c In r
            If c.Value = 0 Then c.EntireRow.Hidden = True
        Next
        次は再表示 = True
    End If

    ActiveSheet.Protect Password:=pw

 End Sub

 Sub gyousoroe()
    Const pw As String = "00001"
    Dim r As Range
    Dim c As Range

    ActiveSheet.Unprotect Password:=pw

    Range("7:1006").Rows.autofit

 Dim myRow As Long

 For myRow = 7 To Cells(Rows.Count, 5).End(xlUp).Row
    With Cells(myRow, 5)
   .RowHeight = .RowHeight + 7
    End With

  Next myRow

    ActiveSheet.Protect Password:=pw

 End Sub

 Sub マクロの統合()

  Call test2

  Call gyousoroe

 End Sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 Sub マクロの統合()
を実行すれば。動いていますけど。^^
何をしてるのか意味不明ですけど。。。。。しっかりプロテクトかかっていますです。

 ^^;

(o) 2018/05/04(金) 23:02


Sub test2()は、J7:J1006に0が表示されている行を非表示にするマクロです
Sub gyousoroe()は、同じく7:1006行中の5列目の文字が折り返しで入力されているところに、
そのセルの上下に余白を入れるというものです。
これら二つのマクロをSub マクロの統合()で同時に実行させたいのですが、
行の非表示が実行されません。単独それぞれに実行すると非表示されます。
(GW) 2018/05/04(金) 23:13

Call gyousoroe
Call test2

ではいかがですか。

(o) 2018/05/04(金) 23:26


 失礼いたしました。ハンドル名が間違っていました。
当方、隠居じーさん
でした。(! ど〜でもいい !)^^
はい
済みません。
とりあえず、原因特定には至っていませんが。。。明日、早いので、失礼して
休ませていただきます。〜zzz
m(__)m

(隠居じーさん) 2018/05/04(金) 23:32


 多分ですけど(確認してません) ^^
せっかく
Hiddenしたけど
つぎの
Range("7:1006").Rows.AutoFit
の書式設定の自動最適化で
元に戻しているような気がします。
でわ

 。。。zzz

(隠居じーさん) 2018/05/04(金) 23:56


お休みモードで頭が回ってないですが、とりあえずご自身でステップ実行してみて、望む動きになっているのか分析してみてはいかがでしょうか。

ちなみに、Boolean型の「次は再表示」という変数は、なんでモジュールレベルにしたんでしょうか?
場合によっては、値が保持されちゃって困らないんでしょうか・・・
(というか、役割がよくわからない。。。。)

あとは、
>不完全でボタンを作って試してみても、反応しません
たぶん、フォームコントロールかActiveXコントロールのどちらかの(コマンド)ボタンだとおもいますが、前者ならマクロの登録しなきゃボタンを押したらそのマクロ動かしなさいってことがExcel君に伝わってないし、後者なら、コードを記述する場所が違うような。。。。(callで呼んでもいいでしょうけど)

(もこな2) 2018/05/05(土) 00:44


 おはようございます  ^^
気になった点だけですが。。。
実行するたびに行の高さが大きくなるマクロのような気がするのですが。
これで良いのでしょうか。
それとも
行もAutoFitでよいのでしょうか。
勘違いでしたらすみません。

(隠居じーさん) 2018/05/05(土) 10:40


 こんにちは ^^
失礼致しました、行、揃えておられますね。済みません。
(隠居じーさん) 2018/05/05(土) 10:40は無し、と言う事で ^^;;;
test2を実行時、gyousoroeを適時、自動で呼び出しています。
ボタンにtest2を登録してください。列揃えは不要と理解します。

 恐怖の憶測と、推測によるコードですので、バックアップは必ずお取りください。
外していましたらお許しを。 m(_ _)m

 Option Explicit
Dim 次は再表示 As Boolean
Sub test2()
    Const pw As String = "00001"
    Dim r As Range
    Dim c As Range
    ActiveSheet.Unprotect Password:=pw
    Set r = Range("J7:J1006")
    If 次は再表示 Then
        r.EntireRow.Hidden = False
        次は再表示 = False
        Call gyousoroe
    Else
        Call gyousoroe
        For Each c In r
            If c.Value = 0 Then c.EntireRow.Hidden = True
        Next
        次は再表示 = True
    End If
    ActiveSheet.Protect Password:=pw
End Sub
Private Sub gyousoroe()
    Dim r As Range
    Dim c As Range
    Dim myRow As Long
    Range("7:1006").Rows.AutoFit
    For myRow = 7 To Cells(Rows.Count, 5).End(xlUp).Row
        With Cells(myRow, 5)
           .RowHeight = .RowHeight + 7
        End With
    Next myRow
End Sub

(隠居じーさん) 2018/05/05(土) 11:07


相変わらず頭がまわってないですが、追加で。

(1)
「(隠居じーさん) 2018/05/04(金) 23:56」のコメントは私もその通りだと思うので、どうしてもオートフィットしたいなら、非表示より先にしておくか、ループの中で行ごとにやるか、対象行だけ抽出して別途行うかのどれかだとおもいます。

(2)
>7:1006行中の5列目の文字が折り返しで入力されているところに、
>そのセルの上下に余白を入れるというものです。
とのことですが、以下を見る限り、無条件で行の高さを7増やしてるだけに思います。

   With Cells(myRow, 5)
      .RowHeight = .RowHeight + 7
   End With

(3)
ご質問の「二つのマクロの統合がきちんと動かず」というのは、

 Sub マクロの統合()
   Call test2
   Call gyousoroe
 End Sub

↑が動かないってことですよね?
そうなると、コードの是非はともかくとして、この部分の記述に間違いがあるかと言われれば見た感じ問題が無いように思うので、私も原因はよく解らないですね。
そうなると、繰り返しになりますけど、ステップ実行してどこでどんなエラーが出ているのか、または、どこが想定通り実行されていないのかをご自身で探らないと解決しないと思います。

(4)
ちなみにですが、結局やりたいことは、アクティブシートのJ列の7行目から1006行目までの値によって、その行全体を非表示にするか、行の高さを7足したいってことですよね?(提示されたコード自体に間違いが無いとして)
そうであるなら、私なら同じ範囲を2回ループさせるのもめんどくさいので、コード自体を1つにまとめて1つの処理にしてしまうかもです。

たとえば↓みたいな感じにすれば、1回のループで全部処理できますよね

   Sub Sample()
      Dim i As Long

      With ActiveSheet
         .Unprotect Password:="00001"
         .Protect Password:="00001", UserInterfaceOnly:=True

         .Rows("7:1006").AutoFit

         For i = 7 To 1006 Step 1
            If .Cells(i, "J").Value = 0 Then
               .Rows(i).Hidden = True
            Else
               .Rows(i).RowHeight = .Rows(i).RowHeight + 7
            End If
         Next i
      End With
   End Sub

(もこな2) 2018/05/05(土) 21:45


すみません。皆様、色々とご指摘やアドバイスをいただき、ありがとうございます。
まず、ご隠居おじいさんがおっしゃるように、
 Call gyousoroe
 Call test2
の順にしたところ、動くようになりました。
ただ、、、その中の何行かはきちんと+7できておらず、文字がセルに隠れてしまっている個所があるのです。
(GW) 2018/05/07(月) 17:45

 こんばんは ^^

 非表示モードが解除されていないのでしょうか。
手作業で。
シートの保護を外して
隠れている行の上〜下をドラッグ選択して右クリックのメニューの再表示
をクリックしてみてください。
ちなみに
何行目と何行目が隠れているのでしょうか。
(隠居じーさん) 2018/05/07(月) 18:39

こんばんは。ご隠居おじいーさん、どうもありがとうございます。
ご指示どおりにやってみました。
まず、手動で保護を外して再表示させてみました。
その後、確認したところ、8、24、32行目が隠れているのです。
しかも、職場と自宅のオフィスのバージョンが異なるときちんと隠れずに表示されたりもしています。
ちなみに、自宅は2016、職場は2013なのですが、職場では隠れてしまいます。
(GW) 2018/05/07(月) 21:36

 という事は。。。。
2018/05/05(土) 11:07 の Sub マクロの統合() 無しのコードでも
同じですよね。
当方環境はGWさん、ご自宅PC、と同じ
2016、Win10です。
問題なくうごいています。

(隠居じーさん) 2018/05/07(月) 22:54


ご隠居おじーさん、おはようございます。ありがとうございます。
やはり、オフィスのバージョンの問題なのでしょうか?
明らかに、2016と2013では隠れてしまう箇所があります。
できれば、改善したいですが、こればかりは無理なのでしょうか・・・
(GW) 2018/05/08(火) 07:36

 GWさん おはようございます。
2013、が手元に有りませんので。なんとも。。。申し上げられません。 ^^;
ただ、限定された行だけ。。。と云うのが気になります。
表示されない行と、表示される行に何か相違点は御座いませんでしょうか。
書式設定とか。。。。関係ないかもしれませんが、マージされているとか
表示されない行を削除後、新規に挿入し表示される行をコピーして
再度試して見るとか。
(隠居じーさん) 2018/05/08(火) 08:06

ご指示のとおり、やってみましたが、同様に隠れてしまいます。
自宅2016ではきちんと動いているのに、不思議です・・・

(GW) 2018/05/08(火) 08:43


 簡単なTESTですが。  ^^
2013で新規BOOKの Sheet1 の
B7:H20 に何でもいいですからダミーデータを用意し(=RANDBETWEEN(0,100) でも、縦横フイルで ^^
下記コードを実行してみてください。不都合がなければ。お使いのシート構成に原因があるかもです。
2007ファイルにして実行しましたが正常です。(とは言え本体は2016なので。。。?ですが)

 Option Explicit
'**********************************************************
Sub main()
    Dim sh01 As Worksheet
    Dim rr As Range, r As Range
    Set sh01 = Worksheets("Sheet1")
    With sh01
        Set r = .Range("B7:H20")
        For Each rr In r
            rr.EntireRow.Hidden = True
        Next
        MsgBox "^^;"
        r.EntireRow.Hidden = False
    End With
End Sub
(隠居じーさん) 2018/05/08(火) 09:16

早速実行してみました。
^^;のマークがでました。
(GW) 2018/05/08(火) 09:28

すみません。【 ^^; 】 の OK を押して下さい。

再表示されましたでしょうか。

(隠居じーさん) 2018/05/08(火) 09:38


はい、されました。
(GW) 2018/05/08(火) 10:33

実験ご苦労様です。 ^^
 >はい、されました。
となると、
きっとお使いのシートの
>その後、確認したところ、8、24、32行目が隠れているのです。
7〜1006行の間か
8、24、32行目、その前後の行に原因がある可能性が高いです。
後、考えられる原因としては
プロテクト関連以外はシートの指定が行われていませんので。
実行時、他のシートがアクティブになっていないかと?
それと、
(隠居じーさん) 2018/05/05(土) 11:07
の test2、 コードを動かした結果も同じでしょうか。

(隠居じーさん) 2018/05/08(火) 12:21


 オートフィルターで0以外表示させるではどうでしょうか。

(隠居じーさん) 2018/05/08(火) 12:52


>7〜1006行の間か8、24、32行目、その前後の行に原因がある可能性が高いです。
後、考えられる原因としては、プロテクト関連以外はシートの指定が行われていませんので。
実行時、他のシートがアクティブになっていないかと?

このシート以外にはシートがないのですが、、、

>それと、(隠居じーさん) 2018/05/05(土) 11:07 の test2、コードを動かした結果も同じでしょうか?

コードを以下のように動かした場合は、最初の現象のとおり、非表示そのものしなくなってしまいます。

 Sub 統合()

    Call test2

    Call gyousoroe

 End Sub
(GW) 2018/05/08(火) 12:55

 >このシート以外にはシートがないのですが、、、
了解です。 そぉですか。。。
mmm。何が原因なのでしょうね

 Sub 統合()
    Call test2
End Sub
でいちどお願いしていいですか。
gyousoroe
は
test2が呼び出します。
これから
歯のおそぉじにいってきます。 ^^;
では

(隠居じーさん) 2018/05/08(火) 13:24


こんにちは ^^
そぉじ 終わりました。 いたかったです。
帰るまでに、いろいろ考えるのですが。。。2016では正常にうごくのですよね。
残念ですが。。。2013がないので、試しようがありません。
お詳しい方の回答をお待ちください。
お力になれず、申し訳ありません。
でわ
何か思い浮かべばUPします。

(隠居じーさん) 2018/05/08(火) 16:01


ステップ実行を何度かオススメしてますけど、あんまりお気に召しませんか?

とりあえず、隠居じーさんさんとのやりとりを拝見していて、気になったのですが、”非表示”と”隠れる”という言葉を使い分けているように思うのですが、もしかして問題の行は非表示にはなっていないけど、セルに入力した文字列の一部が隠れちゃってるとかではないでしょうか。

もし予想が当たっていればですけど、それはAutoFitがうまくいっていないことを意味すると思います。

ステップ実行が嫌なのであれば、とりあえず手動操作で問題の行だけオートフィットをしたうえで、行の高さを7増やしてみてはいかがでしょうか。手動操作でちゃんと動くのにマクロだと動かないというのであれば、なにかコードに問題があるとおもいますし、実は手動操作でもできないことをマクロでできないと悩んでいる可能性もあるように思います。(たとえば、セル結合したセルに対してオートフィットしても意味がないはずです。)

(もこな2) 2018/05/08(火) 17:31


 >やはり、オフィスのバージョンの問題なのでしょうか?

基本、ロジックがおかしいと思います。

関連があるのに(同じシートの操作なのに)、
全く別個に考えてしまっては、
どっちかの条件だけが優先されるのは(後に実行される方が優先になる)、
当然の結果だと思います。
あと、モジュールレベルでフラグを立ててますが、
これも動作が不安定になる原因かなと思います。
僕ならシート上に記録します。
(つまり、ファイルを開いて最初は必ずFalseになっている。)

まず、
J列の操作ですが、
「値が0の行を表示したり非表示にしたり切り替えたい」
というのがやりたいことだと思いますが、
空白セルは存在しますか?
空白セルが存在する場合は、値が0と区別しますか?

次にE列の操作ですが、
 >Range("7:1006").Rows.AutoFit
としていますが、これは必須ですか?
非表示の行があっても問答無用で再表示になりますよね?
これはロジックとして必須ですか?
それから、
折り返して表示ですが、これは勝手にエクセル君が折り返した、
行だけ、行高を増やすのですか?
Altキー + Enterキーで、強制的に行を折り返していたりしますか?

あと、それらの対象のセル範囲に結合セルは存在しますか?
結合セルも結構厄介な存在なので、そういうことも含めて、
教えていただかないと、回避の方法を考えても無駄骨になる可能性があります。

こういう時はこう、あぁいうときはあれ、と
思い通りにエクセル君をコントロールしたいなら、
明確に文章にしてみるところから始めてみてはいかがでしょうか?

(まっつわん) 2018/05/08(火) 17:57


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.