質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • VBA

    1800questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBAを用いてバッチファイルを作成するツール

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,306
退会済みユーザー

退会済みユーザー

前提・実現したいこと

業務でVBAを用いてバッチファイルを作成するツールが必要となりました。
ActiveDirectoryのUID棚卸しの為に使用します。
添付画像のような表から、各バッチファイルの作成が必要となります。

①新規ユーザーを作成するバッチ(dsadd user~)
②既存ユーザーをグループに追加するバッチ(net localgroup~)
③既存ユーザーを削除するバッチ(net localgroup~)

最終的に上記3つのバッチを表から作成する必要があるのですが、(各人個別ではなく、「削除の人はすべて削除バッチにまとめる)
VBAを使用したことがなく、どのように記述を初めていけばいいのかがわかりません。
グループは130ほどあり、該当ユーザーも多くなるため添付画像より複雑な表を基にします。

しかし私自身VBAを使用したことがなく、何から記述していけばいいのか悩んでいる状況です。

正確な答えが知りたい、というよりも
皆さんであればどのようにこのツールを実現させるのか、どのように考えるのか、どのように記述していくのか、大雑把ですが私なりに考えて作成していけるような、ヒントを頂ければと思っています。
どうかご回答、お願い致します。

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

自分ならWshスクリプトで作って、それにExcelファイルをドロップ
みたいな使い方をするかなあ。
で、Excelを走査しつつ、テキスト出力でバッチファイルを作成
みたいな感じで。
ちなみに、Wshスクリプトの拡張子は .vbs になります。
適当なテキストエディタで書けばok
--- 追記 ---
エラーチェックもないし、動作確認もしてませんが
参考になりますでしょうか。

Option Explicit
Dim args, fname, fs, xls, book, sheet, txt, i, buf
Set args = WScript.Arguments
fname = args.item(0)
Set xls = CreateObject("Excel.Application")
xls.DisplayAlerts = FALSE
Set book = xls.WorkBooks.Open(fname)
Set sheet = book.ActiveSheet
Set fs = CreateObject("Scripting.FileSystemObject")
Set txt = fs.CreateTextFile("C:\add_user.cmd", True)
i = 2
Do While sheet.Cells(i,1) <> ""
  buf = "dsadd " + sheet.Cells(i,2)
  txt.WriteLine buf
  i = i + 1
Loop
txt.Close
Set txt = Nothing
Set fs = Nothing
xls.Quit
Set sheet = Nothing
Set book = Nothing
Set xls = Nothing

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/21 11:44

    返信が遅れて申し訳ありません。
    また、ご丁寧にコードまでありがとうございます!
    参考にさせて頂きます。

    キャンセル

0

まず、提示いただいた表で、Cさんは新規ですが、これがGroup3の列に記載されています。
これは、ユーザーを①新規登録したうえで②Group3に追加する、という解釈で大丈夫でしょうか?

ここでは上記を前提としてアドバイスを進めさせていただきます。

今回の処理を実現するための処理手順は

①新規・追加・削除のバッチ処理対象を振り分けるため、それぞれのコレクションを用意する。
②対象データ範囲(例ではD2:F6)のセルを1つずつチェックする。
~対象ループ開始~
 ③取得セルの値によって処理分岐
  ③-1 "新規"の場合
     ・新規コレクションにユーザー情報を格納する。
     ・追加コレクションにユーザー情報・グループ名を格納する。
  ③-2 "追加"の場合
     ・追加コレクションにユーザー情報・グループ名を格納する。
  ③-3 "削除"の場合
     ・削除コレクションにユーザー情報・グループ名を格納する。
 ④全ての対象セルをチェックするまで繰り返す
~対象ループここまで~
⑤新規コレクションに格納されているユーザー情報からコマンド文字列を作成し、新規登録バッチファイルに出力する
⑥追加コレクションに格納されているユーザー情報からコマンド文字列を作成し、追加バッチファイルに出力する
⑦削除コレクションに格納されているユーザー情報からコマンド文字列を作成し、削除バッチファイルに出力する


のような感じになると思います。

バッチファイルを出力したい場合は上記⑤⑥⑦の処理になります。
わざわざバッチファイルを出力せずVBA上で処理してもよいのなら、⑤⑥⑦でファイル出力する代わりに作成したコマンド文字列をVBA上で実行するという方法もできると思います。

サンプル

以下はユーザーの新規登録・グループ追加・削除を振り分けるサンプルです。

'ユーザー情報配列のIndex管理
Enum UserInfo
    NM = 0
    ID
    OU
    GRP
    Last
End Enum

'振り分けサンプル
Sub Sample()

    Dim sht As Worksheet
    Dim rng As Range            '対象データ範囲
    Dim iLastRow As Integer     '最終行
    Dim iLastCol As Integer     '最終列

    '対象シートの設定
    Set sht = ActiveSheet

    '最終行・最終列を取得
    iLastRow = sht.Cells(Rows.Count, "A").End(xlUp).Row
    iLastCol = sht.Cells(1, Columns.Count).End(xlToLeft).Column

    '対象データ範囲の作成
    Set rng = sht.Range(sht.Cells(2, "A"), sht.Cells(iLastRow, iLastCol))

    '==①コレクションの作成==
    Dim cNew As New Collection  '新規コレクション
    Dim cAdd As New Collection  '追加コレクション
    Dim cDel As New Collection  '削除コレクション

    '==②対象範囲の全てのセルをループ処理==
    For Each r In rng
        With r
            '③取得セルrの値を判定
            If .Value <> "" Then
                '登録情報の作成
                Dim aryInfo(UserInfo.Last) As String
                aryInfo(UserInfo.NM) = sht.Cells(.Row, "A")
                aryInfo(UserInfo.ID) = sht.Cells(.Row, "B")
                aryInfo(UserInfo.OU) = sht.Cells(.Row, "C")
                aryInfo(UserInfo.GRP) = sht.Cells(1, .Column)

                Select Case .Value
                Case "新規"
                    '③-1 新規の場合
                    cNew.Add aryInfo    '新規コレクションに追加
                    cAdd.Add aryInfo    '追加コレクションにも追加
                Case "追加"
                    '③-2 追加の場合
                    cAdd.Add aryInfo    '追加コレクションに追加
                Case "削除"
                    '③-3 削除の場合
                    cDel.Add aryInfo    '削除コレクションに追加
                End Select
            Else
                '空の場合は処理なし
            End If
        End With
    Next    '==④範囲内の全セルを繰り返し処理する==

    '▼==コレクションからの取り出し==
    Dim i As Integer
    Dim strNM As String
    Dim strID As String
    Dim strOU As String
    Dim strGRP As String

    Dim strMsg As String

    strMsg = "--新規--" & vbCr
    For i = 1 To cNew.Count
        '==⑤新規コレクションから情報を取り出す==
        With cNew
            strNM = .Item(i)(UserInfo.NM)
            strID = .Item(i)(UserInfo.ID)
            strOU = .Item(i)(UserInfo.OU)
        End With

        strMsg = strMsg & strNM & "," & strID & "," & strOU & vbCrLf
    Next
    MsgBox strMsg

    strMsg = "--追加--" & vbCr
    For i = 1 To cAdd.Count
        '==⑥追加コレクションから情報を取り出す==
        With cAdd
            strNM = .Item(i)(UserInfo.NM)
            strID = .Item(i)(UserInfo.ID)
            strOU = .Item(i)(UserInfo.OU)
            strGRP = .Item(i)(UserInfo.GRP)
        End With
        strMsg = strMsg & strNM & "," & strID & "," & strOU & "," & strGRP & vbCrLf
    Next
    MsgBox strMsg

    strMsg = "--削除--" & vbCr
    For i = 1 To cDel.Count
        '==⑦削除コレクションから情報を取り出す==
        With cDel
            strNM = .Item(i)(UserInfo.NM)
            strID = .Item(i)(UserInfo.ID)
            strOU = .Item(i)(UserInfo.OU)
            strGRP = .Item(i)(UserInfo.GRP)
        End With

        strMsg = strMsg & strNM & "," & strID & "," & strOU & "," & strGRP & vbCrLf
    Next
    MsgBox strMsg
    '▲==============================


End Sub

手元に動作確認できる環境がなく詳細が分からなかったためコマンド文字列の作成部分は割愛させていただきました。
⑤⑥⑦の部分は各コレクションから情報を取り出すためのサンプルで、メッセージ出力するだけの実装となっています。
この情報を元にメッセージ文字列を作成する代わりにコマンド文字列を作成し、テキストファイルに出力するか、VBA上で実行する処理を作成してみてください。
⇒ファイル出力について ※3ページ目に出力方法の記事があります。

・dsaddはexeファイルのようですので、shell起動になると思います。
⇒Shell実行について

・netコマンドはDOSコマンドになるのでShell起動できません。cmd実行する必要があると思います。
⇒cmd実行について

==補足==

takasima20さんからVBSで処理する案が提案されています。
もしVBSでの実装を検討されるようでしたら、(既読かもしれませんが)下記サイトにいろいろと情報がありました。
⇒VBSで実装する場合の参考サイト

dsaddやnetコマンドを使う方法ではないようですが、いろいろな操作方法が記載されています。
※グループからの削除については記載がないようでした。
※ユーザー情報はDBデータをCSV出力して処理しているようですが、この部分をExcelデータからCSV出力するように読み替えればいいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    vbaでのエラー

    VBAによるIE自動制御 上記サイトに載っているコードと全く同じコードをvbaで書きましたが、エラーが出ます。何が問題なのでしょうか? Excel 2013を使ってます。

  • 解決済

    VAB 結合セルとループ

    前提・実現したいこと | 2013 | 1 | 山田 |      | 2 | 田中 |      | 3 | 佐藤 | 2014 | 1 | 山田 | 2015 | 1

  • 解決済

    【EXCEL VBA】セルの文字列の一部文字色を変更したいが変わらない

    Excelで文字列比較を行い、一致した文字のみ色づけするマクロを作成していますが、下記のマクロを実行するとすべての文字が色づけされてしまいます。 C列:比較ベース文字 I列

  • 解決済

    VBA 配列

    お世話になっております。 配列について学習を進めておりますが、イマイチどのようにデーターが格納されているくな分からず、意図した処理ができない状態です。 D列に"No"が合っ

  • 解決済

    VBA セル範囲から空ではないセルの数を取得したい

    VBAで、B列の空ではないセルの数を取得するにはどうしたら良いでしょうか? 画像の場合、2を取得したいです。 Range(B:B)からどうすればいいのかがわからない

  • 解決済

    Excelの集計方法なのですが・・・

    Excelで A列に 靴のタイプ(Aタイプ ・ Bタイプ ・ Cタイプがあります) B列に 色 (Aタイプは ブルー ホワイト オレンジ ブラック/Bタイプはイエ   

  • 解決済

    VBA オートフィルター空白セル非表示

    コード コードにて実行しようとしているのは、オートフィルターにて、空白セルを非表示にし、さらに、targetで指定した文字列のみ表示する という処理を実行したいのですが… こ

  • 受付中

    Excel→Accessへのインポート時のフィールド別型指定

    実現したいこと VBAで既存のテーブルに対してフィールドごとにデータ型を一括変更 VBAでExcelファイルをAccessへインポートする際にフィールドごとにデータ型を指

同じタグがついた質問を見る

  • VBA

    1800questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。