[[20200520225342]] 『VBA 特定の文字がある行を別のシートへ移動』(祈) ページの最後に飛ぶ

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

 

『VBA 特定の文字がある行を別のシートへ移動』(祈)

こんばんは。ご質問させていただきます。
特定の文字"-"のある行をSheet1からShee2にコピーして、Sheet1から消して行を詰めるというマクロを作っています。
このマクロは、ネット上に出ていたものを参照させていただいています。
Sheet1のB列からS列までの5行目以下にデータが入っています。
B列に特定の文字"-"が入っている場合、C列からS列までをコピーさせ、Sheet1から消したいのです。
ところが、どうしても結果は、B列からJ列がコピーされてしまい、思うような結果を出せません。
どのような修正が必要でしょうか。よろしくお願いいたします。

Sub hyphen()

    nMax2 = Sheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row + 1
    With Sheets("Sheet1")
    nMax1 = .Cells(Rows.Count, 2).End(xlUp).Row
        For i = nMax1 To 1 Step -1
            If .Cells(i, 2) = "-" Then
                .Range(.Cells(i, 1), .Cells(i, 19)).Copy
                Sheets("Sheet2").Cells(nMax2, 1).Insert Shift:=xlDown
                .Range(.Cells(i, 1), .Cells(i, 19)).Delete Shift:=xlUp
            End If
        Next i
    End With
End Sub

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


補足で、
これだとSheet1の行が削除され、実行するたびに設定した行(例えば、100行に書式設定していたとしたら)が減っていってしまうので、設定した行はそのままでコピーさせて詰められたらと思います。
(祈) 2020/05/20(水) 23:01

>どうしても結果は、B列からJ列がコピーされてしまい
ぱっと見ただけでテストしてませんが、↑本当ですか?
  With Sheets("Sheet1")
    .Range(.Cells(i, 1), .Cells(i, 19)).Copy

なので、A〜S列がコピーされそうな気がするですが・・・

(もこな2 ) 2020/05/20(水) 23:16


もこな2さん、
A列からJ列の誤りです。K列からS列がコピーされなくて、困っております。
(祈) 2020/05/20(水) 23:19

>A列からJ列の誤りです。
そうですかぁ。ちょっと再現できないのでお力にはなれなさそうですね。

やはり、↓で試してみるとA〜S列なんですよねぇ・・・

    Sub aaa()
        Dim i As Long

        With Worksheets("Sheet1")
            For i = 1 To 5
                MsgBox .Range(.Cells(i, 1), .Cells(i, 19)).Address(False, False)
            Next i
        End With
    End Sub

(もこな2 ) 2020/05/21(木) 00:38


もこな2さん、
おはようございます。
もう一つテスト用のファイルを同時に開いてまして、そっちのマクロがCells(i, 10)となっていて、そのマクロをボタンに登録していたため、結果が出ませんでした。
再度、設定して確認したところ、A列からS列までのコピーできました。

補足でお伝えしているのですが、
このSheet1の行を減らさずに(100行設定していたら、移動後もそのまま)、しかもA列からではなく、C列からS列をコピーさせたいのです。
(祈) 2020/05/21(木) 05:28


C列からにするためには、以下の修正でよいでしょうか?
.Range(.Cells(i, 3), .Cells(i, 19)).Copy
Sheets("Sheet2").Cells(nMax2, 3).Insert Shift:=xlDown
.Range(.Cells(i, 3), .Cells(i, 19)).Delete Shift:=xlUp

あとは、Sheet1の行を減らさない設定方法です。
(祈) 2020/05/21(木) 05:54


やはりそんなことでしたか。
その手のミスは、ステップ実行をすれば気づけると思うので、まずは自力でトライしてみてください。

ちなみに、あえて列文字を使うとか

 .Range(.Cells(i, "C"), .Cells(i, "S")).Copy

ちょっと混乱するかもしれませんが、Intersectメソッドを使うとか

 Intersect(.Rows(i), .Range("C:S")).Copy

↓のように、表のなかの行ごとに処理しちゃうとか

    Sub hyphen_改()
        nMax2 = Sheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row + 1

        With Sheets("Sheet1")
            nMax1 = .Cells(Rows.Count, 2).End(xlUp).Row

            With .Range("C1", .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, "S"))
                For i = .Rows.Count To 1 Step -1
                    .Rows(i).Copy
                    Sheets("Sheet2").Cells(nMax2, "A").Insert Shift:=xlDown
                Next i
            End With
        End With
    End Sub

いろいろなアプローチがあるとおもいます。

 (いったん区切ります)

(もこな2 ) 2020/05/21(木) 07:08


もこな2さん、
ありがとうございます。
現在のマクロでは、行を削除して上に詰めるという方法なのですが、
決められた行数を保持するために、B列に特定の文字"-"が入っている場合は、C列からS列をSheet2へコピーして、
行を削除せずにC列からS列を上に詰めてコピーする。(B列の特定の文字は、必ずしも連続した行ではなく、ランダムに表示されます。)
こうすれば、設定行は減らずに済むのかなと思うのです。
ちなみに、実際に設定している行は、5行目から204行目まで実質200行です。
(祈) 2020/05/21(木) 07:17

コンパイルエラーにならないことしかチェックしてませんが、上に詰めるほうは作業用シートを経由したらどうですかね。
    Sub 別案()
        Dim MyRNG As Range
        Dim i As Long
        Dim dstRNG As Range
        Dim nMax1 As Long

        '▼出力先セルの取得
        With Worksheets("Sheet2")
            Set dstRNG = .Cells(.Rows.Count, "B").End(xlUp).Offset(1, -1)
        End With

        '▼作業用のシートを作成
        Worksheets("Sheet1").Copy after:=Worksheets(Worksheets.Count)

        '▼作業用シートで作業
        With Worksheets(Worksheets.Count)
            nMax1 = .Cells(Rows.Count, "B").End(xlUp).Row

            For i = nMax1 To 1 Step -1
                If .Cells(i, "B") = "-" Then
                    .Range(.Cells(i, "C"), .Cells(i, "S")).Copy
                    dstRNG.Insert Shift:=xlDown
                    .Range(.Cells(i, "C"), .Cells(i, "S")).Delete Shift:=xlUp
                End If
            Next i

            '作業用シートの内容を"Sheet1"に値のみ貼り付けして、作業用シートは削除
            .Range("C1:S" & nMax1).Copy
            Worksheets("Sheet1").Range("C1").PasteSpecial Paste:=xlPasteValues

            .Delete
        End With

    End Sub

(もこな2 ) 2020/05/21(木) 07:35


もこな2さん、ありがとうございます。
早速、試してみました。結果はきちんと出ました。
ただ、挙動が最初のに比べると範囲指定表示が見えたり、シートを削除のメッセージが出たり、最終的にSheet1に戻ってこないなどですね、気になるのですが、最初のマクロでSheet1だけで処理するのは、無理なのでしょうか。
すみません、出来ないのに思いばかり勝手なことを言って。すみません。
(祈) 2020/05/21(木) 08:05

>結果はきちんと出ました。
単純にプレゼントしたわけじゃなくて、研究資料として提示しているつもりです。
ステップ実行して動きを確認する、わからない命令はネット検索してみる等はご自身で行ってください。

 参考
https://excelwork.info/excel/cutcopymode/
https://www.moug.net/tech/exvba/0150081.html
https://excel-ubara.com/excelvba1/EXCELVBA327.html

(もこな2) 2020/05/21(木) 08:38


もこな2さん、ありがとうございます。
参考を見てやってみます。ご指導お願いします。
(祈) 2020/05/21(木) 21:03

よくわかりませんが、
>行を削除せずにC列からS列を上に詰めてコピーする。(B列の特定の文字は、必ずしも連続した行ではなく、ランダムに表示されます。)
>こうすれば、設定行は減らずに済むのかなと思うのです。
というなら、削除命令をやめたらいいんじゃないんですか?
(γ) 2020/05/21(木) 21:36

はい、削除すると行は上に詰まるのですが、私も削除命令をやめて、行をクリアさせたらどうかと思い、以下のようにしてみました。
ただ、これだと空白行がそのままになってしまいますので、その下に上に行を詰める必要があるのですよね。

.Range(.Cells(i, 2), .Cells(i, 19)).Copy
Sheets("Sheet2").Cells(nMax2, 2).Insert Shift:=xlDown
.Range(.Cells(i, 3), .Cells(i, 19)).ClearContents
(祈) 2020/05/21(木) 21:56


.Range(.Cells(i, 3), .Cells(i, 19)).ClearContentsとしたのは、
B列に特定の文字"-"が関数にて入るため、削除してしまうとエラーとなってしまうため、C列以下をクリアして、上に詰めたいと考えました。しかし、上に詰めるための命令を調べておるのですが。
(祈) 2020/05/21(木) 22:11

(1)最終行までをそのつど一行上にコピーして、同時に最終行を一行消す?
もしくは、
(2)つめずに消去しておいて、最後にまとめてソートして空白行を削除
ではないですか?

(γ) 2020/05/21(木) 22:18


なるほど、ソートという考え方なんですね!!
考えてみまする
(祈) 2020/05/21(木) 22:20

すみません。考えてみます!
(祈) 2020/05/21(木) 22:21

以下の4行目、ソートの命令を入れてみました。
空白行を降順にするようにとしたのですが、作動しません・・・

.Range(.Cells(i, 2), .Cells(i, 19)).Copy
Sheets("Sheet2").Cells(nMax2, 2).Insert Shift:=xlDown
.Range(.Cells(i, 3), .Cells(i, 19)).ClearContents
Call Range("B5:S204").Sort(Key1:=Range("B5"), Order1:=xlDescending)
(祈) 2020/05/21(木) 22:31


Sub から End Subまで書いてもらわないと、まったくわかりませんし、
思わぬ事が原因になっていることもあるだろうし、そこまで想像しきれませんよ。
そういうやりとりは双方にとって時間の無駄になります。

(γ) 2020/05/21(木) 22:47


すみません。
以下のようにしております。

Sub hyphen()

    'Sheet2の挿入位置(C列は結合セルではなく、必ず何か入っている事)
    nMax2 = Sheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row + 1

    With Sheets("Sheet1")
    nMax1 = .Cells(Rows.Count, 2).End(xlUp).Row
        For i = nMax1 To 1 Step -1
            If .Cells(i, 2) = "-" Then
                'C〜S列を移動対象とする
                .Range(.Cells(i, 2), .Cells(i, 19)).Copy
                Sheets("Sheet2").Cells(nMax2, 2).Insert Shift:=xlDown
                .Range(.Cells(i, 3), .Cells(i, 19)).ClearContents
                Call Range("B5:S204").Sort(Key1:=Range("B5"), Order1:=xlAscending)
            End If
        Next i
    End With
End Sub
(祈) 2020/05/21(木) 22:50

シートの指定は不要なんですか?
またB列でソートしていいんですか?
普通はダミー列に1からの連番を仮にいれておいて、その列で昇順ソートすると
空白行は最後に寄せられるんですけど、そういうことをされているんですか、そのB列は。
(γ) 2020/05/21(木) 23:03

ご指摘ありがとうございます。
B列には以下のような関数を入れております。
R列に日付が入力されたら、特定の文字"-"が入るような関数です。
一度、実際にソートしてみましたが、問題なかったので、B列をソートにしました。
B列=IF($C5="","",IF($R5="",COUNTBLANK($R$5:R5),"-"))

シートの指定をすれば、以下でよいでしょうか?
Sheets("Sheet1").Call Range("B5:S204").Sort(Key1:=Range("B5"), Order1:=xlAscending)
(祈) 2020/05/21(木) 23:10


γのご指摘どおり、シートを指定して実行したところ、結果は並び替えまでできました。
しかし、以下のようなエラーが表示されました。

オブジェクトは、このプロパティまたはメソッドをサポートしていません。
(祈) 2020/05/21(木) 23:26


γさんでした。失礼しました。
(祈) 2020/05/21(木) 23:27

B列のソート(降順)の妥当性はわかりません。式の意図とかわかりませんので。

>Sheets("Sheet1").Call Range("B5:S204").Sort(Key1:=Range("B5"), Order1:=xlAscending)
ワークシートオブジェクトはCallなどというメソッドもプロパティも持ちませんが、
どのような意図を持って、このコードを書かれましたか?

(γ) 2020/05/21(木) 23:35


ネットの情報を参照しました。
(祈) 2020/05/21(木) 23:37

横からですが、なるほどソートする発想はなかったです。
ちなみに、C〜Sでデータが詰まっている(歯抜けがない)列はありませんか?

マクロでクリアされた行を特定して、最終行にカット&インサートによる疑似並び替えができないかなと思ってます。

(もこな2) 2020/05/21(木) 23:40


その記事のURLを教えて下さい。
(γ) 2020/05/21(木) 23:43

もこな2さん、
データが200行すべて入力済みの列はあるかどうかというご質問でしょうか?
それであれば、すべて詰まっていません。

γさん、
以下を参照しました。が、わたしの理解不足かと思います。
https://www.tipsfound.com/vba/07032
(祈) 2020/05/21(木) 23:48


Worksheetオブジェクトに Callをつけた箇所は見あたりませんでした。

たとえば、For i = nMax1 To 1 Step -1の繰り返しのなかで、
どこかの列(例えばT列)に、i を順次書き込んで置いて、
条件が満たされたときに、S列までを拡大してT列まで消去し、
 (.Range(.Cells(i, 3), .Cells(i, 20)).ClearContents とT列も消去します。)
その繰り返しが終了したあとで、
T列を元にしてソートをすれば、T列が空白になっている行は、最後に追いやられると思います。
最後に T列を ClearContents します。
(γ) 2020/05/22(金) 00:14


γさん、ありがとうございます。
ソートする上でのご説明をいただいているのですが、どのように修正すればよいのか理解できず、すみません。
以下のように、Callを外して実行してみましたが、コンパイルエラーとなってしまいました。

Sheets("Sheet1").Range("B5:S204").Sort(Key1:=Range("B5"), Order1:=xlAscending)
(祈) 2020/05/22(金) 05:02


γさんが言われることが高度過ぎて今ひとつわからず、それに対してどうすればよいかもわからず、
以下に修正したところ、エラーは表示されなくなりました。
Call Sheets("Sheet1").Range("B5:S204").Sort(Key1:=Range("B5"), Order1:=xlAscending)

しかし、特定の文字が1行だけの場合は、希望どおりにSheet2にコピーして、Sheet1からクリアして、並び替えてくれたのですが、2行以上になると1行だけがSheet2にコピーされ、その他行は範囲の一番下に並び替えられてしまい、Sheet2にもコピーされません。実行のボタンを何度も押すと、コピーされました。
この結果を見て、γさんがおっしゃることがわかるように思いました。
これをどう修正していくかですが、やはり並び替えの命令がうまくできていないのですよね。
(祈) 2020/05/22(金) 07:04


SortメソッドとSortオブジェクトの違いは↓を見ていただくとして
 http://officetanaka.net/excel/vba/tips/tips148.htm

>実行のボタンを何度も押すと、
繰り返しになりますが、ステップ実行されてますか?
1つずつ動き動きをチェックして、想定通りになっていなければ原因を分析して直す。これも大事なデバッグ作業の一つですよ。

(もこな2 ) 2020/05/22(金) 08:41


 γさんのアイデアで、T列じゃなくZ列を作業列にした場合

 Sub hyphen()
     Dim nMax2,nMax1,i

     nMax2 = Sheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row + 1

     With Sheets("Sheet1")
         .Range("Z1:Z204").ClearContents 'Z列を事前にクリア

         nMax1 = .Cells(Rows.Count, 2).End(xlUp).Row

         For i = nMax1 To 5 Step -1  '5行目まで遡る
             If .Cells(i, 2) = "-" Then
                 .Range(.Cells(i, "C"), .Cells(i, "S")).Copy
                 Sheets("Sheet2").Cells(nMax2, 1).Insert Shift:=xlDown
                  .Range(.Cells(i, "C"), .Cells(i, "Z")).ClearContents
             Else
               .Cells(i, "Z") = i 
             End If
         Next i

         .Range("B5:Z204").Sort Key1:=.Range("Z5"), Order1:=xlAscending
         .Range("Z1:Z204").ClearContents 'Z列を後始末
     End With
 End Sub

(半平太) 2020/05/22(金) 09:17


半平太さん、γさん、もこな2さん、
ありがとうございます。
希望したとおりの結果となりました。
(祈) 2020/05/22(金) 23:34

半平太さん、再びのお尋ねですみません。
このマクロの実行前に、5桁のパスワードを解除して、実行後に再びパスワードをかけたいのですが、可能でしょうか?

(祈) 2020/05/23(土) 08:02


半平太さんじゃないけど、シートの保護の話なら可能。
マクロの記録でコードはすぐにわかります。

(もこな2 ) 2020/05/23(土) 08:23

 とおもいましたが、パスワード部分は記録されないかもしれません。

http://officetanaka.net/excel/vba/sheet/sheet07.htm

 その場合は↑が参考になると思います。  8 :36追記


もこな2さん、
ありがとうございます。
マクロの記録と調べてパスワード解除、再保護をつくってみましたが、エラー400が出てしまいます。

 Sub hyphen()
     Dim nMax2, nMax1, i
     nMax2 = Sheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row + 1
     With Sheets("Sheet1")
         .Range("U1:U204").ClearContents 'U列を事前にクリア
         nMax1 = .Cells(Rows.Count, 2).End(xlUp).Row
         For i = nMax1 To 5 Step -1  '5行目まで遡る
             If .Cells(i, 2) = "-" Then
                 .Range(.Cells(i, "B"), .Cells(i, "S")).Copy
                 Sheets("Sheet2").Cells(nMax2, 2).Insert Shift:=xlDown
                 .Range(.Cells(i, "C"), .Cells(i, "U")).ClearContents
             Else
                 .Cells(i, "U") = i
             End If
         Next i
         .Range("B5:U204").Sort Key1:=.Range("U5"), Order1:=xlAscending
         .Range("U1:U204").ClearContents 'U列を後始末
     End With
→     Sheets("Sheet1").Unprotect "11100"
→     Sheets("Sheet1").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
→     Sheets("Sheet1").ReProtect "11100"
 End Sub
(祈) 2020/05/23(土) 17:37

>エラー400
あまり見ないエラーコードなので調べてみたら↑のようなものがみつかりました。
ステップ実行しているなら、何の操作をしようとして失敗したのかはすぐにわかることですから、原因がそれであれば修正したらよいとおもいます。

ちなみに、提示されたコードで「ReProtect」とありますが、どんな命令なんですか?
(私の環境だと、エラーコード 439:オブジェクトは、このプロパティまたはメソッドをサポートしてません。となります)

また、順当にいけば、
【シートの操作を始める前(マクロ開始直後】に保護解除をして
具体的な操作をした後に
【終了直前で】保護をするんじゃないでしょうか?
(なんで最後に解除して、すぐ保護するんですか?)

(もこな2 ) 2020/05/23(土) 18:16


思いは、もこなさんがおっしゃるとおり、
マクロ開始直後に解除→マクロ終了直前で保護
したいのです。
ReProtectは、色々調べて見たものを入れてみたのですが…
(祈) 2020/05/24(日) 11:05

>色々調べて見たものを入れてみたのですが…
後学のために私も知りたいので、参考にしたところを教えていただけませんか?
(無理にとは言いませんが)

>マクロ開始直後に解除→マクロ終了直前で保護したいのです。
では、そのような順番で書くべきですよね。なんでそうしないのですか?

(もこな2 ) 2020/05/24(日) 11:39


はい、今は外なので、後ほどやってみます。
(祈) 2020/05/24(日) 11:42

三行目は削除して、以下の二行を設定したところ、
保護はかかるのですが、パスワードはかかりません。
上記マクロを実行する際に、保護解除、再保護をかけたいのですが、
何方か、修正箇所をご指導いただけないでしょうか?

→ Sheets("Sheet1").Unprotect "11100"
→ Sheets("Sheet1").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

(祈) 2020/05/24(日) 23:24


ちなみに、保護をかけない状態でマクロを実行すると、保マクロが実行され、保護はかかりますが、パスワードはかかっていません。

パスワードをかけて保護をかけた状態からマクロを実行しようとすると、エラー400が表示され、マクロが実行されません。
(祈) 2020/05/24(日) 23:39


>マクロが実行されません。
いえ実行されてますよ。実行したからこそ【実行時】エラーがでているんです。
最も、こちらでは同じ状況(エラー)が再現できないので、なんで実行時エラーになっているのかはわかりませんが。

とりあえず、名前付き引数を省略せずに書くようにしたらどうでしょうか?

    Sub さんぷるA()
        'シート保護を解除する命令
        Worksheets("Sheet1").Unprotect Password:="11100"

        '■処理■

        'シート保護をする命令
        Worksheets("Sheet1").Protect Password:="11100"

    End Sub

ちなみに、紹介したリンク先を読めばわかるとおもいますが↓でもよいとおもいます。

    Sub さんぷるB()
        'シート保護を解除する命令
        Worksheets("Sheet1").Unprotect Password:="11100"

        'UserInterfaceOnly:=Trueにして、シート保護をする命令
        Worksheets("Sheet1").Protect Password:="11100", UserInterfaceOnly:=True

        '■処理■
    End Sub

(もこな2 ) 2020/05/25(月) 02:30


もこな2さん、
ありがとうございます。
先日、半平太さんに教えたいただいたコードともこな2さんの保護コードを組み合わせて、以下のように実際のセルに置き換えて実行したところ、見事に希望通りとなりました!
同時にデータ転送先であるSheet2にも同じように保護をかけるようにしました。
ありがとうございました。

 Sub hyphen()
     Dim nMax2, nMax1, i
     nMax2 = Sheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row + 1
     With Sheets("Sheet1")
         .Range("U1:U204").ClearContents 'U列を事前にクリア
         nMax1 = .Cells(Rows.Count, 2).End(xlUp).Row
         For i = nMax1 To 5 Step -1  '5行目まで遡る
             If .Cells(i, 2) = "-" Then
                 .Range(.Cells(i, "B"), .Cells(i, "S")).Copy
                 Sheets("Sheet2").Cells(nMax2, 2).Insert Shift:=xlDown
                 .Range(.Cells(i, "C"), .Cells(i, "U")).ClearContents
             Else
                 .Cells(i, "U") = i
             End If
         Next i
         .Range("B5:U204").Sort Key1:=.Range("U5"), Order1:=xlAscending
         .Range("U1:U204").ClearContents 'U列を後始末
     End With
         Worksheets("Sheet1").Unprotect Password:="11100"
         Worksheets("Sheet1").Protect Password:="11100", UserInterfaceOnly:=True
         Worksheets("Sheet2").Unprotect Password:="11100"
         Worksheets("Sheet2").Protect Password:="11100", UserInterfaceOnly:=True
 End Sub
(祈) 2020/05/25(月) 07:19

 横から失礼、2点コメントします。
 (1)
 最後に保護解除と保護設定する意図がよくわかりません。
 (2)
 UserInterfaceOnly:=True について誤解があるようです。

 「UserInterfaceOnly:=True」の有効期間はそのワークブックを閉じるまでです。
 ですから、次回にそれを開いたときには、UserInterfaceOnlyはFalseになっています。
 したがって、今のコード(マクロでワークシートを変更)を実行すると、ワークシートが保護
 されているのでエラーになるはずです。

 ブックを開いた時に、UserInterfaceOnly:=Trueを再設定する必要があります。
 このため、Workbook_Openプロシージャの中で設定するのがよいでしょう。

(γ) 2020/05/25(月) 08:16


>見事に希望通りとなりました!
すでに、γさんから指摘されてますが、実行する順番がおかしいです。
2020/05/23(土) 18:16、 2020/05/24(日) 11:39、2020/05/25(月) 02:30に指摘・提示してます。

また、γさんの(2)については、私も同意見(ブックを開いたときに、1回だけ保護しなおす)ではありますが、言われていることが理解できなければ「さんぷるB」のように、毎回実行してもよいと思います。

ちなみに、紹介したリンク先に↓のように書いてあったんですが、読みましたか?

なお注意しなければいけないのは、引数UserInterfaceOnlyにTrueを指定して保護したワークシートをそのまま保存して閉じた場合です。次にそのブックを開いたときには、ユーザーの手動操作だけでなくマクロによる操作も保護されています。

マクロ操作だけを保護の対象からはずすには、再度引数UserInterfaceOnlyにTrueを指定してProtectメソッドを実行しなければなりません。

どうも、「Call」「ReProtect」という謎のプロパティなりメソッドを書くところを見るとちゃんと読んでないんじゃないかと思えてくるんですが・・・・

(もこな2 ) 2020/05/25(月) 09:36


コメント返信:

[ 一覧(最新更新順) ]


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