advanced help
per page, with , order by , clip by
Results of 1 - 1 of about 1215 for (Mook) (0.001 sec.)
[[20150325185258]]
#score: 9211
@digest: caca740e05a06c7163f0b8dd235f8e33
@id: 67591
@mdate: 2015-03-25T14:14:29Z
@size: 6432
@type: text/plain
#keywords: x1stadr (22494), rng0 (11426), xrng (10356), allowdeletingcolumns (9412), allowusingpivottables (9210), allowinsertinghyperlinks (9051), allowinsertingcolumns (9051), allowdeletingrows (8839), protection (8227), allowsorting (8227), allowinsertingrows (8179), userinterfaceonly (7928), allowformattingrows (7927), allowfiltering (5765), ト保 (5725), 保護 (5257), 継承 (3936), validation (3902), xlvalidatelist (3436), 護を (3095), protect (2934), pp (2298), ロ初 (1862), シー (1158), rng (1071), workbook (1039), の保 (987), マク (955), ート (921), クロ (859), 力規 (773), ロッ (722)
『シートに保護をかけるとマクロが動かなくなりました。』(マクロ初心者)
消されては困る数式が入ったセルがあるため、シートに保護をかけました。 そうすると一つのマクロだけが動かなくなりました。 シート1のG6に単語を入力すると、シート2(「リスト」)のリストから検索結果をH6に表示させるものです。 シートの保護をかけた後、上記の動作をするとエラーになりました。 「アプリケーション定義またはオブジェクト定義のエラーです」と表示され、 デバックをすると以下がハイライトされました。 rng0.Offset(, 1).Validation.Add Type:=xlValidateList, Formula1:=Join(Dic.Keys, ",") マクロ初心者の為、何が原因なのか全くわかりません。 どなたかご教示いただけますようお願いいたします。 「シート1」 Private Sub Worksheet_Change(ByVal Target As Range) Dim xrng As Range, rng As Range Set xrng = Intersect(Target, Range("H6:H150")) If xrng Is Nothing Then Exit Sub With Application .ScreenUpdating = False .EnableEvents = False For Each rng In xrng rng.Offset(, 1).Validation.Delete If rng.Value <> "" Then Call ValidationTest(rng, Worksheets("リスト")) End If Next rng .EnableEvents = True .ScreenUpdating = True End With End Sub ------------------- 「モジュール1」 Option Explicit Sub ValidationTest(rng0 As Range, sh2 As Worksheet) Dim Dic, rng As Range, x1stAdr As String Dim buf As String Set Dic = CreateObject("Scripting.Dictionary") With sh2.UsedRange Set rng = .Find(rng0.Value, LookIn:=xlValues, LookAt:=xlPart) If Not rng Is Nothing Then x1stAdr = rng.Address Do buf = rng.Value If Not Dic.Exists(buf) Then Dic.Add buf, buf End If Set rng = .FindNext(rng) Loop While rng.Address <> x1stAdr End If End With If Dic.Count > 0 Then rng0.Offset(, 1).Validation.Add Type:=xlValidateList, Formula1:=Join(Dic.Keys, ",") ←ここです End If Set Dic = Nothing End Sub < 使用 Excel:Excel2013、使用 OS:Windows8 > ---- シート保護したセルを変更しようとしているからだと思いますが、 ThisWorkbook の下に下記を書いて、EXCEL ファイルを開きなおしてどうでしょうか。 Private Sub Workbook_Open() WorkSheets("リスト").Protect UserInterfaceOnly:=True End Sub http://www.asahi-net.or.jp/‾ef2o-inue/vba_o/sub05_030_040.html (Mook) 2015/03/25(水) 19:28 ---- Mookさんから回答がありましたが、メモしましたので、蛇足ながら。 シートの保護を掛けると、シート内の保護されたセルに対しては、手入力であれ、マクロからの書き込みであれ それはできなくなるのは承知されていますよね。 ですから、rng0.Offset(, 1) にあたるセルは、少なくとも、セルの保護をはずしておかなければ、 入力規則リストから選択して、そのセルに値をいれること、そのものができなくなりますね。 で、それは、ご存じで、シート上の、そのセル領域はセル保護がはずされているとします。 でも、(もしかしたらVBAのバグかもしれないなぁと思っているんですが)、保護がはずされたセルに対しても 入力規則の削除(Delete)はできるんですが、Add はできません。 方法は、 1.この処理をする前にシート保護をはずし、この処理が終わった時点でシート保護をかける。 2.あるいは、どこかで1回(Workbook_Openあたりで)、このシートに対して、UserInterfaceOnly:=True 付の シート保護をかけておく。そうすれば、マクロでさわる分には、自由自在になります。 留意しなければいけないのは、1. にしろ 2.にしろ、シート.Protect 実行時に、たくさんの引数に、適切な値を指定しなければいけないこと。 操作で保護する際に、ユーザーに許可する操作を選びますよね。それらに対して、きちんと指定してやらないと ディフォルト値が採用されます。これが、たまたまシート保護を掛けたときに設定したものと同じであればいいのですが さもなければ不都合が発生します。 (β) 2015/03/25(水) 19:30 ---- UserInterfaceOnly付で、その時点の設定を継承してシート保護をかけるコードを書いてみました。 ご参考まで。 Sub Sample() '現在の保護要素を継承したシート保護 UserInterfaceOnly付 Dim pp As Protection With Sheets("Sheet2") '対象シート Set pp = .Protection .Protect DrawingObjects:=.ProtectDrawingObjects, _ Contents:=.ProtectContents, _ Scenarios:=.ProtectScenarios, _ AllowFormattingCells:=pp.AllowFormattingCells, _ AllowFormattingColumns:=pp.AllowFormattingColumns, _ AllowFormattingRows:=pp.AllowFormattingRows, _ AllowInsertingColumns:=pp.AllowInsertingColumns, _ AllowInsertingRows:=pp.AllowInsertingRows, _ AllowInsertingHyperlinks:=pp.AllowInsertingHyperlinks, _ AllowDeletingColumns:=pp.AllowDeletingColumns, _ AllowDeletingRows:=pp.AllowDeletingRows, _ AllowSorting:=pp.AllowSorting, _ AllowFiltering:=pp.AllowFiltering, _ AllowUsingPivotTables:=pp.AllowUsingPivotTables, _ UserInterfaceOnly:=True End With End Sub (β) 2015/03/25(水) 22:14 ---- ご返信ありがとございます。 私の説明が不足しておりましたが、シートの保護を設定したいのはシート1です。 他のシートだけにに保護をかけた場合、マクロは通常通り動作いたしました。 また、上記のマクロで指定しているセルの「ロック」は解除してあります。 >Mookさんの教えてくださったマクロをコピーしましたが、 上記同様のエラーが出てしましました。。。 >βさんのマクロはどこに追記したらよいのでしょうか? 初歩的な質問で申し訳ございませんが、宜しくお願い致します。 (マクロ初心者) 2015/03/25(水) 22:57 ---- >また、上記のマクロで指定しているセルの「ロック」は解除してあります。 コメントしましたように、セルがロックされていなくても、シート保護がかかっていれば入力規則のAddは、エラーになる仕様ですので。 >Mookさんの教えてくださったマクロをコピーしましたが、 上記同様のエラーが出てしましました。。。 エラーはでないはずです。実行していれば。 ですから、一度保存して開き直して・・とMookさんからコメントありましたよね。 コードをコピペして、開き直さないで有効にしたければ、VBE画面からWorkbook_Open マクロを【手動】で動かすこともできます。 おそらく、どちらもやっていないでしょ? >βさんのマクロはどこに追記したらよいのでしょうか? 同じく Workbook_Open です。 ただ、もし、シート保護に際に、ダイアログの最初の2項目以外にチェックをつけていなければ Mookさんのコード、引数なしの Protect + UserInterfaceOnly だけで、問題はないですよ。 もし、そのほかの項目もチェックをつけたりしているなら、βのコードが安心ですが。 (β) 2015/03/25(水) 23:12 ...
http://www.excel.studio-kazu.jp/wiki/kazuwiki/201503/20150325185258.txt - [detail] - similar
PREV NEXT
Powered by Hyper Estraier 1.4.13, with 97020 documents and 608148 words.

訪問者:カウンタValid HTML 4.01 Transitional