以前、こちらで別ブックの指定したセル番に飛んで、色付け、コメントを表示、次のセルへ飛ぶ際には色を元に戻し、コメントも取り去る。
というコードを教えていただきました。それは大変役に立ち、教えてくださった方々も何度もかかわっていただいた質問でした。
一年たって新たに問題が出たのでいろいろ構っていたのですが、また質問に参りました。
問題点は、下のコードを実行する際、検査する別ブックにシートの保護がかかっている場合エラーになることです。こればっかりは、そのブックのシート保護を解除しない限り無理でしょうか?
シートの保護はかかっているのですが、飛んでいくセルには編集できるようになっているので、余計に残念です。
Sub oshiete()
Dim x As String
Dim ThisSheet_Name As String
Dim Sheet_Name As String
Dim Range_Name As String
Dim i As Integer, n As Integer
Dim Ans As Integer
Dim myComment As String '新規追加
Dim Colors As Integer '新規追加
ThisSheet_Name = ActiveSheet.Name '設定シート
Select Case Workbooks.Count
Case 1
MsgBox "チェックするファイルがありません。"
Exit Sub
Case 2
For n = 1 To 2
If Workbooks(n).Name <> ThisWorkbook.Name Then
x = Workbooks(n).Name '開いている“もうひとつのブック”の名前
End If
Next
Case Else
MsgBox "他に開いているファイルが複数のため対象を特定できません。"
Exit Sub
End Select
i = 0
Do While (1)
With ThisWorkbook.Sheets(ThisSheet_Name)
If .Range("A3").Offset(i, 0).Value = "" Then
MsgBox "検査項目は以上です。"
ThisWorkbook.Activate
Exit Do 'A列の3行目以下が、空白なら終わる
End If
Sheet_Name = .Range("A3").Offset(i, 0).Value
Range_Name = .Range("B3").Offset(i, 0).Value
myComment = .Range("C3").Offset(i, 0).Value
End With
Windows(x).Activate
Sheets(Sheet_Name).Select
Range(Range_Name).Select
Colors = Selection.Interior.ColorIndex '新規追加
Selection.Interior.ColorIndex = 6
With Selection(1).AddComment '選択範囲の1番目にコメント
.Visible = True
.Text myComment
End With
Range(Range_Name).Select
Ans = MsgBox("「次をチェックしますか?」", vbYesNo)
Selection.Interior.ColorIndex = Colors '修正
Selection.ClearComments '新規追加
If Ans = vbYes Then
i = i + 1
Else
Exit Do
End If
Loop
End Sub
No.3ベストアンサー
- 回答日時:
こんばんは。
>で黄色くなっています。
ということで、もし、実行時エラーなら、シートのプロテクトの度合いに問題で、私は、エラー回避するのを忘れていました。
On Error Resume Next
With ActiveCell
.Interior.ColorIndex = xlNone
.ClearComments
msg = ""
End With
On Error Goto 0
とはさむしか、回避する方法はないと思います。
まあ、皆さんが以前に作ったものと、それほどに変わるわけではありませんが、考え方のプロセスがちょっと違うだけです。
Wendy02さんおはようございます。
またお世話になりました。バージョンアップできて助かりました。いろいろお考えいただいていつもありがとうございます。
No.2
- 回答日時:
こんにちは。
これは、1年越しに醸成されながら作られたマクロのようですから、私も、前のいきさつを読みながら、私なりに考えてみました。
対話型のマクロというのは、難しい割には、成果が少ないようです。本当は、コンセプト自体を変えて、目的に沿った別な方法があるような気がしてならないのですが、ここで、数名の方が携わってきて、今更、白紙に戻して、最初から直すということもできないはずです。
私自身も以下を小一時間で作ってみましたが、たいしたものは作れませんでした。要するに、キャンセルを押したら、それで、そのマクロはおしまいですね。ただ、そこで調整して、中途から行うということは可能です。また、プロテクトにも種類がありますから、ある程度のこと可能です。
今回の質問に関しては、プロテクトに関しては、直接ではないにしても、以下のように、結果的には、プロテクトを一回外して、マクロ側で使えるように、外すというような作業が必要になってしまいます。本来、Comment を書き込むというようなことがなければ、もう少しすっきりとはしますが。
例:
With Worksheets("Sheet1")
.Unprotect Password:="PWS"
.Protect Password:="PWS", UserInterfaceOnly:=True
End With
UserInterfaceOnly のHelpの解説
引数 UserInterfaceOnly に True を設定した Protect メソッドをブックのワークシートに適用した場合、保存して閉じた後でもう一度開いたブックに対しては、画面上からもマクロからも変更ができなくなります。マクロからの変更を可能にするためには、引数 UserInterfaceOnly に True を設定した Protect メソッドを再び適用する必要があります。
<<試案>>
''----------------------------------
''標準モジュールが良いです。
''これは、プロテクトされていたら、on protect という表示と、メッセージが、Msgbox に現れる形になります。
''-----------------------------------
Sub TestMacro()
Dim c As Range
Dim ret As Variant
Dim wb As Workbook
Dim opWb As Workbook
Dim arAdd(2, 20) As String '設定は20項目まで
Dim myCol As Long
Dim n As Integer
Dim msg As String
Dim i As Integer
Dim j As Long
Dim lastnum As Long
With ThisWorkbook.ActiveSheet
For Each c In .Range("A3", .Range("A65536").End(xlUp))
If c.Value <> "" And c.Offset(, 1).Value <> "" Then
ret = Application.Evaluate("=" & c.Value & "!" & c.Offset(, _
1).Value)
If IsError(ret) Then
MsgBox "正しくシートに入れられていません。", 48
Exit Sub
End If
arAdd(0, j) = c.Value
arAdd(1, j) = c.Offset(, 1).Value
arAdd(2, j) = c.Offset(, 2).Value
j = j + 1
End If
Next c
End With
lastnum = j - 1
For Each wb In Workbooks
'可視ブックスの数を数える
If wb.Windows(1).Visible And Not wb Is ThisWorkbook Then
If opWb Is Nothing Then
Set opWb = wb
Else
MsgBox "複数の可視ブックが開かれています。", 48
Set opWb = Nothing
Exit Sub
End If
End If
Next wb
If opWb Is Nothing Then
MsgBox "もうひとつの可視ブックが、開かれていません。", 48
Exit Sub
End If
For j = 0 To lastnum
Application.Goto opWb.Worksheets(arAdd(0, j)).Range(arAdd(1, j)), True
On Error Resume Next
Call ScreenCenter(ActiveCell)
On Error GoTo 0
On Error Resume Next
With ActiveCell
.Interior.ColorIndex = 6
.AddComment.Text arAdd(2, j)
.Comment.Visible = True
n = Err.Number
End With
On Error GoTo 0
If n = 91 Then msg = " on protect" & vbCrLf & arAdd(2, j)
If j < lastnum Then
If MsgBox( _
"現在の場所: & " & ActiveSheet.Name & "!" & ActiveCell.Address(0, 0) & _
msg & vbCrLf & vbCrLf & _
"次に進みますか? " & _
arAdd(0, j + 1) & "!" & arAdd(1, j + 1), _
vbOKCancel, "プロセス " & j + 1 & "/" & lastnum + 1) = vbCancel _
Then
Exit For
End If
Else
MsgBox "現在の場所:" & ActiveSheet.Name & "!" & ActiveCell.Address(0, 0) & _
vbCrLf & vbCrLf & "これで終了です。 " & msg, _
64, "プロセス " & j + 1 & "/" & lastnum + 1
End If
With ActiveCell
.Interior.ColorIndex = xlNone
.ClearComments
msg = ""
End With
Next j
'戻る場所
Application.Goto ThisWorkbook.ActiveSheet.Range("A3")
Set opWb = Nothing
End Sub
Private Sub ScreenCenter(ac As Range)
'Scrolls Control
Dim acRow As Long
Dim myRow As Long
Dim acCol As Integer
Dim myCol As Long
With ActiveWindow
acRow = ac.Row
acCol = ac.Column
'Screen upper one third
myRow = .VisibleRange.Rows.Count - Int(.VisibleRange.Rows.Count / 3) * 2
If acRow > myRow Then
.ScrollRow = acRow - myRow
Else
.ScrollRow = 1
End If
myCol = Int(.VisibleRange.Columns.Count / 2)
If acCol > myCol Then
.ScrollColumn = acCol - myCol
Else
.ScrollColumn = 1
End If
End With
End Sub
Wendy02さんこんにちは。いつもお世話になります。
この質問の際にも大変お世話になり、私にとって大変有益なものを提示いただきました。
今回の質問でまた時間を作っていただきご提示いただきありがとうこざいます。早速ためさせていただきましたところ、以下のところでとまってしまいました。
With ActiveCell
.Interior.ColorIndex = xlNone
.ClearComments
msg = ""
End With
この
.Interior.ColorIndex = xlNone
で黄色くなっています。
私の理解不足で貼付、設定など間違っていたら申し訳ありません。
TestMacro とPrivate Subを標準モジュールに貼り付けています。
No.1
- 回答日時:
質問への直接の回答ではありませんが、
一手間かけるつもりになれば、保護されたシートを、そのまま別ブックのシートに丸ごとコピーして、保護無し状態で再現する事は容易です。(A1セルの左上の空白のマスをクリックして、シート全体をコピーし、空シートにペースト。但し、セル内の文字数が255文字以上の時は、制約あり)
検査対象ブックをそのまま提出しなければいけない様な場合は無理ですが、ご参考まで。また、Excel2000での話です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでブックを非表示で開いて処...
-
エクセルの関数 ENTERを押...
-
エクセルで参照しているデータ...
-
エクセルを共有するとPCによっ...
-
フォルダ内の複数ファイルから...
-
エクセルの関数について教えて...
-
Excel(2010)のフィルターが保...
-
北九州市にあった「井筒屋ブッ...
-
リンク元ブックのPWが分からな...
-
アクセスvbaでエクセルブックを...
-
エクセルで開いていないbookの...
-
外部ブック参照が#REF!になって...
-
指定ファィルの指定シートをシ...
-
エクセルで「ディスクがいっぱ...
-
エクセルでウィンドウの枠固定...
-
フォルダ内の複数ブック・シー...
-
Excel起動時に特定のワークシー...
-
エクセルで別ブックをバックグ...
-
エクセルで50行ごとに区切った...
-
Excelでブックの共有を掛けると...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルを共有するとPCによっ...
-
エクセルの関数 ENTERを押...
-
VBAでブックを非表示で開いて処...
-
WorkBooksをオープンさせずにシ...
-
Excelでブックの共有を掛けると...
-
エクセルで参照しているデータ...
-
Excel(2010)のフィルターが保...
-
Excelで複数ブックの同一セルに...
-
VBA バックグラウンドで別ブッ...
-
エクセルで50行ごとに区切った...
-
エクセルで「ディスクがいっぱ...
-
エクセルにおける,「ブック」...
-
エクセルファイルを開かずにpdf...
-
フォルダ内の複数ファイルから...
-
ブックのピボットを別ブックに...
-
エクセルシートの一部を送りたい
-
エクセル2016です。「ブッ...
-
エクセルで別ブックをバックグ...
-
フォルダ内の複数ファイルから...
-
複数ファイルから特定シートの...
おすすめ情報