• ベストアンサー

最近、VBAを学び始めた者です。

最近、VBAを学び始めた者です。 どうしてよいのかよく分からない点があるので、質問させていただきたく存じます。 例えば、A1からA100まではデータ入力用で、それらのセル以外は保護がかかっているとします。 ところどころ空白があるので、マクロで空白を削除して上に詰められるようにしてみたのですが、 保護のかかっていないセルが削除されることによって、入力できるセルが上に縮まっていってしまいます。 セルの保護範囲は変えずに、データだけを上に詰める方法はありますでしょうか? どなたかご教示下されば幸いです。 宜しくお願い致します。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

簡単な方法: activesheet.unprotect range("A1:A100").specialcells(xlcelltypeblanks).delete shift:=xlshiftup range("A1:A100").locked = false activesheet.protect #「セルを削除」せず,データを引っ越し引っ越しで順繰り上に詰めても出来ます。

ngayan
質問者

お礼

こんな簡単な方法で出来るとは思いませんでした。 とても参考になります。ありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

>最近、VBAを学び始めた者です。 今回のような実践マクロというのは、マクロを何年やっていても、理詰めでは出来ません。 入門用と実践用では明らかにコードが違います。入門用として記録マクロ程度の簡単な書き方で可能ですが、状態が変わると、すぐにエラーが出てしまいます。以下は、何種類かのテクニックが含まれています。アンプロテクトした後に、すぐに、またプロテクトをしている所が分かりますか? 注:ただし、A1のタイトルは必ずあるものとして以下は作られています。 '// Private Const PWS As String = "" 'パスワードは任意 Sub SpaceDelMacro() Dim acSh As Worksheet Set acSh = ActiveSheet 'アクティブシート   acSh.Unprotect PWS   'PassWord, UserInterFace, Filter   acSh.Protect PWS, , , , True, , , , , , , , , , True   With acSh.Range("A1", acSh.Cells(Rows.Count, 1).End(xlUp))    .AutoFilter Field:=1, Criteria1:="="    If .SpecialCells(xlCellTypeVisible).Count > 1 Then      With acSh.AutoFilter.Range        .Offset(1).Resize(.Rows.Count - 1).Delete Shift:=xlShiftUp      End With    End If    .AutoFilter   End With   Set acSh = Nothing   'プロテクトは残っています。 End Sub

ngayan
質問者

お礼

Protect / Unprotectを使うことによって思うようにVBAが動作するようになりました。 大変助かりました。ありがとうございました。

  • mar00
  • ベストアンサー率36% (158/430)
回答No.1

削除を Selection.EntireRow.Delete で行っていませんか? (右クリック→削除→行全体にあたります。) Selection.Delete Shift:=xlUp とすれば出来ると思いますよ。 (右クリック→削除→上方向にシフトにあたります。)

ngayan
質問者

お礼

なんとか思うようにVBAを動作させることができました。 ありがとうございました。

関連するQ&A