- ベストアンサー
最近、VBAを学び始めた者です。
最近、VBAを学び始めた者です。 どうしてよいのかよく分からない点があるので、質問させていただきたく存じます。 例えば、A1からA100まではデータ入力用で、それらのセル以外は保護がかかっているとします。 ところどころ空白があるので、マクロで空白を削除して上に詰められるようにしてみたのですが、 保護のかかっていないセルが削除されることによって、入力できるセルが上に縮まっていってしまいます。 セルの保護範囲は変えずに、データだけを上に詰める方法はありますでしょうか? どなたかご教示下されば幸いです。 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
簡単な方法: activesheet.unprotect range("A1:A100").specialcells(xlcelltypeblanks).delete shift:=xlshiftup range("A1:A100").locked = false activesheet.protect #「セルを削除」せず,データを引っ越し引っ越しで順繰り上に詰めても出来ます。
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
>最近、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
お礼
Protect / Unprotectを使うことによって思うようにVBAが動作するようになりました。 大変助かりました。ありがとうございました。
- mar00
- ベストアンサー率36% (158/430)
削除を Selection.EntireRow.Delete で行っていませんか? (右クリック→削除→行全体にあたります。) Selection.Delete Shift:=xlUp とすれば出来ると思いますよ。 (右クリック→削除→上方向にシフトにあたります。)
お礼
なんとか思うようにVBAを動作させることができました。 ありがとうございました。
お礼
こんな簡単な方法で出来るとは思いませんでした。 とても参考になります。ありがとうございました。