トップページtech
1001コメント417KB

Excel VBA 質問スレ Part33

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/17(木) 22:04:40.64
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

前スレ
Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151717/

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人はこちらのスレへ
http://toro.2ch.net/test/read.cgi/tech/1381151995/l50
0326デフォルトの名無しさん2014/02/20(木) 09:03:39.96
>>325
このスレでは問題ない
そういうことが気になるなら君が他所へ行きたまえ
0327デフォルトの名無しさん2014/02/20(木) 10:28:54.40
>>326
ですよね
0328デフォルトの名無しさん2014/02/20(木) 19:00:31.77
EXCELファイルを読み込んで、セルのデータを加工するプログラムを作って
いるのですが、文字列、数値、計算式などが入っている普通のファイルなら
期待通り動くのですが、EXCELは多機能ですので、普段全く使ったことが無い
ような機能とか設定がシートやセルなどに追加されていると、自作プログラム
が予期しない動きをするのではないかと思っています。
そのテストの為には、自分でEXCELファイルにいろんな加工を行えば良いわけですが、
自分でも知らないような機能は使うことができません。例えばデータベースとか
テーブルとか、グラフ、フィルターなどなど、まだまだ沢山あります。
そこで質問なのですが、そういうEXCELの機能がてんこ盛りみたいにいろいろ
組み込まれているような何か良いテスト用のファイルって、どこかにありませんか?
0329デフォルトの名無しさん2014/02/20(木) 19:21:36.25
>>319,320,321

""が余計にいるとは知りませんでした。
おかげさまで解決・・・となればよかったんですが
なぜかVookupのあとがCellsだとうまく読み出ししてくれません。

ちゃんと =IFERROR(HYPERLINK(VLOOKUP(Cells(20, 5), $Q$2:$R$10, 2, TRUE)), "")とセルには入っています。
手動でCells(20,5)をE20にすると思った通りの動きになるんですが、なんででしょう?
0330デフォルトの名無しさん2014/02/20(木) 21:17:27.35
>>329
ワークシートでは
Cellsが使えないからエラーになるんじゃないか?
0331デフォルトの名無しさん2014/02/20(木) 21:20:43.09
>>329
そもそもワークシート関数にCellsなんて無いから
0332デフォルトの名無しさん2014/02/21(金) 04:14:19.51
>>329
ワークシート上の数式にCellsは使えないけど、
VBAでは使えるからコード中でCells(20,5)を指定させる事なら出来た。
ただし、絶対参照になっちゃったけど。

Worksheets("データシート").Cells(n1, 6).Formula = "=IfError(Hyperlink(VLookup(" & Cells(20, 5).Address & ", $Q$2:$R$10, 2, True)), """")"

相対参照で書きたければFormulaではなくFormulaR1C1を使えば良いと思う。
0333デフォルトの名無しさん2014/02/21(金) 07:35:53.62
>>328
あなたにプログラムを依頼した人にもらえばよいと思います
0334デフォルトの名無しさん2014/02/22(土) 01:34:21.73
数式の中で参照のあるツールいじるのこえー

シートAのA1に名前A1とつけたとき
$A$1 = 名前A1なのかな?

=A1の相対参照で行列の挿入して参照がずれる
アンチパターンの整理ができてないわ
0335デフォルトの名無しさん2014/02/23(日) 15:56:19.01
ループ処理について質問ですが

Do Until 親 = 20 '20回ループ


   Do Until 子 = 10 '10回ループ
     '子くり返し処理内容
   子 = 子 + 1
   Loop


'親くり返し処理内容
親 = 親 + 1
Loop

このようにネストさせる事は可能なのでしょうか?
とりあえず作ってみたら動きませんでしたが出来ると説明されている解説サイトもあるようで
一体どうやって書けば良いのでしょうか?
0336デフォルトの名無しさん2014/02/23(日) 16:27:41.93
>>335
親の二回目のループで 子 の内容どうなってる?
0337デフォルトの名無しさん2014/02/23(日) 16:31:18.92
親も子もゼロに初期化しないといけないんじゃね?
03383352014/02/23(日) 16:32:17.71
>>336
親の計算結果の数値を子に渡して詳細分析を10パターン行うと言ったないようですが
これってプロシージャをわければ解決でしょうか? そんな気がしてきました。
03393352014/02/23(日) 16:34:27.48
>>337
初期化定義はつけてあります。
0340デフォルトの名無しさん2014/02/23(日) 16:52:35.73
>>338-339
ごたくはいいから >>336 を確認しろよ
0341デフォルトの名無しさん2014/02/23(日) 17:15:19.70
>>335
わからないならコードを削らず貼ろう
0342デフォルトの名無しさん2014/02/23(日) 17:45:19.18
>>340
>>341
チェックしたところ子のループ処理が終了したところでVBAの実行が終了いるようで、、 やはりネストは無理か??
0343デフォルトの名無しさん2014/02/23(日) 17:53:58.08
>>342
ネスト自体はできるよね。
コード見直したがいいっすよ。

Dim Parent As Long
Parent = 0

Do Until Parent = 20
 Dim Child As Long
 Child = 0

 Do Until Child = 10
  Debug.Print Parent & " " & Child
  Child = Child + 1
 Loop

 Parent = Parent + 1
Loop
0344デフォルトの名無しさん2014/02/23(日) 17:54:51.09
>>336
>>340
>>341
なるほど!!親処理1回ごとに子の変数を初期値に戻さないと子の処理がすべてスルーされているわけですね、修正するとばっちり動きました。
超初歩的な間違いでした。。どうもありがとうございました!
0345デフォルトの名無しさん2014/02/23(日) 17:56:18.66
>>343
ありがとうございますm(_ _)m
0346デフォルトの名無しさん2014/02/23(日) 18:03:05.91
>>344
VBA は変数の初期値が決まってるからいいんだけど、こんなケースもあるから明示的に設定した方がいいよ。
あと、今回の場合なら For 〜 Next 使った方がいいと思う。
0347デフォルトの名無しさん2014/02/23(日) 18:29:53.38
>>346
どうしてですか?
03483352014/02/23(日) 18:33:31.05
For 〜 Next  は使った事がありませんが勉強してみます。ありがとうございます。
0349デフォルトの名無しさん2014/02/23(日) 19:26:51.74
>>347
どこを質問してるんだよ...
0350デフォルトの名無しさん2014/02/23(日) 21:43:02.28
>>349
すみません
後半部分についてです
0351デフォルトの名無しさん2014/02/23(日) 21:54:19.10
ループの回数判ってんだろ?
実行時でないと判らないってんなら Do Unti
の方でないとダメだろうけど判ってんなら
For Nextの方が良いに決まってるl
0352デフォルトの名無しさん2014/02/23(日) 21:57:31.13
>>350
今回みたいな初期化漏れや Parent = Parent + 1 の入れ忘れがなくなるから。
0353デフォルトの名無しさん2014/02/23(日) 22:04:00.80
>>351-352
ありがとうございます
ヒューマンエラーを低減させるためにFor〜Nextの方が良い、ということだったのですね
ちょっと深読みしすぎていたようです
0354デフォルトの名無しさん2014/02/24(月) 20:49:02.56
質問です。

複数のインスタンスでExcelが起動していて、それぞれのインスタンスに
未保存の新規ブックがひとつずつ開いています。
これらのブックは未保存のまま、すべてのブックのオブジェクトを取得する方法は
あるのでしょうか?

VBAでできるに越したことはないのですが、別の方法でもOKです。
よろしくお願いします。
0355デフォルトの名無しさん2014/02/25(火) 07:33:56.81
>>354
インスタンスを生成したあと
コレクションに格納しておいて
ループでコレクションの中身を取得するようにしとけば?
0356デフォルトの名無しさん2014/02/25(火) 09:28:04.02
excel2010

vbaの参照設定で一度フォームを使ったら
Microsoft Forms 2.0 Object Library
のチェックを外すこと出来なくなるん?

フォーム使ったら自動でチェックが入るけど、いらなくなったんで
フォームを解放してついでに参照設定のチェックをoffにしようとしたら
「使用中のコントロールまたは参照を削除することはできません。」
って出るんだけど
0357デフォルトの名無しさん2014/02/25(火) 11:01:09.75
>>356
エクセル2000だけどおなじ症状が出てる
0358デフォルトの名無しさん2014/02/25(火) 15:26:49.43
>>356-357
2007で試したけど、保存して開き直したら消えてる
03593562014/02/25(火) 17:00:57.86
こっちは消えないなぁ??

ってか、参照設定を解除するのを教えてもらったんで、それで消しましたた^^;

Sub testRef()
Dim Ref As Object

For Each Ref In ThisWorkbook.VBProject.References
Debug.Print Ref.Name
If Ref.Name = "MSForms" Then
ThisWorkbook.VBProject.References.Remove Ref

End If

Next Ref

End Sub
0360デフォルトの名無しさん2014/02/26(水) 13:49:18.84
Microsoft、「Microsoft Office 2013 Service Pack 1」を公開
ttp://www.forest.impress.co.jp/docs/news/20140226_636988.html
0361デフォルトの名無しさん2014/02/27(木) 13:32:25.19
Excel2007で
www.hatinosu.net/camp/archives/okinawa/
www.hatinosu.net/camp/archives/1200/
こういうページが複数あります (下のURL)
これをExcelの表にまとめてしたいと思っています
場所1 料金1 期間1 関連1 備考1
場所2 料金2 期間2 関連2 備考2
場所3 料金3 期間3 関連3 備考3
場所4 料金4 期間4 関連4 備考4
htmlで表を取り込む方法はわかったのですが
まとめてやる場合はマクロが必要なのでしょうか
参考になるサイトなどありましたらご教示ください
0362デフォルトの名無しさん2014/02/27(木) 14:21:41.96
>>361
ホームページに書いてある内容から必要な部分だけ取り出す方法は色々あるけどVBAを使った方が楽だと思う

ただ、人間の目で必要な部分を探すのは簡単だけど、それをコンピューターに自動でやらせるのはものすごく大変
参考サイトを見た程度でできるような物じゃない

手順としては
(1) URLの一覧を作る
(2) HTMLを読み込む
(3) タグとテキストを解析して必要な情報を取り出す
(4) 取り出したデータをシートに並べる

どれも専門的な知識が必要なんで、どこまでわかっているのか細かく確認しながらじゃないと教えるのも大変
0363デフォルトの名無しさん2014/02/27(木) 14:24:27.05
>>361
ホームページから情報を取り出してワークシートにコピーする例
http://www.happy2-island.com/excelsmile/smile03/capter00721.shtml
0364デフォルトの名無しさん2014/02/28(金) 00:02:45.20
「表示されたGoogleの検索結果一覧から、一番最初の検索結果をクリックする」
という処理はどのようにすればよいでしょうか。

検索結果のページタイトル一覧は
ol#rso > li > div > h3.r > a……(結果毎にli繰り返し)となっていたので、
「ol id="rso"内の、一つ目のh3 class="r"をクリックする」という処理が
できればと思うのです。

i'mfeelingluckyに渡して取得していたのですが、一部直接飛べないものがあり、
このような処理をしたいと思いました。
0365デフォルトの名無しさん2014/02/28(金) 00:27:30.76
>>364
クリックしなきゃいけないの?
aタグのURLをブラウザに直接渡せばいいじゃん
まあGoogleの場合はちょっと文字列の加工が必要だけど
0366デフォルトの名無しさん2014/02/28(金) 23:51:48.43
ユーザーフォームを使って、名簿に入力しようとしましたが、上手くいきません。
デバックしてみると、アプリケーションまたはオブジェクト定義のエラーですと言われWith Cells(Rows.Count, 1).End(x1Up).Offset(1)の部分が黄色く反転しています。
どのように修正するとよいのでしょうか?また、今、シートは中1、中2、中3という名前のシートがあります。
ユーザーフォームで学年を中1を選択した場合には中1のシートに入力(中2、中3も同様に)する場合どのように修正すればよいか教えていただきませんか?
0367デフォルトの名無しさん2014/02/28(金) 23:55:12.51
これがコードです。

Private Sub cmd終了_Click()
Unload Me
End Sub

Private Sub cmd登録_Click()
Dim RowNum As Long


With Cells(Rows.Count, 1).End(x1Up).Offset(1)
.Value = Text生年月日.Value
.Offset(, 1).Vulue = schoolyears.Value
.Offset(, 2).Vulue = Text氏名.Value
.Offset(, 3).Vulue = Textフリガナ.Value
.Offset(, 4).Vulue = Text中学.Value
.Offset(, 5).Vulue = Text郵便番号.Value
.Offset(, 6).Vulue = Text住所.Value
.Offset(, 7).Vulue = Text自宅tel.Value
.Offset(, 8).Vulue = Text生徒携帯.Value
.Offset(, 9).Vulue = Text生徒アドレス.Value
.Offset(, 10).Vulue = Text保護者氏名.Value
.Offset(, 11).Vulue = relations.Value
.Offset(, 12).Vulue = Text保護者携帯.Value
.Offset(, 13).Vulue = Text緊急連絡先.Value
.Offset(, 14).Vulue = Textメールアドレス.Value
.Offset(, 15).Vulue = Text備考ス.Value
End With
End Sub
0368デフォルトの名無しさん2014/02/28(金) 23:56:00.50
Private Sub UserForm_Click()

End Sub

Private Sub UserForm_Initialize()

schoolyears.AddItem "中1"
schoolyears.AddItem "中2"
schoolyears.AddItem "中3"

relations.AddItem "父"
relations.AddItem "母"
relations.AddItem "その他"




End Sub
0369デフォルトの名無しさん2014/03/01(土) 01:27:58.58
>>366
○ XlUp
× X1Up
0370デフォルトの名無しさん2014/03/01(土) 01:37:04.38
デバック
0371デフォルトの名無しさん2014/03/01(土) 01:56:54.39
>>367
○ Value
× Vulue
0372デフォルトの名無しさん2014/03/01(土) 01:58:05.73
>>367
「備考ス」?
03733662014/03/01(土) 02:25:07.81
>>369,>>371
すいません、英語が苦手なもので。

>>372
それは「備考ッス」のタイプミスです。
0374sage2014/03/01(土) 02:28:01.51
>>369
ありがとうございます。初歩以前のミスしてしまいました。
>>370
すいません。
>>371
間違ったものをコピペしてしまったのが原因です(泣)ありがとうございます。
>>372
オブジェクト名確かに変ですね。備考に直しました。ありがとうございます。
0375デフォルトの名無しさん2014/03/01(土) 02:32:30.20
>>373
代わりに(?)フォローしていただきありがとうございます。
0376デフォルトの名無しさん2014/03/01(土) 14:57:19.03
>>365
レスありがとうございます。
現状、i’mfeelinglucky検索で取得ページ移動、表示されているページタイトルとURL取得、
としていたので、VBAもあまり慣れていないため、
クリック動作さえ加えれば問題なくなるかと思ったのですが、難しいものでしょうか。。。
0377デフォルトの名無しさん2014/03/01(土) 16:44:08.18
>>365
レスありがとうございます。
現状、i’mfeelinglucky検索で取得ページ移動、表示されているページタイトルとURL取得、
としていたので、VBAもあまり慣れていないため、
クリック動作さえ加えれば問題なくなるかと思ったのですが、難しいものでしょうか。。。
0378デフォルトの名無しさん2014/03/01(土) 21:17:15.14
漢字に振られているカタカナのふりがなを一気に平仮名に
変換する方法ありますか?出来ればブックの全シートを一気に。
0379デフォルトの名無しさん2014/03/01(土) 21:30:56.91
StrConv
0380デフォルトの名無しさん2014/03/01(土) 22:05:09.76
>377

getElementById('rso').getElementsByTagName('a')[0].click
みたいなことVBAでできないのでしょうか。

それを聞いてるんだよと言うのならスマン。
0381デフォルトの名無しさん2014/03/01(土) 22:58:29.98
>>380
できるよ
0382デフォルトの名無しさん2014/03/02(日) 18:09:03.96
数十のセル範囲を選択してブック1からブック2へコピペする単純なコマンドを作ろうとしていますが

Workbooks("1.xls").Sheets("Sheet1").Range("a1":"z1").Value = Workbooks("2.xls").Worksheets("Sheet1").Range("a1":"z1").Value

このように書くと数値が極端な桁のマイナスになっていたりエラー値に変化しているセルが発生するのですが
元の数値のセルは =c1 =c2 ・・・といったような単純なセル参照の羅列で数値は小数点入りの正数で計算式やらセルの特殊指定は
一切はいってないので何故化ける箇所が発生するのか謎なのですが 原因は何なのでしょうか?
上記のコマンドに xlPasteValues 値を貼り付けの指定を追加するにはどう書けばいいのでしょうか?
0383382 半分自己解決しました2014/03/02(日) 18:54:41.58
>>382
よく見直してみますと元セルの セルの書式設定- 表示形式- 数値 の箇所が
http://homepage3.nifty.com/gakuyu/excel/syosiki2_fig03.gif
小数点ありの負の数値で選ばれていました。
これが原因のようですお騒がせしました
全部が負の数値になっていたらすぐわかるのですがほとんどは正数のままで
所々負の数値に置き換わっているのは謎です
0384デフォルトの名無しさん2014/03/03(月) 07:39:32.84
>>382
値の貼り付けでいいならVariant変数に入れてから貼り付けるのが簡単でいいと思う。
たとえば382の例なら

Dim v As Variant
v = Workbooks("2.xls").Worksheets("Sheet1").Range("a1":"z1")
Workbooks("1.xls").Sheets("Sheet1").Range("a1":"z1") = v

こんな感じ
こっちのほうが普通にコピーするより実行速度も速いらしい
ただし、コピーできるのは値のみ、書式とか数式とかは引き継がれない
03853822014/03/03(月) 20:27:40.83
>>384
素晴らしいですね!的確な回答を頂きましてありがとうございます。助かりましたし勉強になりました。
03863842014/03/03(月) 22:19:34.69
>>382
今更だけど、>>382の式はおかしいよ
ブック1("1.xls")からブック2("2.xls")にコピーするなら
「イコールの右」から「イコールの左」に代入するんだから

Workbooks("2.xls").Sheets("Sheet1").Range("a1":"z1").Value = Workbooks("1.xls").sheets("Sheet1").Range("a1":"z1").Value

だよ
>>382は式の右と左が逆)
0387デフォルトの名無しさん2014/03/03(月) 23:57:40.67
>>384
それって>>382と同じだよ
03883842014/03/04(火) 00:20:39.61
え、そうなの?
Variantに入れると速いってOfficeTANAKAに書いてあったけど
0389デフォルトの名無しさん2014/03/04(火) 07:29:55.48
ネットに書いてあることはすべて真実です
0390デフォルトの名無しさん2014/03/04(火) 08:07:22.59
>>389
>>387もOfficeTANAKAもどっちも「ネットに書いてあること」なんだが?
0391デフォルトの名無しさん2014/03/04(火) 08:25:07.77
>>388
どこのページよ
URL 晒して
0392デフォルトの名無しさん2014/03/04(火) 12:53:57.87
>>390
うん、それを皮肉ったつもりなんだけどわからなかった?
0393デフォルトの名無しさん2014/03/04(火) 20:15:07.96
>>392
うん、それを分かってて茶化したつもりなんだけどわからなかった?
0394デフォルトの名無しさん2014/03/04(火) 21:51:23.58
>>393
うん、さすがにそれは無理がありすぎてわからなかった
0395デフォルトの名無しさん2014/03/04(火) 22:07:20.57
>>394
修行が足りない
0396デフォルトの名無しさん2014/03/05(水) 00:20:10.55
>>388
そう同じ
だから速くはならん
0397デフォルトの名無しさん2014/03/10(月) 00:13:33.22
入力作業中の100メガぐらい有るブックを任意のタイミングで瞬間的にLAN接続された3台のPCで閲覧できるようにすることは可能でしょうか?
現在VBAで別名で保存した場合1回数十秒 LAN経由で開くと応答無しになるのでそれぞれのローカルへコピーして開くと又数十秒かかり
数台へ配布するのになんだかんだ数分ぐらい時間がかかっています。
閲覧側は見れれば何でも良いです。(Excelブック形式だと尚良い)
0398デフォルトの名無しさん2014/03/10(月) 00:35:31.08
>>397
不可能
大量のデータをLAN越しに同時に閲覧したい場合はAccessを使うのが普通
0399デフォルトの名無しさん2014/03/10(月) 00:39:25.86
>>397
数式がてんこ盛り盛りならVBAで全部コピーして値だけ張り付けて別名保存する、ぐらいかな
処理にどのくらいの時間がかかるかは知らんけど

数式がほとんどなくてデータだけで重いのなら画像に出力してPDF化かな
04003972014/03/10(月) 00:55:43.48
>>398
>>399
無理っぽいのですね。ありがとうございます。
データてんこ盛りなのでアクセスやSQLなのでしょうかねぇ 使った事ありませんが、、
0401デフォルトの名無しさん2014/03/10(月) 01:18:59.92
普通の人は100メガの情報は一度にはみれない
ほんとにそのサイズでやり取りする必要があるのか良く考えた方がいいんじゃね
0402デフォルトの名無しさん2014/03/10(月) 06:46:54.06
>>397
ブックの共有じゃダメなの?
そもそも Excel で 100MB って言うのも色々危険な香りがするが...
0403デフォルトの名無しさん2014/03/10(月) 06:57:20.42
>>400
文字データだけならCSVで吐いて
閲覧者がブックを開いたら取り込むとかはどうよ

セル書式は予め設定しておいて、不足なら自動書式で
グラフも置いてあるなら範囲を名前定義にして取り込み時に名前定義をちょろっと修正すればいい

>>402
>LAN経由で開くと応答無しになる
に該当するんじゃないの?しないの?
0404デフォルトの名無しさん2014/03/10(月) 07:46:59.95
>>403
> に該当するんじゃないの?しないの?

共有ブックはもう少し賢いけど、正直 100MB クラスのブックを共有で使ったこと無いから試してみてくれとしか言いようがない。
共有特有のトラブルもあるし。
0405デフォルトの名無しさん2014/03/10(月) 22:22:30.84
まー、あんまり無茶な使い方しない方が無難だよね
0406デフォルトの名無しさん2014/03/10(月) 22:31:12.02
画像貼りまくりでWORDみたいな使い方をしていると想像
せめてシートごとに分割したほうがいいと思うが
変な規定でもあるんだろう
0407デフォルトの名無しさん2014/03/10(月) 22:42:00.56
100MBのファイルコピーするのに数十秒かかるLANってすごいな
それを瞬間的に閲覧するようにできるExcelVBAって万能だな
0408デフォルトの名無しさん2014/03/11(火) 10:45:11.04
>>407
100Mbpsで理論値maxでも100MBをコピーするのに10秒程度かかる。
実効値20Mbps位だったらその5倍かかるわけで、100MBのコピーに2,30秒かかる環境があってもおかしくない。
0409デフォルトの名無しさん2014/03/11(火) 20:16:20.38
>>408
細かいことだけど100Mbpsなら8秒じゃないの?
0410デフォルトの名無しさん2014/03/11(火) 21:30:20.38
>>409
実測してみるとわかるけど、固定IPで他のネット機器をすべて切り離して回線が独占できる状態を作ってやっても
オーバーヘッドがあるから最高でも表示の8割〜9割ぐらいの速度になる

実用に使ってる環境だともっと遅くなる
0411デフォルトの名無しさん2014/03/11(火) 21:44:28.36
>>409
細かい事をいうなら
ネットワーク回線を流れてるのはデータだけじゃない
実データの1バイトが8ビットの情報として流れているとは限らない
0412デフォルトの名無しさん2014/03/11(火) 21:47:49.12
でも論理値maxでって言ってるじゃん
0413デフォルトの名無しさん2014/03/11(火) 22:23:55.06
理論値なんて一番速い時の値だから、無線 LAN なんて理論的にも絶対その値は出ないしな。
0414デフォルトの名無しさん2014/03/11(火) 22:41:58.20
理論値にはいろんな取り方があるからな
ファイル転送の理論値マックスは回線上の理論値マックスからいろんな層のオーバーヘッド分下がるのが当然
0415デフォルトの名無しさん2014/03/15(土) 18:19:11.62ID:wdy6oLTC
VBA初心者ですが
VBAの命令だけを書いた空のブックと、
分析したいデータが書かれたブックを分離して運用することは可能なのでしょうか?

現状データの書かれたブックが数十に同一処理をさすためにそれぞれにVBAを記述していますが
処理方法を変更する場合全ブックの同じVBAコードを書き換えていて手間がかかっています。
ならば空のVBAだけを書いたブックを1つ動かしておけば済むのではと思ったのですが
ここにいらっしゃるプロの方はどうされているのでしょうか?
04164152014/03/15(土) 18:22:17.82ID:wdy6oLTC
>>415
又、空のブックで運用ができるのであればよく使う命令を個別にモジュール化して連携やネストさせるような運用方法も可能なのでしょうか?
これができるとなるとデータの書かれているシートにVBAを書くのは大量のブックを処理する場合は非合理的かと思いましたがどうでしょうか?
0417デフォルトの名無しさん2014/03/15(土) 18:34:24.97ID:IpiW3W82
>>415
> 分離して運用することは可能なのでしょうか?

可能

Excel アドイン 作成 とかでググると幸せになれるかも
04184152014/03/15(土) 18:47:05.31ID:46w16LKJ
>>417
アドイン、、こんな便利な物があったのですね。ありがとうございます。
大幅な合理化が図れそうです
0419デフォルトの名無しさん2014/03/17(月) 04:12:41.18ID:NI0yZz+J
以前こちらでマクロを作っていただき、とても重宝して使わせていただいていたのですが
少し仕様の変更が出てきてしまったため、再度作成か手直しをしていただきたいのですが
お願いできますでしょうか。

以下のマクロで月初から月末の所を、月初から翌月の3日までにしたいのです。
どうか宜しくお願い致します。
0420デフォルトの名無しさん2014/03/17(月) 04:15:10.22ID:NI0yZz+J
Sub SheetCopy()

Dim firstDay As Date
Dim lastDay As Date
Dim targetDay As Date
On Error GoTo Error_Handler

With ThisWorkbook

'月初日を取得
firstDay = .Sheets("1日").Range("B1").Value
'月末日を取得
lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 0)
0421デフォルトの名無しさん2014/03/17(月) 04:18:35.64ID:NI0yZz+J
'月初日のシートは既に存在しているので、
'先にシート名とシート色を設定してしまう。
'.Sheets(Sheet1.Name).Name = Format(.Sheets(Sheet1.Name).Range("B1").Value, "m月d日")
If Not .Sheets("祝日").Cells.Find(firstDay, LookAt:=xlWhole) Is Nothing Or _
Weekday(firstDay) = vbSunday Then
.Sheets("1日").Tab.ColorIndex = 3
End If
0422デフォルトの名無しさん2014/03/17(月) 13:25:21.94ID:vj1XNX0y
>>419-421
これコードの一部分だけだよね?
月末日を保持しているであろう変数"lastDay"をどこで使うのか分からないけど、
(ここに貼られている範囲では月末日を取得してるだけでそれを使用していない)

lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 0)



lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 3)

に変更するだけで翌月3日までにはなる。
ただし、それをどのように利用するのかはこのコード以外の部分に書いてあるので
単純にこれだけでそのコード全体が正常に(あなたの意図した通りに)動くかどうかは分からない。
0423デフォルトの名無しさん2014/03/17(月) 22:24:00.94ID:iQzGYjkh
>>422
やる気のないやつに解釈垂れても意味ないぞ。
そんな解釈より動くコードしか興味ないからコード書けって言ってるんだから。
0424デフォルトの名無しさん2014/03/17(月) 23:26:36.86ID:vj1XNX0y
>>423
いや、別にどんな相手でも良いっすよ
こっちが好き勝手に書いてるだけだし。

ところで、垂れるのは解釈じゃなくて講釈ですね。
0425デフォルトの名無しさん2014/03/18(火) 00:01:33.11ID:YCsGrVX8
すみません419です。
昨日はなぜかエラーが出たあと、バイさるになったまま書き込みができなくなり
続きのコードを貼る事が出来ませんでした。

このあとの続きのコードは、シート名の指定と日祝の色指定のコードになっているのですが
シート名を1日、2日、3日、となるように指定しているため、これだと翌月の3日分が重複してしまうためか
422さんの仰るMonth(firstDay) + 1, 3では、エラーになってしまい上手くいきませんでした。

要は、月初から翌月の3日までのシートを作りたく、その際、日祝を赤字にし
尚且つ各シートのB1セルに○月○日と表示したものを作りたいのですが
何か上手くいく方法はありますでしょうか。
よろしくお願い致します。
■ このスレッドは過去ログ倉庫に格納されています