スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
※前スレ
Excel VBA 質問スレ Part51
http://mevius.2ch.net/test/read.cgi/tech/1510107990/
Excel VBA 質問スレ Part52
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/01/27(土) 20:25:05.67ID:Xe+uGT7T2018/01/31(水) 22:02:51.06ID:QI8wXuam
71デフォルトの名無しさん
2018/01/31(水) 22:13:47.19ID:niw7tDFN >>70
日付型にしてみたけど、やはりダメみたいです。
日付型にしてみたけど、やはりダメみたいです。
72デフォルトの名無しさん
2018/01/31(水) 22:14:33.5173デフォルトの名無しさん
2018/01/31(水) 23:18:11.45ID:q0yM2zae Cells(i + 3, 3).Value = Format(DateValue(年 & "/" & 月 & "/" & 日), "aaa")
2018/02/01(木) 00:24:06.09ID:vMTE7P+w
>>53
クラスモジュールのやつはインスタンスごとに別の実体だからモジュール変数じゃない。
クラスモジュールのやつはインスタンスごとに別の実体だからモジュール変数じゃない。
2018/02/01(木) 08:11:40.86ID:qON5QokW
急いでるとよく間違えるよな。しかも思い込みでミス発見に時間かかかるかる
2018/02/01(木) 19:37:02.10ID:cx2O6kE2
78デフォルトの名無しさん
2018/02/01(木) 19:45:37.17ID:mRcX8hpa >>77
禿乙
禿乙
79デフォルトの名無しさん
2018/02/02(金) 10:09:17.92ID:VDaFhWcz http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/bingo_game.html
すみません このページでダブルビンゴの判定を追加しようと思うのですがうまくいきません。。。
すみません このページでダブルビンゴの判定を追加しようと思うのですがうまくいきません。。。
2018/02/02(金) 10:42:11.74ID:+j1MBhFC
ワシはティンコを2本もっている
2本目はとっておきだ(´・ω・`)b
2本目はとっておきだ(´・ω・`)b
2018/02/02(金) 18:16:54.37ID:ZpXsrnJV
>>80
バケモノじゃねーか
バケモノじゃねーか
82デフォルトの名無しさん
2018/02/02(金) 23:02:56.20 >>79
試してないけどこんな感じかね
・関数の先頭に「Dim cn5 As Integer」を追加
・「cn1 = 0: cn2 = 0」の直前行に「cn5 = (cn1 ¥ 5) + (cn2 ¥ 5)」を追加 (「/」ではなく「¥」)
・「cn3 = 0: cn4 = 0」の直前行に「cn5 = (cn3 ¥ 5) + (cn4 ¥ 5)」を追加
・「End With」の直前行に以下を追加
If cn5 = 5 Then
.Range(cf(k)).Value = "BINGO!!"
Beep
End If
試してないけどこんな感じかね
・関数の先頭に「Dim cn5 As Integer」を追加
・「cn1 = 0: cn2 = 0」の直前行に「cn5 = (cn1 ¥ 5) + (cn2 ¥ 5)」を追加 (「/」ではなく「¥」)
・「cn3 = 0: cn4 = 0」の直前行に「cn5 = (cn3 ¥ 5) + (cn4 ¥ 5)」を追加
・「End With」の直前行に以下を追加
If cn5 = 5 Then
.Range(cf(k)).Value = "BINGO!!"
Beep
End If
83デフォルトの名無しさん
2018/02/02(金) 23:03:49.7784デフォルトの名無しさん
2018/02/08(木) 00:16:22.23ID:MSYeXSpW クロスワードパズル、迷路探索アルゴリズムをExcelVBAで作ることができたので、
今度はテトリス作ってみようと思う。
が、飛躍しすぎ?
キー操作で回転させるとか、→押下で横に移動しつつ落下するとかは、難しそうだな。
タイマとかも張らないといけない?
今度はテトリス作ってみようと思う。
が、飛躍しすぎ?
キー操作で回転させるとか、→押下で横に移動しつつ落下するとかは、難しそうだな。
タイマとかも張らないといけない?
2018/02/08(木) 07:26:16.72ID:XpMtH+Ey
>>84
5年くらい前に作った。
余裕とは言わないけどぷよぷよ作るよりは楽。
タイマーはAPIで見てる。
ブロックはセルに数字を入れて
条件付き書式で着色した。
今作ればクラスの理解があの頃とは全然違うので
多分また違う作りになると思う。
5年くらい前に作った。
余裕とは言わないけどぷよぷよ作るよりは楽。
タイマーはAPIで見てる。
ブロックはセルに数字を入れて
条件付き書式で着色した。
今作ればクラスの理解があの頃とは全然違うので
多分また違う作りになると思う。
2018/02/08(木) 13:17:56.16ID:qQDxntOi
テトリスってWinAPIに慣れるために最初に作るようなヤツだから構造的にはそこまで難しくないだろうな
でもエクセルだと描画速度の問題があるから・・・
でもエクセルだと描画速度の問題があるから・・・
2018/02/08(木) 13:25:02.66ID:f2SIrsod
2018/02/08(木) 19:21:45.57ID:aY4A4Yk1
宣言済みの変数を全て初期化するにはどうしたらいいですか?
2018/02/08(木) 19:31:17.27ID:8qhKGghx
>>88
律儀に全部の変数になにかを代入すりゃいいだけだろ
律儀に全部の変数になにかを代入すりゃいいだけだろ
2018/02/08(木) 19:48:57.07ID:aY4A4Yk1
2018/02/08(木) 19:51:00.94ID:fuTq97cg
>>88
宣言した直後は初期化されてる
マクロの動作がすべて終了したら自動的に初期化される
マクロの動作の途中ですべての変数を初期化したいなら、初期化するプログラムをいちいち書くしかないけど、
それはもともとの設計が悪い、方針がおかしい
宣言した直後は初期化されてる
マクロの動作がすべて終了したら自動的に初期化される
マクロの動作の途中ですべての変数を初期化したいなら、初期化するプログラムをいちいち書くしかないけど、
それはもともとの設計が悪い、方針がおかしい
92デフォルトの名無しさん
2018/02/08(木) 19:52:33.01ID:x393c3Y0 構造体の初期値とかな
2018/02/08(木) 19:53:04.95ID:fuTq97cg
>>90
そもそも初期化漏れってなんだ?たとえば
Dim AAA As Integer
みたいに書いてあると、マクロが実行開始された時点ではAAAは必ず0になってるんだけど
ほかの言語と勘違いしてないか
そもそも初期化漏れってなんだ?たとえば
Dim AAA As Integer
みたいに書いてあると、マクロが実行開始された時点ではAAAは必ず0になってるんだけど
ほかの言語と勘違いしてないか
94デフォルトの名無しさん
2018/02/08(木) 20:07:30.59ID:nI+/jCYy Integerとか使うなよw
2018/02/08(木) 20:12:43.47ID:aY4A4Yk1
設計が悪いのは確かです。私がVBAド初心者の頃から改良・機能追加を繰り返したコードでぐちゃぐちゃしてます。Public変数だらけなんです。
まとめて初期化する方法はなさそうですね、残念ですがレスありがとうございました。
まとめて初期化する方法はなさそうですね、残念ですがレスありがとうございました。
2018/02/08(木) 20:55:54.86ID:XpMtH+Ey
>>93
欲しい初期値がデフォルト値とは限らない
欲しい初期値がデフォルト値とは限らない
2018/02/08(木) 21:31:08.51ID:YcyG5pes
リセットするプログラム組んでおいて呼び出すとか
2018/02/08(木) 21:43:42.80ID:wjl/A/KY
変数のスコープは短い方がメンテナンス性がいいと思います
2018/02/08(木) 21:48:43.16ID:Cj1tzdzh
変数の値なんて必要に応じてセットするもんだろ
なんだよ「全変数初期化」って
プログラミングの基礎からやりなおした方がいい
なんだよ「全変数初期化」って
プログラミングの基礎からやりなおした方がいい
100デフォルトの名無しさん
2018/02/08(木) 21:50:33.84ID:fuTq97cg 初期化するサブルーチンを作れ
101デフォルトの名無しさん
2018/02/08(木) 21:52:16.55ID:nI+/jCYy >>88が必要だと思ったから聞いてんだろw
何を訳のわからん事言ってんだコイツはw
何を訳のわからん事言ってんだコイツはw
102デフォルトの名無しさん
2018/02/08(木) 22:08:53.43ID:aY4A4Yk1103デフォルトの名無しさん
2018/02/08(木) 22:30:18.23ID:gEZZVs8q104デフォルトの名無しさん
2018/02/08(木) 22:47:07.92ID:XpMtH+Ey >>102
ひとこと言わせてもらうと
そもそも「一括で全ての変数を初期化する」と言う
機能が必要になっている時点で多分構成的に
破綻していると思う。
変数を設定する前にどんなプログラムをどんな構成で組むのか、
そのためにはどんなライフサイクルの変数が必要で
スコープはどうするのか
次回から考えて作るようにした方がいい。
もっとも、今そんなことを言っても
多分取り返しのつかないようなコードになっているだろうから
とりあえず一つクラスを作っておいて
今パブリック変数として使っている変数を
そのクラスのプロパティとして移してやって、
生成する際にコンストラクタで初期化してやったら
どうだろうか。
条件によって初期値が変わるのならそのクラス内に
そのためのメソッドを作ってもいいと思う。
あまりいい作りとは言えないけど
そのクラスのインスタンスを
モジュール変数にセットしておいて
初期化したいときは新たに生成したものを
その変数に入れてやればとりあえずは
現状よりはもう少し手が入れやすくなると思う。
ひとこと言わせてもらうと
そもそも「一括で全ての変数を初期化する」と言う
機能が必要になっている時点で多分構成的に
破綻していると思う。
変数を設定する前にどんなプログラムをどんな構成で組むのか、
そのためにはどんなライフサイクルの変数が必要で
スコープはどうするのか
次回から考えて作るようにした方がいい。
もっとも、今そんなことを言っても
多分取り返しのつかないようなコードになっているだろうから
とりあえず一つクラスを作っておいて
今パブリック変数として使っている変数を
そのクラスのプロパティとして移してやって、
生成する際にコンストラクタで初期化してやったら
どうだろうか。
条件によって初期値が変わるのならそのクラス内に
そのためのメソッドを作ってもいいと思う。
あまりいい作りとは言えないけど
そのクラスのインスタンスを
モジュール変数にセットしておいて
初期化したいときは新たに生成したものを
その変数に入れてやればとりあえずは
現状よりはもう少し手が入れやすくなると思う。
105デフォルトの名無しさん
2018/02/08(木) 22:48:28.42 >>102
setvar, letvar, getvar, setarray, letarray, getarray みたいな共通関数を作りましょう。
型ごとに letstrvar, getintvar みたいなのも作っといたほうが便利かな。
まあ大きな関数5〜6個と小さな関数30個くらい実装すれば事足りるでしょう。
既存の g_FooBar, g_Baz みたいなPublic変数へのアクセスを全部 letstrvar("g_FooBar", local_str), local_int = getintvar("g_Baz") のような形式に書き換えましょう。
共通関数の中では、実際の値は巨大な配列に保持して、名前とインデックスを紐付けて管理しましょう。
こうすればグローバル変数の置換は機械的にできるし、変数の初期化も一発です。
健闘を祈ります。
setvar, letvar, getvar, setarray, letarray, getarray みたいな共通関数を作りましょう。
型ごとに letstrvar, getintvar みたいなのも作っといたほうが便利かな。
まあ大きな関数5〜6個と小さな関数30個くらい実装すれば事足りるでしょう。
既存の g_FooBar, g_Baz みたいなPublic変数へのアクセスを全部 letstrvar("g_FooBar", local_str), local_int = getintvar("g_Baz") のような形式に書き換えましょう。
共通関数の中では、実際の値は巨大な配列に保持して、名前とインデックスを紐付けて管理しましょう。
こうすればグローバル変数の置換は機械的にできるし、変数の初期化も一発です。
健闘を祈ります。
106デフォルトの名無しさん
2018/02/08(木) 23:00:19.46ID:aY4A4Yk1 >>103
>>104
レスありがとうございます。
このVBAコードは自分しか使わないし、自分以外がメンテすることはありえないので、
ろくにプログラミングの基本マナーなんてものを勉強しないまま、コード追加追加でわけわからなくなってしまったものです。
自分の書き込みから短時間で、お前のコードの設計が悪いんだとのレスを多く頂いて正直落ち込んでおります・・・
薄々気付いてはいましたが、他の方から指摘されると流石にこたえました。
少しずつ改善していこうと思います。
その上で、>>104をやっていこうと思います。
現時点で>>104の内容は理解できていませんが、なんかすごい貴重なアドバイスなような気がします。参考にさせていただきます。ありがとうございました。
>>104
レスありがとうございます。
このVBAコードは自分しか使わないし、自分以外がメンテすることはありえないので、
ろくにプログラミングの基本マナーなんてものを勉強しないまま、コード追加追加でわけわからなくなってしまったものです。
自分の書き込みから短時間で、お前のコードの設計が悪いんだとのレスを多く頂いて正直落ち込んでおります・・・
薄々気付いてはいましたが、他の方から指摘されると流石にこたえました。
少しずつ改善していこうと思います。
その上で、>>104をやっていこうと思います。
現時点で>>104の内容は理解できていませんが、なんかすごい貴重なアドバイスなような気がします。参考にさせていただきます。ありがとうございました。
107デフォルトの名無しさん
2018/02/08(木) 23:48:09.40ID:XpMtH+Ey >>106
構成に関しては単一責任原則に沿って作れば
上達が早くなると思うので
もし知らなければググってみた方がいいかも。
初期化というのは実はそこそこ奥の深い話で
ファクトリーパターンやファクトリーメソッドとか
ググると色々出てくるのだけれど
かなりObject指向寄りの話になってしまうので
ここではまぁ興味があればということで。
頑張ってくださいね。
構成に関しては単一責任原則に沿って作れば
上達が早くなると思うので
もし知らなければググってみた方がいいかも。
初期化というのは実はそこそこ奥の深い話で
ファクトリーパターンやファクトリーメソッドとか
ググると色々出てくるのだけれど
かなりObject指向寄りの話になってしまうので
ここではまぁ興味があればということで。
頑張ってくださいね。
108デフォルトの名無しさん
2018/02/09(金) 06:47:45.10ID:Oqb9O2xf >>102
> 後からPublic変数を追加した場合、その"リセットするプログラム"も変更の必要ありますよね?
変更すればいいじゃない
そもそも今あるPublic変数はともかく今後もPublic変数バンバン増やしちゃるって思ってるの?
> 後からPublic変数を追加した場合、その"リセットするプログラム"も変更の必要ありますよね?
変更すればいいじゃない
そもそも今あるPublic変数はともかく今後もPublic変数バンバン増やしちゃるって思ってるの?
109デフォルトの名無しさん
2018/02/09(金) 08:10:43.77ID:pONSvQ5P j自分しか使わないってんなら現状使っているのはそのまま置いといて、いい機会だと
思って新たに作るぐらいの気持ちで、「少しずつ改善」なんて小手先のことやらずに1度徹底的
に作り直したほうが良い。
思って新たに作るぐらいの気持ちで、「少しずつ改善」なんて小手先のことやらずに1度徹底的
に作り直したほうが良い。
110デフォルトの名無しさん
2018/02/09(金) 12:00:04.92ID:liPrOEdm グローバル変数、「さっき設定した値を後でまた参照する」的な意味でどうしても必要になることは理解できるけど、
あったとして一つか二つがいいところ。
データセット的なものを配列使わず保持するならたくさん必要になるけど、さすがにそれは配列かコレクション使え。
あったとして一つか二つがいいところ。
データセット的なものを配列使わず保持するならたくさん必要になるけど、さすがにそれは配列かコレクション使え。
111デフォルトの名無しさん
2018/02/09(金) 19:07:16.76ID:pFe+ikyv 毎回初期化が必要なグローバル変数があるならいっそ値をワークシートに保存して管理した方が安全だよな
112デフォルトの名無しさん
2018/02/09(金) 19:29:49.16 誰か>>105を巨大配列じゃなくてワークシートに記録するやり方で実装してください。
113デフォルトの名無しさん
2018/02/09(金) 19:45:27.04ID:mfiNCmZ5 >>105さん渾身のネタ、スベる
114デフォルトの名無しさん
2018/02/10(土) 01:27:55.34ID:UqvxHzys Worksheet_Calculateが頻繁に呼び出され、これが主な処理であるとき
Public変数だらけになったことはある
初心者だから他にもっといい方法があったのかもしれんが
Public変数だらけになったことはある
初心者だから他にもっといい方法があったのかもしれんが
115デフォルトの名無しさん
2018/02/10(土) 04:42:12.40ID:sZXQwMqu でもみんなPublicな変数使ってて怖くない?
標準、あるいはクラスモジュール単位で
作られたメンバ変数が勝手に外部から
書き換えられちゃうんだよ?
しかもブレークポイントにもかからないから
いろんなところから頻繁に書き換えられたら
変な値が入っても犯人探しが大変だし。
前にも書いたけどプロパティにしたり
関数にしたりしてアクセサつけといた方がいいと思うよ。
読み取り専用にも出来るしね。
標準、あるいはクラスモジュール単位で
作られたメンバ変数が勝手に外部から
書き換えられちゃうんだよ?
しかもブレークポイントにもかからないから
いろんなところから頻繁に書き換えられたら
変な値が入っても犯人探しが大変だし。
前にも書いたけどプロパティにしたり
関数にしたりしてアクセサつけといた方がいいと思うよ。
読み取り専用にも出来るしね。
116デフォルトの名無しさん
2018/02/10(土) 05:43:42.77ID:FhCw4HrB マクロの設計にもよるだろうけどグローバル変数使わずに大がかりなマクロ作ったことあるから、
絶対に避けられないというのは疑問だな。
だいたい初期化が必要な時点でグローバル変数にするのは不適当だし。
絶対に避けられないというのは疑問だな。
だいたい初期化が必要な時点でグローバル変数にするのは不適当だし。
117デフォルトの名無しさん
2018/02/10(土) 07:57:32.74ID:vxg4RvSK 初心者あるあるだな
修正や追加を繰り返すうちにコードがスパゲッティになって、変数がどこで書き換えられたか追跡できなくなったもんだから特定のタイミングで一気に初期化したい
すごい手間がかかってるから全面的な書き直しもやりたくない
保守性やモジュール化などの概念がわかってきたところで覚悟を決めて、設計からやり直した方が幸せになれるパターン
修正や追加を繰り返すうちにコードがスパゲッティになって、変数がどこで書き換えられたか追跡できなくなったもんだから特定のタイミングで一気に初期化したい
すごい手間がかかってるから全面的な書き直しもやりたくない
保守性やモジュール化などの概念がわかってきたところで覚悟を決めて、設計からやり直した方が幸せになれるパターン
118デフォルトの名無しさん
2018/02/10(土) 07:57:57.08ID:4c5k2dma おまえらにはグローバル変数は決して悪いものではないという事を知って欲しい
119デフォルトの名無しさん
2018/02/10(土) 12:25:34.71ID:silh4Kun コントロールのイベントプロシージャはプライベートっていう制約があるから
シートと、ユーザーフォーム間のActiveXコントロールで変数の受け渡しをする場合は、パブリック変数を使用するしかいい方法がないと思う
シートと、ユーザーフォーム間のActiveXコントロールで変数の受け渡しをする場合は、パブリック変数を使用するしかいい方法がないと思う
120デフォルトの名無しさん
2018/02/10(土) 12:29:55.88ID:XBpzoSQ/ ワークシートはグローバル変数みたいなもん
印刷さえしなければたいがい便利に使える
印刷さえしなければたいがい便利に使える
121デフォルトの名無しさん
2018/02/10(土) 14:00:23.82ID:7mQmOVGk シートから直接取ればいいのでは??
使い回すにしてもプライベート変数で事足りると思うけど。
パブリックにして読み書き自由にする必要はないんじゃないか?
使い回すにしてもプライベート変数で事足りると思うけど。
パブリックにして読み書き自由にする必要はないんじゃないか?
122デフォルトの名無しさん
2018/02/10(土) 17:52:03.19ID:pkIiHatw rangeオブジェクトを分割して2つのrangeオブジェクトにしたいのですがこれだと値がおかしいので解決方法教えてください
Set obj = Range("a1:b100")
set obj1 = obj.range(obj.cells(1,1),obj.cells(100,1))
set obj2 = obj.range(obj.cells(1,2),obj.cells(100,2))
Set obj = Range("a1:b100")
set obj1 = obj.range(obj.cells(1,1),obj.cells(100,1))
set obj2 = obj.range(obj.cells(1,2),obj.cells(100,2))
123デフォルトの名無しさん
2018/02/10(土) 18:04:50.18ID:o71hUKxM >>122範囲をセットしてるだけで
値をセットしているわけではない
値をセットしているわけではない
124デフォルトの名無しさん
2018/02/10(土) 19:22:41.50ID:+Zdspcyw >>122
objに設定してるセルが存在するシートの参照式が省略されてるけど、シートはActiveSheetでいいの?
あと、obj1とobj2には値を設定してるわけじゃないんだが、値がおかしいってどういうこと?
objに設定してるセルが存在するシートの参照式が省略されてるけど、シートはActiveSheetでいいの?
あと、obj1とobj2には値を設定してるわけじゃないんだが、値がおかしいってどういうこと?
125デフォルトの名無しさん
2018/02/10(土) 21:53:50.67ID:9qCKy78B vbaに関する質問か分からないけど、
他者が作成したexcel vbaマクロの中身をのぞこうとしたら、パスワードがかかって開けなかった。
どうやったらパスワードを特定できる?
他者が作成したexcel vbaマクロの中身をのぞこうとしたら、パスワードがかかって開けなかった。
どうやったらパスワードを特定できる?
126デフォルトの名無しさん
2018/02/10(土) 21:55:42.82ID:Ohg/Tsol >>125
そんなもの他者が特定出来たらパスワードの意味がないだろう
そんなもの他者が特定出来たらパスワードの意味がないだろう
127デフォルトの名無しさん
2018/02/10(土) 21:55:42.88ID:yN3uaIXc >>125
パスかけたやつに聞く
パスかけたやつに聞く
128デフォルトの名無しさん
2018/02/10(土) 22:02:18.01129デフォルトの名無しさん
2018/02/10(土) 22:16:02.76ID:5tf0t1pe >>123-124
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = obj.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = obj.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))
こんな風にした2列選択した後に1列毎のrangeオブジェクトに割り当てようとしています
試しにobj1.Selectとやって範囲を確認してみると関係のないセルが選択されてしまいました
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = obj.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = obj.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))
こんな風にした2列選択した後に1列毎のrangeオブジェクトに割り当てようとしています
試しにobj1.Selectとやって範囲を確認してみると関係のないセルが選択されてしまいました
130デフォルトの名無しさん
2018/02/10(土) 23:02:35.50 >>129
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = obj.Worksheet.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = obj.Worksheet.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = obj.Worksheet.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = obj.Worksheet.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))
131デフォルトの名無しさん
2018/02/10(土) 23:24:31.56 このほうが汎用的なのかな
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = Application.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = Application.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = Application.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = Application.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))
132デフォルトの名無しさん
2018/02/10(土) 23:27:24.03133デフォルトの名無しさん
2018/02/10(土) 23:39:33.30ID:o71hUKxM set obj = nothing
は最後に入れるべきか、
ほったらかしでも問題無いのか
どうなんだろう?
は最後に入れるべきか、
ほったらかしでも問題無いのか
どうなんだろう?
134デフォルトの名無しさん
2018/02/11(日) 00:18:26.88ID:q9UPBdZm おまえらには必要
135デフォルトの名無しさん
2018/02/11(日) 04:53:44.34ID:LDeaRbgm 同じADOでもデルファイのクローズはナッシングだけど、VB系の場合はクローズだよねだいたい
たしかクローズせずにナッシングするとクローズできなくなる
たしかクローズせずにナッシングするとクローズできなくなる
136デフォルトの名無しさん
2018/02/11(日) 08:29:24.42ID:AIGXauyP >>129
例えばC1:D:4を選択した場合
1.obj.Rangeの中で更にobj.Cellsを指定するということは、C列目を基準にC列目を指定をしていることになる。
だからRangeの中にCellsを書く時はobj.Cellsではなく、obj.Worksheet.Cellsが良い。
2.obj1がC1:C4、obj2にD1:D4をセットしたいってことだよな?
obj.Cells(obj.Count / 2, 1)
この書き方だと行数を半分にしているのだがこれは一体・・・
もしC1:F10を指定した場合にC1:D10、E1:F10に分けたいわけじゃないの?
3.可読性が死ぬからRange使うのをやめよう。
範囲指定をする時はResize、Offsetを使ったほうが直感的です。
当初の質問を参考に2の通りだと仮定して
Set obj1 = obj.Resize(, obj.Column / 2)
Set obj2 = obj.Resize(, obj.Column / 2).Offset(,obj.Column / 2)
Objには2列しか選択されない事が確定しているなら
Set obj1 = obj.Resize(, 1)
Set obj2 = obj.Resize(, 1).Offset(,1)
例えばC1:D:4を選択した場合
1.obj.Rangeの中で更にobj.Cellsを指定するということは、C列目を基準にC列目を指定をしていることになる。
だからRangeの中にCellsを書く時はobj.Cellsではなく、obj.Worksheet.Cellsが良い。
2.obj1がC1:C4、obj2にD1:D4をセットしたいってことだよな?
obj.Cells(obj.Count / 2, 1)
この書き方だと行数を半分にしているのだがこれは一体・・・
もしC1:F10を指定した場合にC1:D10、E1:F10に分けたいわけじゃないの?
3.可読性が死ぬからRange使うのをやめよう。
範囲指定をする時はResize、Offsetを使ったほうが直感的です。
当初の質問を参考に2の通りだと仮定して
Set obj1 = obj.Resize(, obj.Column / 2)
Set obj2 = obj.Resize(, obj.Column / 2).Offset(,obj.Column / 2)
Objには2列しか選択されない事が確定しているなら
Set obj1 = obj.Resize(, 1)
Set obj2 = obj.Resize(, 1).Offset(,1)
137デフォルトの名無しさん
2018/02/11(日) 10:16:47.04138デフォルトの名無しさん
2018/02/11(日) 10:18:33.85139デフォルトの名無しさん
2018/02/11(日) 10:29:03.91ID:q9UPBdZm 文献()読んでもわからんからこんな掃き溜めで質問しとんのやろw
ややこしい奴やなあw
ややこしい奴やなあw
140デフォルトの名無しさん
2018/02/11(日) 10:34:27.69 >>139
俺は回答者側や
俺は回答者側や
141デフォルトの名無しさん
2018/02/11(日) 10:37:10.14ID:q9UPBdZm142デフォルトの名無しさん
2018/02/11(日) 10:38:14.38ID:YMxCZLKM ほったらかしで問題ない場合と
そうでない場合があるので
よくわからなければ明示的に
Nothing入れといた方がいい
そうでない場合があるので
よくわからなければ明示的に
Nothing入れといた方がいい
143デフォルトの名無しさん
2018/02/11(日) 10:54:41.06ID:A61Ds/EI >>138
> あ、想像で書いてるどっかのブログとかじゃなくて
> ちゃんとしたMicrosoftの公式文献ね
偉そうにほざく前にMSDNぐらいググれ
https://msdn.microsoft.com/ja-jp/library/cc408924.aspx
> あ、想像で書いてるどっかのブログとかじゃなくて
> ちゃんとしたMicrosoftの公式文献ね
偉そうにほざく前にMSDNぐらいググれ
https://msdn.microsoft.com/ja-jp/library/cc408924.aspx
144デフォルトの名無しさん
2018/02/11(日) 10:58:29.29 >>143
どこにobj.Rangeの引数としてobj,Cellsが指定された場合の解釈のされ方が書いてあるの?
どこみてもActiveSheet.Rangeの引数として使ってる例ばっかりだし、内部的にどういう形式に変換されてるのか全然読み取れないんだわ
どこにobj.Rangeの引数としてobj,Cellsが指定された場合の解釈のされ方が書いてあるの?
どこみてもActiveSheet.Rangeの引数として使ってる例ばっかりだし、内部的にどういう形式に変換されてるのか全然読み取れないんだわ
145デフォルトの名無しさん
2018/02/11(日) 11:40:12.40ID:A61Ds/EI146デフォルトの名無しさん
2018/02/11(日) 11:49:28.10147デフォルトの名無しさん
2018/02/11(日) 12:24:58.11ID:A61Ds/EI そう思いたいならそれでいいんじゃね w
148デフォルトの名無しさん
2018/02/11(日) 12:56:24.79ID:AIGXauyP >>137
公式文献は知らないがそういうもんだと納得している。
想像()とか、こんなくらい知ってるわヴォケとか言われそうだが
set ws = Worksheets(1)があると仮定して。
これはどれもRange("B2")への参照を示すわけだが
ws.Cells(2,2)
ws.Cells(2,2).Cells(1,1)
ws.Cells(2,2).Range("A1")
CellsとかRangeは同一ワークシート内であれば、いくらでも参照先を変更できる。
例えばこれはどれもRange("C3")への参照。
B2を基準(1,1)として(2,2)を見ていることになるからだ。
ws.Cells(2,2).Cells(2,2)
ws.Cells(2,2).Range("B2")
ws.Range(ws.Cells(2,2).Range("B2"))
問題の件はobjに既にRangeが格納されているからわかりづらいが
Set obj = ws.Range("B2") の場合に
obj.Range(ws.Cells(2,2)) というのは
ws.Range("B2").Range(ws.Cells(2,2)) ってことだよね
単一セルの場合はws.Range("B2").Cells(2,2)と同一の結果になる。
範囲の場合も考え方は同じだがRange(a,b)でaとbに範囲を渡した場合
aとbを合わせた領域の最端の範囲を示すのは言わずもがな。
結局のところ何も難しい話ではなくて、Offsetの相対指定とResizeの範囲指定を同時にできるのがRangeだっていう話に戻る。
普段ws.Range("A1")と書いているものは、実はws.cells(1,1).Range("A1")の省略形だって考えて俺は納得した。
公式文献は知らないがそういうもんだと納得している。
想像()とか、こんなくらい知ってるわヴォケとか言われそうだが
set ws = Worksheets(1)があると仮定して。
これはどれもRange("B2")への参照を示すわけだが
ws.Cells(2,2)
ws.Cells(2,2).Cells(1,1)
ws.Cells(2,2).Range("A1")
CellsとかRangeは同一ワークシート内であれば、いくらでも参照先を変更できる。
例えばこれはどれもRange("C3")への参照。
B2を基準(1,1)として(2,2)を見ていることになるからだ。
ws.Cells(2,2).Cells(2,2)
ws.Cells(2,2).Range("B2")
ws.Range(ws.Cells(2,2).Range("B2"))
問題の件はobjに既にRangeが格納されているからわかりづらいが
Set obj = ws.Range("B2") の場合に
obj.Range(ws.Cells(2,2)) というのは
ws.Range("B2").Range(ws.Cells(2,2)) ってことだよね
単一セルの場合はws.Range("B2").Cells(2,2)と同一の結果になる。
範囲の場合も考え方は同じだがRange(a,b)でaとbに範囲を渡した場合
aとbを合わせた領域の最端の範囲を示すのは言わずもがな。
結局のところ何も難しい話ではなくて、Offsetの相対指定とResizeの範囲指定を同時にできるのがRangeだっていう話に戻る。
普段ws.Range("A1")と書いているものは、実はws.cells(1,1).Range("A1")の省略形だって考えて俺は納得した。
149デフォルトの名無しさん
2018/02/11(日) 13:17:28.48ID:A61Ds/EI >>148
素直な君には正解を教えてあげる w
For example, if the selection is cell C3, Selection.Cells(2, 2) returns cell D4
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-item-property-excel
素直な君には正解を教えてあげる w
For example, if the selection is cell C3, Selection.Cells(2, 2) returns cell D4
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-item-property-excel
150デフォルトの名無しさん
2018/02/11(日) 16:48:17.26 >>148
ありがとう。
結局、想像でしかないけど、
obj.Range(obj.Cells(x, x), obj.Cells(x, x))
を独自関数
SelectionRangeCells(obj, obj.Cells(x, x), obj.Cells(x, x))
に置き換えると、こんな感じのことをしているのかね。
Function SelectionRangeCells(ByRef rng As Range, ByRef cell1 As Range, ByRef cell2 As Range) As Range
Dim startRow As Long
Dim endRow As Long
Dim startColumn As Long
Dim endColumn As Long
startRow = WorksheetFunction.Min(cell1.Row, cell2.Row)
endRow = WorksheetFunction.Max(cell1.Row, cell2.Row)
startColumn = WorksheetFunction.Min(cell1.Column, cell2.Column)
endColumn = WorksheetFunction.Max(cell1.Column, cell2.Column)
Set SelectionRangeCells = rng.Resize(endRow - startRow + 1, endColumn - startColumn + 1).Offset(startRow - 1, startColumn - 1)
End Function
obj.Range("A1")という形式の場合は公式ドキュメントに明確に書かれてるね。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/range-range-property-excel
obj.Range(obj.Cells(x, x), obj.Cells(x, x))
の場合はobj.Cells(x, x)が実体セルを指していてobjとの相対位置も分かってるわけだから
Rangeプロパティ内で相対参照を算出する実装方法も考えられるしそのほうが使う側は分かりやすいはずだけど
そう実装していないという明確な記述がどこにもなかったから実際に動かしてみての想像しかできなかった。
(ちなみに>>149がなにやら勘違いしているようだがCells(x, x)【Cells._Default(x, x)】が何を返すかを知りたかったわけではない)
ありがとう。
結局、想像でしかないけど、
obj.Range(obj.Cells(x, x), obj.Cells(x, x))
を独自関数
SelectionRangeCells(obj, obj.Cells(x, x), obj.Cells(x, x))
に置き換えると、こんな感じのことをしているのかね。
Function SelectionRangeCells(ByRef rng As Range, ByRef cell1 As Range, ByRef cell2 As Range) As Range
Dim startRow As Long
Dim endRow As Long
Dim startColumn As Long
Dim endColumn As Long
startRow = WorksheetFunction.Min(cell1.Row, cell2.Row)
endRow = WorksheetFunction.Max(cell1.Row, cell2.Row)
startColumn = WorksheetFunction.Min(cell1.Column, cell2.Column)
endColumn = WorksheetFunction.Max(cell1.Column, cell2.Column)
Set SelectionRangeCells = rng.Resize(endRow - startRow + 1, endColumn - startColumn + 1).Offset(startRow - 1, startColumn - 1)
End Function
obj.Range("A1")という形式の場合は公式ドキュメントに明確に書かれてるね。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/range-range-property-excel
obj.Range(obj.Cells(x, x), obj.Cells(x, x))
の場合はobj.Cells(x, x)が実体セルを指していてobjとの相対位置も分かってるわけだから
Rangeプロパティ内で相対参照を算出する実装方法も考えられるしそのほうが使う側は分かりやすいはずだけど
そう実装していないという明確な記述がどこにもなかったから実際に動かしてみての想像しかできなかった。
(ちなみに>>149がなにやら勘違いしているようだがCells(x, x)【Cells._Default(x, x)】が何を返すかを知りたかったわけではない)
151デフォルトの名無しさん
2018/02/11(日) 17:24:07.93ID:A61Ds/EI152デフォルトの名無しさん
2018/02/11(日) 17:54:51.66ID:q9UPBdZm153デフォルトの名無しさん
2018/02/11(日) 18:02:54.57ID:zWT4td5V メゾット君も負けを認められるほど成長したかと感心したもののレス見ると何で勝利宣言してんのか分からなかった
154デフォルトの名無しさん
2018/02/11(日) 21:45:11.45ID:jnjDiTfu 今回の使い方は良いのか悪いのか
ちょっと判断つきかねるなぁ
可読性がちょっとね
扱い方そのものは悪いとは思わない
書いてる人も気付いているか分からないけど
やってることはデコレータパターンの
それにかなり近いんだよね
洗練されればそれなりに便利かも知れないね
ちょっと判断つきかねるなぁ
可読性がちょっとね
扱い方そのものは悪いとは思わない
書いてる人も気付いているか分からないけど
やってることはデコレータパターンの
それにかなり近いんだよね
洗練されればそれなりに便利かも知れないね
155デフォルトの名無しさん
2018/02/11(日) 22:48:44.70ID:49jQhb5f タスクスケジューラで、Private Sub Workbook_Open()、の記述のあるブックを開くと、
Private Sub Workbook_Open()が実行されるときもあれば、実行されないときもある。
なんでなんだろ?
その違いが今のところ掴めないでいるんですが、どなたか何か情報をお持ちではないですか?
Private Sub Workbook_Open()が実行されるときもあれば、実行されないときもある。
なんでなんだろ?
その違いが今のところ掴めないでいるんですが、どなたか何か情報をお持ちではないですか?
156デフォルトの名無しさん
2018/02/11(日) 23:09:13.81ID:S5L6PYJ0157デフォルトの名無しさん
2018/02/11(日) 23:28:58.59ID:49jQhb5f >>156
ユーザーがログオンしているときのみ実行する、にチェックが入っていますので違うと思います。
念のため、紹介してもらったサイトに従いフォルダを作成しましたがそれでも変わらずです。
他に情報ありましたらお知らせください。ありがとうございました。
ユーザーがログオンしているときのみ実行する、にチェックが入っていますので違うと思います。
念のため、紹介してもらったサイトに従いフォルダを作成しましたがそれでも変わらずです。
他に情報ありましたらお知らせください。ありがとうございました。
158デフォルトの名無しさん
2018/02/12(月) 07:06:15.59ID:Mlpgnb6c159デフォルトの名無しさん
2018/02/12(月) 08:05:14.90ID:xQy5Bsyb あほやなあオープンマクロが動かんのはオープンしとらんからにきまっとるんやがw
160デフォルトの名無しさん
2018/02/12(月) 08:30:35.08ID:F3ZoN7fb >>157
> 他に情報ありましたらお知らせください。ありがとうございました。
て言うかまずお前が情報書けよ
> ユーザーがログオンしているときのみ実行する、にチェックが入っていますので違うと思います。
なんて後から言われても困る
> 他に情報ありましたらお知らせください。ありがとうございました。
て言うかまずお前が情報書けよ
> ユーザーがログオンしているときのみ実行する、にチェックが入っていますので違うと思います。
なんて後から言われても困る
161デフォルトの名無しさん
2018/02/12(月) 10:49:27.81ID:fd37PB9t スケジュールで走らせるのが目的なら
イベントにたよらなくても
VBSからVBAのプロシージャを直で指定して呼べた気がする
でVBSの方をスケジューラーに登録しておく
ググれば方法が見つかると思うのでお試しあれ
イベントにたよらなくても
VBSからVBAのプロシージャを直で指定して呼べた気がする
でVBSの方をスケジューラーに登録しておく
ググれば方法が見つかると思うのでお試しあれ
162デフォルトの名無しさん
2018/02/12(月) 11:56:54.51ID:ovw7+iFl >>86
おまえはどんなショボいPCを使っているのか?Windows95でCPUは486DXか?
おまえはどんなショボいPCを使っているのか?Windows95でCPUは486DXか?
163デフォルトの名無しさん
2018/02/12(月) 12:41:45.34ID:F3ZoN7fb >>161
COM経由で操作するなら似たようなもん
COM経由で操作するなら似たようなもん
164デフォルトの名無しさん
2018/02/12(月) 14:28:15.32ID:RHpKon14 へーsystemアカウント用のDesktopフォルダ作るのか
なるほどね
なるほどね
165デフォルトの名無しさん
2018/02/15(木) 10:49:13.30ID:n3ZAbmwK VBE起動したあとVBEのウィンドウを最大化するんだけど、
ブックを閉じてVBEを開くと小さいウィンドウで開くから、また最大化する・・・のが面倒なんですが、
前回終了時のウィンドウサイズを記憶させることってできます?
ブックを閉じてVBEを開くと小さいウィンドウで開くから、また最大化する・・・のが面倒なんですが、
前回終了時のウィンドウサイズを記憶させることってできます?
166デフォルトの名無しさん
2018/02/15(木) 12:06:52.20ID:tgIxQ6Uj167デフォルトの名無しさん
2018/02/17(土) 18:05:06.20ID:XvsvycnR vbaで正規表現書いていたのですが(?:)って使えないんでしょうか?
キャプチャして欲しくない部分が結果に混ざるのでできれば最初から消しておきたいんですが
結果に対して処理するしかないんですかね
キャプチャして欲しくない部分が結果に混ざるのでできれば最初から消しておきたいんですが
結果に対して処理するしかないんですかね
168デフォルトの名無しさん
2018/02/17(土) 18:26:45.53ID:DOQJ47ER >>167
いま手元に環境ないから試せないけどRegExp (Microsoft VBScript Regular Expressions 5.5)使ってるなら使えるはずだが...
いま手元に環境ないから試せないけどRegExp (Microsoft VBScript Regular Expressions 5.5)使ってるなら使えるはずだが...
169デフォルトの名無しさん
2018/02/17(土) 18:39:43.21 >>167
普通にキャプチャしてSubMachesで必要な部分だけ取り出せばいい
普通にキャプチャしてSubMachesで必要な部分だけ取り出せばいい
170デフォルトの名無しさん
2018/02/17(土) 20:20:00.39ID:XvsvycnR できました
ありがとうございました
ありがとうございました
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★3 [ぐれ★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 青銅聖闘士のパンチは音速←わかる 白銀聖闘士はその数倍←まぁわかる 黄金聖闘士は光速←は?
- 4時だから窓から4回ちんこ出した
- クマどもが冬眠拒否
- さわやかって
- 紅しょうが大量に入れるやつwwwwwwwww
- そろそろみんなが忘れてそうなこと
