• ベストアンサー

エクセルのマクロを組めば可能でしょうか?

エクセルは普通に使えますが、マクロは組めません。 前の職場で、マクロを組める人が何人かいたため、組んでほしいときにはお願いができたり、 「こんなことがしたいけどできる?」といって相談にのってもらえたのが、 現職場では誰もマクロを組めず、もし、今、やろうとしていることが、マクロで可能なら自分で覚えようかと思っています。 以下のことがマクロで可能かどうか教えてください。 一品ずつエクセルファイルで作った書面があり、旧フォームと新フォーム混在していて、 旧フォームを新フォームに移行する作業を行おうとしています。 手作業では一旦そのファイルを開いて、フォームが古いかどうかを確認し、 古ければ新しいフォームに書き換える必要があります。 この作業が約500ファイルあり、大変な作業となっています。 また、手作業で実施するため間違いも発生しやすいです。 上記の作業をマクロで自動化できるでしょうか? また、できるとしたら、全くマクロを組んだことが無い人が 今から覚えて完成させるには難易度はいかほどでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kuma56
  • ベストアンサー率31% (1423/4528)
回答No.3

>今まで利用していたマクロは・・・8<・・・マクロ実行ボタンをクリックする・・・8<・・・フォルダ内にあるすべてのファイルを・・・8<・・・自動的にファイル内の新旧の判断を行える・・・ っと言う事は、"新しいフォームに書き換えるマクロ"はすでに存在しているのですかね。 >ファイルを自分でひらくことなく、自動的に・・・・ この辺が文面の理解の仕方で可になるかも知れませんね。 ファイルを開く事無く新旧を判断させる方法があるのかどうかは、私のスキルではわかりません。 しかし、"自分でひらくことなく"エクセルに自動的にファイルをひらかせる事は出来るのではないかと思います。 "エクセル マクロ フォルダ内のファイル名を取得"等をキーワードにしてWEB検索するなどして情報を集めてみてください。 フォルダ内のファイル名をワークシートに書き出す事が出来ると思います。 そうなれば、あとはその書き出したファイル名をマクロに呼び込んでやってで開いてやり、 >新旧のフォームは表の並びや、宛名が変わっているのでそれらを新旧の判断基準にはできると思います。 この基準に照らし合わせて、"新しいフォームに書き換えるマクロ"を実行させてやればなんとかなりそうな気がします。 "エクセル マクロ 解説"等をキーワードにしてWEB検索すると、エクセルのマクロについての解説サイトが見つかると思いますので、それらも併せて覗いてみてください。 とりあえずは、エクセルの"マクロの記録"の機能を使って、ファイルを開く→"新しいフォームに書き換えるマクロ"を実行する っとして一回きりの短いマクロを作ってみてはいかがでしょうか。 そしてそれを元に書き換えて、 フォルダ内のファイル名を取得する→その中のファイルを開く→新旧の判断をする→"新しいフォームに書き換えるマクロ"を実行する →次のファイルに移る こんな内容にすれば何とかなりそうな気がします。 新旧の判断については、"IF関数"を使えばできそうだし次のファイルに移る時は"Do~Loop関数"や"For~Next関数"などで出来そうな気がします。 そして実際に動かして上手くいかない点があれば、そこに具体的に的を絞って質問したほうが、解決への近道になりそうな気がします。

makura7
質問者

お礼

ご丁寧な回答ありがとうございます。 申し訳ありません。私の書き方が悪かったのですが 「今まで利用していたマクロは」というのは 「過去に利用したことがあるマクロは」という意味で 書いたつもりでした。すみません。。。 つまり、フォームを変換するマクロはありません。 利用したことがあるマクロのイメージで 「これは出来そう」「これは出来るのかな」 というのがあったので、知りたかったのです。 ネットで検索しても、基礎がわかっていないので できるかどうかがわからなかったのです。 とりあえず、まずやってみます。ありがとうございます!!

その他の回答 (5)

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.6

>拍子抜けかと思いますが… 別に拍子抜けではありませんよ。 なければ作ればいい! それだけです。 他のエクセルファイルからセルの値をコピーするのは簡単です。 以下のサンプルプログラムでは、すでに開いている「Book2.xls」というエクセルファイルの「Sheet1」というワークシートから、自分のファイルの「Sheet1」のワークシートに値をコピーします。(縦に並んでいたデータを横に並びかえます) Sub copy() ThisWorkbook.Activate Worksheets("Sheet1").Select [A1] = Workbooks("Book2.xls").Worksheets("Sheet1").[A1] [B1] = Workbooks("Book2.xls").Worksheets("Sheet1").[A2] [C1] = Workbooks("Book2.xls").Worksheets("Sheet1").[A3] [D1] = Workbooks("Book2.xls").Worksheets("Sheet1").[A4] [E1] = Workbooks("Book2.xls").Worksheets("Sheet1").[A5] End Sub 新旧のどちらも定型の書類でしたら、移行したい値の入っているセルの数だけ同じように繰り返せばOKです。

makura7
質問者

お礼

2度にわたりご丁寧にありがとうございます。 祝日を丸一日使って、いろいろやってみました。 まず、手始めに練習も兼ね、もっとも簡単そうな書類の形を変えない 「宛名のみを変更する」→セルAのみ書き換えるということを フォルダ内全てのファイルに対して実行するようにしてみました。 指定のフォルダのパスの取得がわからなかったので、作成したマクロのブックを指定フォルダに保存して、ThisWorkbook.Path を使って パスを取得させたのですが、 Do While ・・・ ファイル名 = Dir() Loop にて、当然のことながらマクロのブックにまで行き当たってしまい最後にエラーになります。 それ以外はうまくいったような気がするのですが。。。 おそらく、「このブック以外は」という条件を入れれば できるのだろうと思いますが、今の実力ではまだまだです。 (とりあえず、マクロの記録とサンプルを並べた程度の状態で イマイチどの部分に入れたらよいかもまだわかっていないので) 以下、長くなってしまいますが貼り付けてしまいました。 ご教授いただけたら幸いです。 ------------- Dim ファイル名 As String Dim フォルダ As String フォルダ = ThisWorkbook.Path & "\" ファイル名 = Dir(フォルダ & "\*.xls") Do While ファイル名 <> "" Workbooks.Open フォルダ & ファイル名 Range("A1") = "[変更後の宛名]" ChDir "[保存先のフォルダのパス]" ActiveWorkbook.SaveAs Filename:=ファイル名, FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False ActiveWindow.Close ファイル名 = Dir() Loop

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 >今から覚えて完成させるには難易度はいかほどでしょうか? そういう発想では、残念だけれども、何年も先になってしまいます。上手に質問するコツ、つまり掲示板を上手に利用する方法を学べばよいと思います。どういう質問の仕方で、回答から解決に結びつきやすいのか、とか。掲示板を見ていると、ハンドル名は出しませんが、この人のためなら、削除されるかもしれないような大きなサイズのコードを教えてあげようとなる人もいます。回答者も人なのです。常連さんと通りすがりさんとを見分けることも大事です。 掲示板にVBAの質問できるレベルというのは、早い人で1週間、そうでない人でも、2週間程度で、質問の仕方は分かるし、だいたいの目的のコードは手に入れられるかと思います。 今は、「フォーム」という言葉を使っているのでは、まったく見通しが立たないような気がします。言葉の定義というのは大事です。それは、読み手を混乱させるのに十分です。 UserForm は、自力で作るのは、技術的な程度が高いけれども、教えてもらうなら、ある程度、位置関係などわかる状態なら、可能なはずです。VBAの質問は、ほとんどは、具体的な内容でないと先に進みません。 初心者なら初心者でも、最低限知っているべきものがあります。 その前の段階から教わっていたら、回答者さんが疲れてしまいます。 例えば、標準モジュール・シートモジュール・ThisWorkbook モジュール・ユーザーフォーム・モジュールとユーザーフォームやコントロールの付け方、変数の宣言、プロシージャぐらいまでは、押さえておけばよいのです。後は、記録マクロから、自分で多少でも編集できるようなレベルで、そういうことに何ヶ月も掛かるわけではありません。 欲を言えば、エラーが出たときのメッセージを書き留めるとか、そのコードを示してあげるとか、マナーだと思います。 Webサイトでも可能かもしれませんが、用語を調べることのできる本をひとつ手に入れておいて補ったほうがよいです。VBAをまともに覚えようとしたら、何年も掛かってしまいます。VBAというのは、関数とは違い、ひとつのまとまりの中で段階的に覚えなくてはなりません。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.4

はじめまして >今まで利用していたマクロは、マクロを実行する対象ファイルを >開いてから、マクロ実行ボタンをクリックするというタイプのも >のだったので、たとえば、あるフォルダ内にあるすべてのファイ >ルを自分でひらくことなく、自動的にファイル内の新旧の判断を >行えるのよく分からなかったのです。 これまでのやりとりを読んでみた感じでは、できると思います。 すでに、旧フォームから新フォームへ移行するマクロはあるとのことなので、それを利用すれば、そんなに時間もかからず作成できると思います。 手順としては次のようになります 1.特定のフォルダにあるエクセルファイルを探す。 2.エクセルファイルを開く 3.旧フォームか新フォームかを判断し、旧フォームなら、以降のマクロを実行 4.開いたエクセルファイルを閉じる 5.フォルダ内のすべてのファイルに対し、2~4を繰り返す。 2と5に関して-------------- エクセルマクロからエクセルファイルを開くには以下のようにします。 Workbooks.Open("D:\document\Book1.xls") 同じく閉じるには以下のようにします。 Workbooks("Book1.xls").Close SaveChanges:=False 3に関して-------------- >ご想像通り、新旧のフォームは一定のルールがあります。 を利用します。 新旧で必ず違うセル1つ(例えば旧フォームではA1が「○○」だけれど新フォームは違う)を判断基準にして If [A1] = "○○" Then call [既存の移行マクロ] とすれば、旧フォームのときだけマクロを実行できます。 1と5に関して-------------- 対象のファイルがすべて同じフォルダにあるなら「Dir関数」が使えます Filename = Dir([フォルダのフルパス] & "\*.xls") Do While Filename <> "" [処理] Filename = Dir() Loop もし特定のフォルダ以下のサブフォルダにも対象ファイルがある場合には、「ファイルの検索」を使います。 Dim varF1 As Variant With Application.FileSearch .NewSearch .LookIn = "[フォルダのフルパス]" .Filename = "*.xls" .SearchSubFolders = True .Execute For Each varF1 In .FoundFiles [処理] Next varF1 End With

makura7
質問者

お礼

詳細なご回答ありがとうございます。 No.3の回答者さんへのお礼にも書いたとおり、私の書き方がまずかったので 既にマクロがあるような誤解を生んでしまって申し訳ありません。 全くのゼロからのスタートなので、時間を割いていろいろ書いてくださったのに 拍子抜けかと思いますが、ご丁寧にご教授いただいたことに 感謝しております。大切に保存して勉強します。 ありがとうございました。

  • diashun
  • ベストアンサー率38% (94/244)
回答No.2

ご質問で、「古いフォーム」「新しいフォーム」が意味することとは、それぞれの表形式のフォーム(表の組み方)という意味でしょうか?「古いフォーム」も「新しいフォーム」もある一定のルールに基づいて作成されている(たとえば列数[項目数]が統一されているなど)ものであれば、現在のファイルの新・旧を判断して、そのファイルを新形式のファイル(フォーム)に書き換えることは、VBAで出来ると思います。 詳細仕様が不明なのでこれ以上の回答は出来かねますが、Excelの自動化のある程度のことはVBAとフリーのVBAのDLL(とりあえず「便利ツール」とでも)で実現可能ではないでしょうか。 VBAで実現できる日常業務は限りなくあります。こんな便利なVBAを勉強しない手はありません。作成者の創意工夫があれば、市販有料ツールに負けず劣らずのExcel自動実行マクロの作成が可能です。この機会に是非ともチャレンジしてみてください。参考になるサイトは、「VBA VBAマクロ VBA入門 などでネット検索すればかなりの数がヒットするはずです。

makura7
質問者

お礼

早々のご回答ありがとうございます。 ご想像通り、新旧のフォームは一定のルールがあります。 今、やりたいことが自分で完成できるかは まだ分かりませんが、おっしゃるとおり使えたら きっと便利だとずっと思っていたのでこれを機会に 勉強します。 いつも、マクロを組んでくれていた人が 「めんどくさがり屋が技術を進歩させる」と言っていました。 既に、世の中の技術は出来上がっていますが 自分自身の技術を進歩させ、活用させたいと思います。 アドバイスありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

出来るかどうかは、新旧のフォームがどうなっているのか(判断をどうつけるのか)が 明確になれば回答も確実ですけど。 >また、できるとしたら、全くマクロを組んだことが無い人が >今から覚えて完成させるには難易度はいかほどでしょうか? 全ての人(?)は初めは組んだ事ない状態から始めますので、そこから考えれば 判断条件が楽ならさほど問題ないのでは? ただ基礎からやっている時間があるのかどうかとかは、正直会社(上司)と 相談してから行なわないと業務に支障も出ますしね。

makura7
質問者

お礼

早々のご回答ありがとうございます。 新旧のフォームは表の並びや、宛名が変わっているので それらを新旧の判断基準にはできると思います。 今まで利用していたマクロは、マクロを実行する対象ファイルを 開いてから、マクロ実行ボタンをクリックするという タイプのものだったので、たとえば、あるフォルダ内にあるすべてのファイルを自分でひらくことなく、自動的にファイル内の新旧の判断を 行えるのよく分からなかったのです。 確かに、今から覚えるのは時間とはかりにかけなければ ならないので検討しますが、「マクロが使えたら こんなことすぐにできるんじゃないかな?」と思うことが よくあるので、挑戦してみたいと思います。 ありがとうございました。

関連するQ&A