2018年4月28日土曜日

なぜかは知らぬが、VBAがらみの記事が、人気の投稿蘭にランクインなんだよね - Application.InputBox(VBA)

    
ブログの人気の投稿欄を見ると、VBAに関連した記事が三つもありました。
ブログの主旨は、スキーがメインですが、VBAだとかなり逸脱しております。

まあ、退職間近とはいえ、仕事柄、エクセルを使いますのでそうなりますわ。
そして、VBAと呼ぶよりマクロの方が、分かってもらえるかもしれません。

マクロとなると作業の自動記録ができるので、プログラミングは不要なのよ。
だけど、より複雑なプログラム主体で表やデータを操作すると、これはVBA。

初めからVBエディターを使うし、簡単でもプログラムを組まねばなりません。
こうして、仕事で処理の楽になるよう、ごく簡単なコードを作って来ました。

一方、社内で説明しても、VBAが分かる社員は、非常に限られております。
むしろ、速攻で無視されたり、彼らは何のためにエクセルを使うのでしょう。

単なる罫線の引かれた電子帳票ぐらいにしか、見ていないんじゃないのか。
そんな風にも思いますが、だったら、ブログで紹介して見るだけのことです。

これまで、いくつか投稿しましたが、コメントの書き込みは全くありません。
だから、読まれているのかどうか、分かりませんが、人気の投稿みたいなの。

やっぱり、エディターでコードを書く際、ググッて検索する人がいるのかな。
そんな風に思うのですが、ならばと久しぶりに簡単コードを紹介しましょう。

これは、最近、技術系の人が書いた資料を翻訳するために、書きました。
なぜかと言うと、技術系は何でもエクセルで、資料を作りたがるのですわ。

マニュアル、報告書、グラフや表、フローチャートを簡単に書けるからかな。
シート毎をページに見立てて資料を作っていくようですが、日本だけらしい。

もっとも、技術立国のドイツでも、エクセルを使う人がいるようですが本当?
ついては、ネタコードを二三紹介してみますので、良ければ使ってみて下さい。

① ワークシート上にある、テキストボックスの内容をセルへ全部書き出す

Sub TextBoxPickUp()

Dim shp As Variant
Dim i As Long
Dim OldSheet As Worksheet

    Set OldSheet = ActiveSheet
    With Worksheets.Add()
    .Name = "TEMP"
    End With
   
    OldSheet.Activate

For Each shp In ActiveSheet.Shapes

If shp.Type = msoTextBox Then

i = i + 1
Sheets("TEMP").Cells(i, 1).Value = shp.TextFrame.Characters.Text

End If

Next

End Sub

これは、テキストボックスを多用した、絵入りの技術資料で活用しました。
吹き出し部分が操作内容を説明しますが、これをすべて翻訳するのです。

グーグルの自動翻訳を使いますが、一個一個、コピペするのがかったるい。
ですので、臨時のシートを作り、そこへ全て抜き出してセルへ書き込みます。

操作は、このコードを対象のシート上に書き込み、実行(R)するだけです。
VBEから実行するという意味ですが、後はデータを一括コピーで翻訳します。

② 一度に大量のワークシートを挿入する

Sub Prcdre1()
'ワークシートの挿入
Call WkShtInsert
End Sub

Sub WkShtInsert()

Dim rc As VbMsgBoxResult
Dim i As Variant
Dim j As Variant
Dim buf As String

j = Application.InputBox(Prompt:="ここに挿入するシート数を入力", Type:=1)

If VarType(j) = vbString Or j <= 0 Then Exit Sub '条件外の入力値は終了

rc = MsgBox("シートを挿入しますか?", vbYesNo + vbQuestion)

If rc = vbYes Then
        MsgBox "挿入を一括処理します", vbInformation
    ElseIf rc = vbNo Then
        MsgBox "挿入を中止します", vbCritical
            Exit Sub
    End If
    
For i = 1 To j '最終シートの後尾に連続追加

    Worksheets.Add After:=Worksheets(Worksheets.Count)

Next i

End Sub

一枚のワークシートをページに見立てて、翻訳を貼り付ける前に使いました。
最初から、必要なページ数は分かっており、その分だけシートを一括で作成。

一ページごと翻訳を貼り付けたら、シートを追加するのもかったるいでしょう。
だから、一括挿入する方法を考えたって分けですが、必要数も入力します。

後、実行コードは、別にして、別のプロシージャからコールするのが簡単です。
これも、VBE上で操作するためのテクニックだと、思ってくだされば結構だよ。

③ 一度にブック全体のグリッド線を消し込む

Sub NoBorderLine()

Windows(ActiveWorkbook.Name).DisplayGridlines = False

End Sub

グリッド線を消しこんで、あたかも紙の上に印刷されたイメージにします。
マニュアルのような資料を作ったら、最後に実行して体制を整えるといいよ。

三行で書き上げてしまいますが、改めて、グリッド線が必要な時もあります。
そんな時は、FalseをTrueに書き換えて、プロシージャを実行するだけです。

④ 大量のシートを持つブックで、任意のシートを移動させる方法

Sub SheetMove()

Dim i As Variant
Dim j As Variant

i = Application.InputBox(Prompt:="移動するシートのインデックス番号を入力", Type:=1) '数値指定

If VarType(i) = vbString Or i <= 0 Then Exit Sub '条件外の入力値は終了

j = Application.InputBox(Prompt:="置かれる手前のシートインデックス番号を入力", Type:=1) '数値指定

If VarType(j) = vbString Or i <= 0 Then Exit Sub '条件外の入力値は終了

If i = j Then Exit Sub '同じインデックス番号なら終了

Worksheets(i).Move After:=Worksheets(j)

End Sub

大量のシートがあるブックで、任意のシートを移動させたい場合があります。
例えば、シートの差込とか、内容の変更とかで、位置を動かすケースです。

そんな時、移動させたいシート、移動させる位置などを入力して実行します。
翻訳作業なんかでは、ページが多いと意外と重宝しそうなので、作りました。

というわけで、これらのコード中、InputBoxの入力で、かなりとまどいました。
どうしてかというと、単純なInputBoxのコードでは、入力値が数値であっても文字列と見なされてしまうので、これを数値と見なすような指定が必要になり、しかもそれ以外が入力されたかの判定を行う条件も必要になりまして、結果、Application.InputBox()を使う必要性のあることを、初めて知ったのでありました。



いいねと思ったら、二つポチっとね!



0 件のコメント:

コメントを投稿