2022年03月15日
VBAの難しい点
会社で使うExcel。いつの間にかExcelのために仕事をさせられていませんか?
Excelを使い倒して、仕事を楽にするツールにしちゃいましょう
この記事は、VBAを扱えるようになったため、思わず、
「あ、VBAでチャチャっと作っちゃいますよ」と言ってしまったが、
実際は、作成が困難で、「すいません、やっぱムリっす」という
あるあるな事例紹介です
- 1. VBAで簡単に処理できると思った作業
- 2. どんな作業?
- 3. 各マクロのサンプル
- 4. どんな問題か?
WEBに事例もあるし、VBAで簡単にできそう
Excelで人が作業していることは、大抵プログラムでも出来ます
しかし、意外にも、VBAだと結構時間がかかってしまうケースもあります
私はVBAの苦手な部分と思っていますが、最初に事例を知っておくことで、
頼まれてもNOと言える人を目指したいと思います
- 文字飾りの文字消し線の文字消し(★大変)
- 文字の置換(★大変)
それぞれマクロのサンプルを掲載します
文字飾りの文字消し線の文字消し
'---------------------------------------------------------------------------------------------------
'
' マクロ: 文字消し線の文字列を削除します
'
'---------------------------------------------------------------------------------------------------
Option Explicit
'---------------------------------------------------------------------------------------------------
' 概要: セル内の文字消し線のついたの文字のみ削除します
'---------------------------------------------------------------------------------------------------
Sub delStrikethrough()
Dim rCells As Range
Dim r As Range
Dim i As Long
Dim str As String
'A列から文字取り消し線を消してB列に記載します
Set rCells = Range(Cells(1, 1).Address, Cells(Rows.Count, 1).End(xlUp).Address)
For Each r In rCells
str = ""
For i = 1 To Len(r)
With r.Characters(i, 1)
If Not .Font.Strikethrough Then
str = str & .Text
End If
End With
Next
'B列に入れます
r.Offset(0, 1) = str
Next
End Sub
文字取り消し線のあるA列の文字列が、B列に削除されて出力されるかと思います
文字の置換
'---------------------------------------------------------------------------------------------------
'
' マクロ: セル内の書式を保持して文字列を置き換えます
'
'---------------------------------------------------------------------------------------------------
Option Explicit
'---------------------------------------------------------------------------------------------------
' 概要: セル内の書式を保持して文字列を置き換えます
' 補足: .Charactorは256文字までしか対応できません
'---------------------------------------------------------------------------------------------------
Sub repString()
Dim rCells As Range
Dim r As Range
Dim i As Long
Dim orgStr As String
Dim repStr As String
Dim pos As Long
'B列のセル内文字列を置き換えます
Set rCells = Range(Cells(1, 2).Address, Cells(Rows.Count, 2).End(xlUp).Address)
orgStr = "置き換えたい"
repStr = "置き換えました"
For Each r In rCells
pos = InStr(r, orgStr)
'置き換える文字列があったら処理
If pos > 0 Then
r.Characters(pos, Len(orgStr)).Insert (repStr)
End If
Next
End Sub
文字書式が保持されつつ置換されますが、256文字を超えた場合、置換できません
「文字取り消し線」も「書式保持置換」の両方共ですが、.Charactersは、256文字までしか扱えません
またマシンスペックにもよりますが、「文字取り消し線」は文字数が増えるほど、異常に時間がかかります
上記の処理で機能や性能の要求を満たせない場合、単純にVBAで用意されている関数のみではなく、
処理を工夫する必要がありそうです
そもそも、このような使い方をするのか?と思うかもしれませんが、
実際あり得ますし、国内外で問い合わせをみかけます
Excelで1セルに1000文字書けるなら、記載されることもあり得るでしょうし、
1000文字を超えるような文字列の中に、取り消し線を記載できるなら記載されることもあり得ます
使用に制限を設けるか、なんとか処理を工夫して解決するかは、
人それぞれかなと思います
以上となります。
この記事へのトラックバックURL
https://fanblogs.jp/tb/11309687
※ブログオーナーが承認したトラックバックのみ表示されます。