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.

ExcelVBA:数字⇔文字列変換

Posted at

image.png
上記の表から、申請者ごとにソフト名とその申請理由をそれぞれカンマ区切りで抽出したい場合に組んだVBA。

Dim i as integer

'1行目の右端まで処理を繰り返す
For i = 2 To ThisWorkbook.Sheets("list").Cells(1, Columns.Count).End(xlToLeft).Column

    user = Cells(1, i)

'templateシートをコピーして一番右に追加する。
    ThisWorkbook.Sheets("template").Copy After:=Sheets(Sheets.Count)
    Set objWorksheet = ActiveSheet
    ActiveSheet.Name = user
    
'数字を列番号に変換
    Dim colNum As Long
    colNum = i
'--- アドレス文字列 ---'
    Dim tmpStr As String
    tmpStr = ThisWorkbook.Worksheets(user).Cells(1, colNum).Address(True, False)
'--- 列番号を格納する変数 ---'
    Dim colAddress As String
    colAddress = Left(tmpStr, InStr(tmpStr, "$") - 1)

'各列の2行目から6行目までを選択し、soft_listに格納
    soft_list = colAddress & "2:" & colAddress & "6" 
'各列の7行目から11行目までを選択し、reason_listに格納
    reason_list = colAddress & "7:" & colAddress & "11"
    
'TextJoin関数を用いて範囲内の文字列を結合
    soft = WorksheetFunction.TextJoin(", ", True, Worksheets("list").range(soft_list))
    reason = WorksheetFunction.TextJoin(", ", True, Worksheets("list").range(reason_list))

ポイント1  シートのコピー

ThisWorkbook.Sheets("template").Copy After:=Sheets(Sheets.Count)
Set objWorksheet = ActiveSheet
ActiveSheet.Name = user

Set objWorksheet = ActiveSheet とすることで、コピーした後のシートが選択された状態とすることで、継続して作業が可能。今回の場合は、シート名をuserに変更した。

ポイント2 数字を列番号に変換(Addressプロパティ)

    Dim colNum As Long
    colNum = i
'--- アドレス文字列 ---'
    Dim tmpStr As String
    tmpStr = ThisWorkbook.Worksheets(user).Cells(1, colNum).Address(True, False)
'--- 列番号を格納する変数 ---'
    Dim colAddress As String
    colAddress = Left(tmpStr, InStr(tmpStr, "$") - 1)

Addressプロパティ構文

Cells([行番号], [列番号]).Address([行の相対参照 ], [列の相対参照])

・相対参照か絶対参照かを指定する引数はTRUEかFALSEで指定する。
 TRUEにすれば絶対参照の形式($が付いた形式)でアドレスを表す文字列が返される。

・列番号を取得するには、行の相対参照のみをTRUEにして値を取得する。
 その結果、「A$1」のようなアドレスが返されるので、「$」よりも左側を抽出すれば列番号が取得できる。
【出典】http://www.fingeneersblog.com/1483/
・InStr関数は、引数string1で指定した文字列の中から、引数string2で指定した文字列を検索して、見つかった位置を返す。

ポイント3 TextJoin関数
TextJoinプロパティ構文

TextJoin (delimiter、ignore_empty、text1, [text2],...)
引数 説明
delimiter(必須) 区切る文字
ignore_empty(必須) TRUE の場合、空のセルは無視される。
text1(必須) 結合するテキスト項目。 文字列またはセルの範囲などの文字列の配列。
 soft = WorksheetFunction.TextJoin(", ", True, Worksheets("list").range(soft_list))

range(soft_list)への入力
動かない:range((cells.(1, i): cells.(6, i))
動く:range(A2:A6)
→このためにAddressプロパティで列情報をアルファベットで取得した。

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?