[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『取り消し線の設定されているセルを探したい』(yuki)
お世話になります。
エクセルで作成されているドキュメントの修正をしています。
ドキュメント(1つのエクセル内)には複数のシートがあります。
その中から取り消し線の使われているセルを探したく、
エクセルの書式の検索をしてみたのですが、
セルの文字全体が取り消し線で消されている場合は該当するのですが、
文字の一部が取り消しされている場合は該当しないようなのです。
(私のやり方が間違っているのでしょうか?)
そして、やりたいこととしては以下です。
1.(セル全体、セルの一部に)取り消し線の設定されているセルを探す
2.1枚シートを追加して、取り消し線の設定されているセルの一覧を作成する
(項目:シート名、セル(行、列)
2.が難しいようでしたら、1.の取り消し線の設定されているセルに
色を付けるでもよいかと思っているのですが、
各シートを色が付いているかどうか、確認していかないといけないので、
できれば一覧を作成する方法がありがたいです。
どうぞよろしくお願い致します。
< 使用 Excel:Excel2007、使用 OS:unknown >
>文字の一部が取り消しされている場合は該当しないようなのです これは、検索機能では、探してくれませんね!! この取り消し情報は 別のオブジェクトからのFontにあるので検索対象ではないのでしょう。
まずは、マクロの記録などでそのメカニズムを探ってみることです。
部分取り消しと セル全体取り消しでは どこが違うのか 調べることから始めることです。
(ichinose) 2015/07/11(土) 08:37
一覧シートはあらかじめ準備しておいてください。内容はからっぽでOKです。 以下のコードではシート名を"一覧"にしています。
Sub Test() Dim w As Variant Dim sh As Worksheet Dim c As Range Dim r As Range Dim z As Variant Dim flag As Boolean Dim shT As Worksheet
Set shT = Sheets("一覧")
For Each sh In Worksheets If sh.Name <> shT.Name Then Set r = Nothing On Error Resume Next Set r = sh.UsedRange.SpecialCells(xlCellTypeConstants) On Error GoTo 0 If Not r Is Nothing Then For Each c In r flag = False z = c.Characters.Font.Strikethrough If IsNull(z) Then flag = True ElseIf z = True Then flag = True End If If flag Then If IsArray(w) Then ReDim Preserve w(1 To 2, 1 To UBound(w, 2) + 1) Else ReDim w(1 To 2, 1 To 1) End If w(1, UBound(w, 2)) = sh.Name w(2, UBound(w, 2)) = c.Address(False, False) End If Next End If End If Next
shT.Cells.ClearContents shT.Range("A1:B1").Value = Array("シート名", "セル") shT.Range("A2").Value = "取り消し線付セルはありません" If IsArray(w) Then shT.Range("A2").Resize(UBound(w, 2), 2).Value = WorksheetFunction.Transpose(w)
shT.Select
End Sub
(β) 2015/07/11(土) 08:56
コメントありがとうございます。
やはり文字の一部が取り消されている場合は
書式の検索では該当しないのですね。
マクロやVBA(?)と言うのを今までやったことがないので
数日前から試行錯誤していました・・。
これからいろいろと試してみたいと思います。
(yuki) 2015/07/11(土) 09:26
コメントとプログラムありがとうございます。
今、動かしてみました。
正しくこれがやりたかったことです!
助かりました。
仕事で使うので月曜日になりますが、早速使わせて頂きます。
(yuki) 2015/07/11(土) 09:29
追加の質問でお手数をおかけします。
私の今家で使っているパソコンはエクセル2007で、
会社のパソコンはエクセル2010だったと思うのですが、
2010もこのプログラムで大丈夫でしょうか。
よろしくお願い致します。
(yuki) 2015/07/11(土) 09:35
β様に教えて頂いたやり方で十分目的は果たしているのですが、
以下のことができれば、もっと作業効率があがるように思い始めました。
1.あるフォルダに一覧のエクセルを置いておく。
(たとえば、C:\temp\一覧.xlsx)
2. 同じフォルダ内(C:\temp\)にあるエクセルの各シートの取り消し線が
付いている項目を一覧.xlsxに書き出す。
(項目:ファイル名、シート名、セル(行、列))
このようなことがプログラムでできるでしょうか。
どうぞよろしくお願い致します。
(yuki) 2015/07/11(土) 13:16
はいできますよ。
以下は、結果を 一覧.xlsx という別ブックではなく、このマクロブックの"一覧"シートに記載します。 マクロブックとしては、名前は任意、シートは"一覧"だけでOK。 このマクロブックを、チェックしたい xlsxブックが保存されているフォルダと同じフォルダに保存して 実行します。
Sub Test2() Dim w As Variant Dim wb As Workbook Dim sh As Worksheet Dim c As Range Dim r As Range Dim z As Variant Dim flag As Boolean Dim shT As Worksheet
Dim fPath As String Dim fName As String
Application.ScreenUpdating = False
Set shT = ThisWorkbook.Sheets("一覧") fPath = ThisWorkbook.Path & "\"
fName = Dir(fPath & "*.xlsx")
Do While fName <> ""
Set wb = Workbooks.Open(fPath & fName) For Each sh In wb.Worksheets Set r = Nothing On Error Resume Next Set r = sh.UsedRange.SpecialCells(xlCellTypeConstants) On Error GoTo 0 If Not r Is Nothing Then For Each c In r flag = False z = c.Characters.Font.Strikethrough If IsNull(z) Then flag = True ElseIf z = True Then flag = True End If If flag Then If IsArray(w) Then ReDim Preserve w(1 To 3, 1 To UBound(w, 2) + 1) Else ReDim w(1 To 3, 1 To 1) End If w(1, UBound(w, 2)) = wb.Name w(2, UBound(w, 2)) = sh.Name w(3, UBound(w, 2)) = c.Address(False, False)
End If Next End If
wb.Close False
Next
fName = Dir()
Loop
shT.Cells.ClearContents shT.Range("A1:C1").Value = Array("ブック名", "シート名", "セル") shT.Range("A2").Value = "取り消し線付セルはありません" If IsArray(w) Then shT.Range("A2").Resize(UBound(w, 2), 3).Value = WorksheetFunction.Transpose(w)
shT.Select
End Sub
(β) 2015/07/11(土) 16:45
長いプログラムありがとうございます。
本当に感謝です。
早速試してみました。
同じフォルダにあるエクセルはすべて処理されていて、思っているとおりなのですが、
シートが複数ある場合、1つ目のシートだけが対象になっているようなんです。
これを全てのシートを対象に一覧を作成できるようにできないでしょうか。
お手数で申し訳ありませんが、どうぞよろしくお願い致します。
(yuki) 2015/07/11(土) 19:39
ごめんなさ〜〜い。(汗)
wb.Close False を Next の下、fName = Dir() の上に持ってきてください。
お恥ずかしいです。ペコリ。
(β) 2015/07/11(土) 19:46
そんなあやまらないで下さい・・。
もう本当に思った通りのことができています!
心から感謝申し上げます。
β様にはお時間を使って作って頂いたわけですが、
この数日一人で考えていたのがとても勿体なく思えます。
もっと早くここで質問させてもらったら良かったです。
本当にありがとうざいました。
(yuki) 2015/07/11(土) 20:03
バグのお詫びに(?) ブック、シート、セルにそれぞれハイパーリンクセット。 (ブック選択時は、アクティブシートやアクティブセルが、たまたま保存されていた状態で表示されます)
Sub Test3() Dim w As Variant Dim wb As Workbook Dim sh As Worksheet Dim c As Range Dim r As Range Dim z As Variant Dim flag As Boolean Dim shT As Worksheet
Dim fPath As String Dim fName As String
Application.ScreenUpdating = False
Set shT = ThisWorkbook.Sheets("一覧") fPath = ThisWorkbook.Path & "\"
fName = Dir(fPath & "*.xlsx")
Do While fName <> ""
Set wb = Workbooks.Open(fPath & fName) For Each sh In wb.Worksheets Set r = Nothing On Error Resume Next Set r = sh.UsedRange.SpecialCells(xlCellTypeConstants) On Error GoTo 0 If Not r Is Nothing Then For Each c In r flag = False z = c.Characters.Font.Strikethrough If IsNull(z) Then flag = True ElseIf z = True Then flag = True End If If flag Then If IsArray(w) Then ReDim Preserve w(1 To 3, 1 To UBound(w, 2) + 1) Else ReDim w(1 To 3, 1 To 1) End If w(1, UBound(w, 2)) = sh.Parent.Name w(2, UBound(w, 2)) = sh.Name w(3, UBound(w, 2)) = c.Address(False, False)
End If Next
End If
Next
wb.Close False fName = Dir()
Loop
shT.Cells.ClearContents shT.Range("A1:C1").Value = Array("ブック名", "シート名", "セル") shT.Range("A2").Value = "取り消し線付セルはありません" If IsArray(w) Then shT.Range("A2").Resize(UBound(w, 2), 3).Value = WorksheetFunction.Transpose(w)
shT.Hyperlinks.Delete For Each c In shT.Range("A2", shT.Range("A" & Rows.Count).End(xlUp)) shT.Hyperlinks.Add Anchor:=c, Address:=c.Value shT.Hyperlinks.Add Anchor:=c.Offset(, 1), Address:=c.Value, _ SubAddress:=c.Offset(, 1).Value & "!A1" shT.Hyperlinks.Add Anchor:=c.Offset(, 2), Address:=c.Value, _ SubAddress:=c.Offset(, 1).Value & "!" & c.Offset(, 2).Value Next End If
shT.Select
End Sub (β) 2015/07/11(土) 20:03
ありがとうございます!
セル名、シート名を選んだときに
上手くリンクできるところと「参照が正しくありません。」となるところがあるようです。
(図々しくてすみません・・。)
でもブック名では該当のエクセルが開くので、いちいちファイルを探して開く手間が省けます。
このままでも、私が考えていた以上に使い勝手がよいです!
本当に助かります。
(yuki) 2015/07/11(土) 21:27
>この数日一人で考えていたのがとても勿体なく思えます。
そうは思いません。考えることは必ず後々、自身の力になると思います。 (カエムワセト) 2015/07/11(土) 21:29
「参照が正しくありません。」となるところですが、
シート名「Sheet1」「Sheet1 (2)」「Sheet1 (3)」と
「Sheet1」で始まるのがたくさんあることが原因してるでしょうか。
シート名を「A」とか「B」とか全然違うのにすると
うまくリンク先に飛ぶようです。
わかったところまでの情報を共有させて頂きます。
よろしくお願い致します。
(yuki) 2015/07/11(土) 21:34
確かに、数日前にエクセルに「開発」タブを追加しました。
その後、マクロを記録したり、編集したり、実行したりと言ったことを
試行錯誤しながらできるようになりました。
こう言ったことの積み重ねですよね。
コメント、ありがとうございました!
(yuki) 2015/07/11(土) 21:38
ハイパーリンクのシート名の前後に '(クォーテーション)をくっつけましょう。
shT.Hyperlinks.Add Anchor:=c.Offset(, 1), Address:=c.Value, _ SubAddress:=c.Offset(, 1).Value & "!A1" shT.Hyperlinks.Add Anchor:=c.Offset(, 2), Address:=c.Value, _ SubAddress:=c.Offset(, 1).Value & "!" & c.Offset(, 2).Value
この部分を
shT.Hyperlinks.Add Anchor:=c.Offset(, 1), Address:=c.Value, _ SubAddress:="'" & c.Offset(, 1).Value & "'!A1" shT.Hyperlinks.Add Anchor:=c.Offset(, 2), Address:=c.Value, _ SubAddress:="'" & c.Offset(, 1).Value & "'!" & c.Offset(, 2).Value
で置き換えてください。
(β) 2015/07/11(土) 22:05
ありがとうございます!
もう完璧に動きます。
どれだけお礼を言っても足りないくらい
自力では絶対ムリでした。
本当に助かりました!
(yuki) 2015/07/11(土) 22:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.