[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『二つのマクロの統合するマクロ』(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
ではいかがですか。
(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
こんばんは ^^
非表示モードが解除されていないのでしょうか。 手作業で。 シートの保護を外して 隠れている行の上〜下をドラッグ選択して右クリックのメニューの再表示 をクリックしてみてください。 ちなみに 何行目と何行目が隠れているのでしょうか。 (隠居じーさん) 2018/05/07(月) 18:39
という事は。。。。 2018/05/05(土) 11:07 の Sub マクロの統合() 無しのコードでも 同じですよね。 当方環境はGWさん、ご自宅PC、と同じ 2016、Win10です。 問題なくうごいています。
(隠居じーさん) 2018/05/07(月) 22:54
GWさん おはようございます。 2013、が手元に有りませんので。なんとも。。。申し上げられません。 ^^; ただ、限定された行だけ。。。と云うのが気になります。 表示されない行と、表示される行に何か相違点は御座いませんでしょうか。 書式設定とか。。。。関係ないかもしれませんが、マージされているとか 表示されない行を削除後、新規に挿入し表示される行をコピーして 再度試して見るとか。 (隠居じーさん) 2018/05/08(火) 08:06
(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
再表示されましたでしょうか。
(隠居じーさん) 2018/05/08(火) 09:38
>はい、されました。 となると、 きっとお使いのシートの >その後、確認したところ、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
このシート以外にはシートがないのですが、、、
>それと、(隠居じーさん) 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
(隠居じーさん) 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.