0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Microsoft Excelのワークシート作成サブルーチン

Posted at

Microsoft Excelのワークシート作成サブルーチン

 Microsoft Excelというのはもともとマッキントッシュのアプリケーションだから、いろいろとマックの制限を引きずっている。誰もが気がつくのは「なぜ印刷したらセルから文字がはみ出るんだぁ!」
 これは、マックのフォントが画面表示と印刷で幅が違う!という仕様だったので、それをアプリケーションで対応したからだ、ということだ。

 それ以外の制限として「ワークシート名」というのがある。31文字以内。禁則文字はMS-Windowsでは類を見ないもの。しかも(仕様には書いてないみたいだが)禁則文字を全角にして乗り切ろうにも、Windowsのファイル名と違ってやはりエラーメッセージが出る。これはマックのOSである漢字Talkには半角と全角の区別がない、という素晴らしい特性によるものである。

 というわけで、本来ならば「例えばVBAで、Microsoft Excelのワークシートを作る際には使おうとしているワークシート名がそれでいいのか、独自のチェックをかけないといけない」はずである。が、今のところ見つからないので、
自分で作りました。

 拡張子と思しきものがあれば取っ払います。
 禁則文字をアンダースコアで置き換えます。
 シート名を31文字で切ります。
 すでに同名のシートがあれば削除して再作成します。
こんなもんでいいかしら。

'<シートがあれば消して、作り直す。シート名は引数>
Sub シートドロップクリエイト(作成シート名 As String)

    If ワークシート名検証(作成シート名) Then
        Application.DisplayAlerts = False
        Worksheets(作成シート名).Delete
        Application.DisplayAlerts = True
    End If

    'Set ws = Worksheets.Add() 'シートを最初に追加する場合
    Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count)) 'シートを最後に追加する場合。

    ws.Name = 作成シート名
    
End Sub

Function ワークシート名検証(名前候補 As String) As Boolean
'Microsoft Excelはもともとマックのソフトなので、シート名の制限は漢字Talkのファイル名規則に従う。
'そこで、ワークシート名としようとした文字列を"名前候補"として渡し、規則に従っているかを検証。
'それでも31文字に切り縮め、禁則文字を置き換えるくらいのサービスはするので、実質は、
'シート名を整え、その上で重複したシート名があれば、Trueを返す関数となる。

'仕様にはないが全角もダメ。Macが全角と半角を区別しないから
Const シート名禁則 = ":,\,/,?,*,[,],:,¥,/,?,*,[,]"
Dim arrシート名禁則 As Variant

Dim s As Integer
Dim wk_名前候補 As String

Dim ws As Worksheet, flag As Boolean

    arrシート名禁則 = Split(シート名禁則, ",")

    'ファイル名をシート名にしたい時もあるので拡張子があれば除く
    If InStr(名前候補, ".") > 0 Then
        wk_名前候補 = Left(名前候補, InStrRev(名前候補, ".") - 1)
    Else
        wk_名前候補 = 名前候補
    End If
    
    'MS-Excelのシート名の制限31文字で切る
    wk_名前候補 = Left(wk_名前候補, 31)
    
    '名前候補に禁則文字があれば、半角アンダースコアに変換
    For s = 0 To UBound(arrシート名禁則)
        wk_名前候補 = Replace(wk_名前候補, arrシート名禁則(s), "_")
    Next s
    
    '同じ名前のシートがないか確認
    flag = False
    For Each ws In Worksheets
        If ws.Name = wk_名前候補 Then
            flag = True
            Exit For
        End If
    Next ws
    
    名前候補 = wk_名前候補
    ワークシート名検証 = flag
    
End Function

 同じような長い名前をつける羽目になったとき、最後に(1)とか(2)とかの序数をつけるというサブルーチンも作ったのですが、結局1回しか使ってないので、それは省略。
(もともと長いファイル名のブックがあって、各人がそれに記入した後、ファイル名に自分の社員番号をつけて保存するルールとなっていて、そういうのが同じフォルダにズラーっと並ぶというのがあったわけ。集計する側はとりあえず「ファイル名から拡張子を除いてシート名に」しようとしたのだけども、31文字の制限超えるんで、作ったの。)

 ちなみにMicrosoft Excelという表記も昔の名残で、Excelってケミカル銀行のファームバンキングソフトの名前だったのだな。でもどうしてもExcelという名前が使いたかったので「かならずMicrosoft Excelと表記するから」と約束して使わせてもらえることになった。その後、ケミカル銀行はマニファチャラーズ・ハノーバー銀行に買収され、更にチェース・マンハッタン銀行に買収されたのでExcelというファームバンキングソフトは宙に浮いた時期があり、そのとき購入しておけば当然商標権はおまけでついてくるので、買っちゃいましょう!すごい宣伝効果ですよ!!と社内で提案したが無視されてしまった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?