• ベストアンサー

ExcelVBA

すいません。簡単なことなのかもしれませんが、困っています。 普段C++を使用して仕事をしているのですが、急遽ExcelVBAを使用してExcelのマクロを作成しなければならなくなりました。 VisualBasicはまったく触ったことないので質問させていただきます。 Excelファイルの保護されていないセルの行数と列数を数えたいのです。 ExcelVBAで記述するとどういったコードになるのでしょうか? ちなみにExcel2007を使用しています。 皆さんの知恵をお貸しください。

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

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

エクセルでは行全体、列全体を表すのはEntireRow、EntiteColumnですが、これらはプロパティで結果は行全体にRangeオブジェクト(セルの集合)を返します。 しかし Sub test01() ActiveCell.EntireRow.Select Selection.Protect End Su は第1行はOKですが第2行はエラーです。行全体に一遍に保護をかけられません。 一遍にある行全体の保護の有無を聞けません。 (Sheetオブジェクトなら可能です) Sub test02() ActiveSheet.Protect With ActiveSheet If (.ProtectContents Or .ProtectDrawingObjects Or .ProtectScenarios) Then MsgBox "シートは保護されてます" Else MsgBox "シートは保護されてません" End If End With ActiveSheet.Unprotect End Sub ーー ですから>保護されていないセルの行数と列数を数えたいのです は1行を1回で判定できません。 それで1行に1つでも保護セルがあれば該当1行と勘定するのでしょうか。そのためには簡単ですがロジックを組む必要があります。 もちろん行と列は2系列別処理です。 ーー それとも既回答のように、シート内の全セル対象の保護セルのセル数をカウントするのでしょうか。 ーー >C++を使用して仕事をしている、というプロの方でありながら、 質問内容が多義的に捉えられるのは残念です。

その他の回答 (1)

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

行数と列数を数えるの意味が分からないです。 保護するとはおそらくセルの「ロック」チェックが入っているか入っていないかということですかね? 一つ一つのセルに対してそのチェックを行うことは出来ますが、数えるのはセルの個数になるのでしょうか。それとも該当するセルのAddressを全て取得するということになるのでしょうか。 またすべてのセルに対してそのチェックを行うことになると、結構処理に時間がかかりますよ。 65,536 * 256 = 16,777,216回のループが発生することになります。 とりあえずActiveなsheetに対して全てのセルの中でロックがオフになっている個数のカウントをするだけなら下記のような感じになります。 Sub test() Dim R As Range Dim i As Long For Each R In ActiveSheet.Cells If R.Locked = False Then i = i + 1 End If Next MsgBox i End Sub

関連するQ&A