アフィリエイト広告を利用しています
G-B2H5YFC4DJ
メール下書き作成
ファイルの名前を一括変更
プログレスバー
文字取り消し線の削除(制限あり)
キーでスクショを連続取得
シート名を一括変更
プロフィール
Dr.ワークさんの画像
Dr.ワーク
主に開発に関するブログです
プロフィール

広告

posted by fanblog

2022年03月15日

VBAの難しい点

01_title.jpg

会社で使うExcel。いつの間にかExcelのために仕事をさせられていませんか?

Excelを使い倒して、仕事を楽にするツールにしちゃいましょう

この記事は、VBAを扱えるようになったため、思わず、

「あ、VBAでチャチャっと作っちゃいますよ」と言ってしまったが、

実際は、作成が困難で、「すいません、やっぱムリっす」という

あるあるな事例紹介です

目次
VBAで簡単に処理できると思った作業
02_before.jpg
WEBに事例もあるし、VBAで簡単にできそう

Excelで人が作業していることは、大抵プログラムでも出来ます

しかし、意外にも、VBAだと結構時間がかかってしまうケースもあります

私はVBAの苦手な部分と思っていますが、最初に事例を知っておくことで、

頼まれてもNOと言える人を目指したいと思います

どんな作業?
03_merit.jpg
  • 文字飾りの文字消し線の文字消し(★大変)
  • 文字の置換(★大変)
マクロ

それぞれマクロのサンプルを掲載します



文字飾りの文字消し線の文字消し

'---------------------------------------------------------------------------------------------------
'
' マクロ: 文字消し線の文字列を削除します
'
'---------------------------------------------------------------------------------------------------
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列に削除されて出力されるかと思います
05_P01.gif

文字の置換


'---------------------------------------------------------------------------------------------------
'
' マクロ: セル内の書式を保持して文字列を置き換えます
'
'---------------------------------------------------------------------------------------------------
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文字を超えた場合、置換できません
05_P02.gif

どんな問題か?

「文字取り消し線」も「書式保持置換」の両方共ですが、.Charactersは、256文字までしか扱えません

またマシンスペックにもよりますが、「文字取り消し線」は文字数が増えるほど、異常に時間がかかります

上記の処理で機能や性能の要求を満たせない場合、単純にVBAで用意されている関数のみではなく、

処理を工夫する必要がありそうです

そもそも、このような使い方をするのか?と思うかもしれませんが、

実際あり得ますし、国内外で問い合わせをみかけます

Excelで1セルに1000文字書けるなら、記載されることもあり得るでしょうし、

1000文字を超えるような文字列の中に、取り消し線を記載できるなら記載されることもあり得ます

使用に制限を設けるか、なんとか処理を工夫して解決するかは、

人それぞれかなと思います


以上となります。
posted by Dr.ワーク at 21:16 | Comment(0) | TrackBack(0) | VBA
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/11309687
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
×

この広告は30日以上新しい記事の更新がないブログに表示されております。