• ベストアンサー

エクセルのマクロで

お世話になります 下記のマクロで実行した所 100まで書式設定で保護、ロックしたいのですが b3:l3はロックするものの 4行目以降はロックしません どうしたらいいでしょうか もう1つ、このシートはいつもc3からはじめたいのですが If ActiveCell.Value >= "" Then の部分はどうしたらいいでしょうか よろしくおねがいいたします 初心者でバカな質問ですみません Sub マクロ1() Dim i As Integer For i = 1 To 100 If ActiveCell.Value >= "" Then Range("B3:l3").Select Selection.Locked = True Selection.FormulaHidden = False End If ActiveCell.Offset(1, 0).Select Next End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • mythism
  • ベストアンサー率52% (45/86)
回答No.4

#1です. #3のかたの(エレガントな)方法でお望みの結果が得られると思います. 蛇足ながら,あまりエレガントではないけれども,比較的わかりやすい別の方法を示しておきますね. Sub MacroSample() Dim t As Integer 'A列で初めて空白になる行を取得 t = 1 While Cells(t, 1).Value <> "" t = t + 1 Wend 'この時点でtにはA行で初めて空白となる行の番号が入る 'ロック If 1 < t Then Range("A1:L" & Trim(Str(t - 1))).Locked = True End If 'ロック解除 Range("A" & Trim(Str(t)) & ":L" & Trim(Str(t + 99))).Locked = False 'セルを選択 Cells(t, 1).Select End Sub 本当に#3のかたのプログラムはエレガントなのですが,少々,しきいが高いように思いましたので,参考までに…. もしも,内部がどのような動作を行っているのか気になさらないのでしたら,私のものより#3のかたのものの方が良いプログラムです. なお,この前後にはシートの保護を解除する処理と,シートの保護を設定する処理が必要です(既に,この処理は完了されているかもしれないですが…). シートの保護は, ActiveWorkbook.Protect 保護の解除は ActiveWorkbook.Unprotect を使用してください.

hajihaji
質問者

お礼

みなさま、遅くまで初心者にまたご親切ご丁寧に ありがとうございます すこしずつですが理解しております まずは、お礼まで

その他の回答 (4)

回答No.5

質問の意味がよく分かっていませんが回答します。 Sub 範囲保護() ActiveSheet.Unprotect Cells.Locked = False Range("A1").CurrentRegion.Select Selection.Locked = True ActiveSheet.Protect End Sub データがひとつながり(空白欄が無い)ならば、便利な命令があります。上に書いたCurrentRegion.Selectという命令です。これを使うとセルA1からデータが入っている範囲を全て選択してくれます。 またB列からL列を保護したいのであれば、 Selection.Resize( , Selection.Columns.Count - 1).Select Selection.Offset( , 1).Select とすればA列をはずした範囲を選択出来ます。 ただし、この方法だとA列は空欄でもB~L列にはデータが入っているような場合は、ひとつながりに全ての範囲を選んでしまいます。 まあ今回の質問の回答になっているかは分かりませんが、結構役に立つプログラム文かと思います。

hajihaji
質問者

お礼

皆様、本当にありがとうございました おかげさまで、解決いたしました 実は他サイトでも質問しましたが あまりにもバカげた質問だったのか 一部の方に「もっと勉強してからこい」みたいな事を書かれ めげてました gooはやさしい人が多いですね 皆様の貴重な時間を無駄にせぬように 回答を1つずつ見直して行きます 本当にありがとうございました

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

下のようなことを行いたい?シートは元々、Lockされている? Sub RandumLock()   Dim TopRng As Range    '// 基準とするセル      Select Case True     Case Range("A1") = ""              '// 1行も入力なし       Exit Sub     Case Range("A1") <> "" And Range("A2") = ""   '// 1行のみ入力       Set TopRng = Range("A1")     Case Else       Set TopRng = Range("A1").End(xlDown)   End Select   With TopRng     Range(.Offset(0, 0), .Offset(0, 11)).Locked = True     Range(.Offset(1, 0), .Offset(100, 11)).Locked = False   End With End Sub

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

私も素人ですが雑感を述べさせていただきます。 セルに対して、何かプロパティ(このケースではLocked)を設定したいとき、 (1)一つずつのCells( )に設定しなければならないものと(例Valueなど)と (2)同じで良ければ、Range(範囲指定)=で範囲指定した個々のセル一括で設定できるもの(LockedやInterior.Colorindexなど圧倒的多数)があります。 (2)の場合、For Next等で各セルにそのプロパテイを設定するコーディングをするのは、無駄です。 ●Selectは、なるべくなくしましょう。マクロ記録では 頻出しますが。Range("B3:l3").Select Selection.Locked = True など1行になります。Range("B3:l3").Locked = True ● ActiveCell.Value ですが For i = 1 To 100 とやる、中でなら、Cells(i,j)とし Jも変化させます。 ●ActiveCellは頻用するものではないと思います。 ●If ActiveCell.Value >= "" Then はIf ActiveCell.Value <> "" Then などとしますが ●ActiveCell.Offset(1, 0).Select これもCells(i,j)を使うとiはFor Nextでループごとに+1してくれるので、不要になると思います。 ●何かの拍子に見た実例に、囚われたコーディング方式に なっている感じがします。OKWEBのVBAのコーディング例でも追って、ぜひ殻を破って下さい。 命名やインデントや注釈も含めて、優れていると思う実例を掴んでください。

  • mythism
  • ベストアンサー率52% (45/86)
回答No.1

質問者さんのなさりたいことを勘違いしているかもしれないですが…. 単純にB3:L102の範囲をロックしたいのであれば, Range("B3:L102").Select Selection.Locked = True の2行だけでロックできます.範囲が異なるのでしたら,B3:L102の部分を書き換えてください. また,C3からの開始というのが,ロック後の開始位置がC3という意味でしたら,先の2行に続けて, Range("C3").Select の一文を加えてください. 別の意味でしたら,そこのところを詳しく補足してくださるようお願いします.

hajihaji
質問者

補足

mythism様、ありがとうございます 別マクロをつかってこのようになったとします    a   b   c   ...L 1  3   44  5      32 2  22  2   12     55  3  4   32  32     6  4 5 a4が空白になった時点で、a3からL3までを ロックする  a4からL4以下100行を ロックしない にしたいのです 空白になるのは、a4であったり、a12であったりと a列は変わらないものの行は任意です よろしくおねがいいたします