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

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

新規登録して質問してみよう
ただいま回答率
85.51%
VBA

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

Q&A

2回答

12900閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

1クリップ

投稿2017/02/20 12:05

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

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

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

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

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

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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出力するように読み替えればいいと思います。

投稿2017/02/24 04:11

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

Wsh

1Option Explicit 2Dim args, fname, fs, xls, book, sheet, txt, i, buf 3Set args = WScript.Arguments 4fname = args.item(0) 5Set xls = CreateObject("Excel.Application") 6xls.DisplayAlerts = FALSE 7Set book = xls.WorkBooks.Open(fname) 8Set sheet = book.ActiveSheet 9Set fs = CreateObject("Scripting.FileSystemObject") 10Set txt = fs.CreateTextFile("C:\add_user.cmd", True) 11i = 2 12Do While sheet.Cells(i,1) <> "" 13 buf = "dsadd " + sheet.Cells(i,2) 14 txt.WriteLine buf 15 i = i + 1 16Loop 17txt.Close 18Set txt = Nothing 19Set fs = Nothing 20xls.Quit 21Set sheet = Nothing 22Set book = Nothing 23Set xls = Nothing 24

投稿2017/02/20 12:27

編集2017/02/20 12:56
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/21 02:44

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問