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

Excel VBA 質問スレ Part36 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/01/09(金) 16:59:02.80ID:GzFHQ3J4
ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Applications』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

前スレ:Excel VBA 質問スレ Part35
http://peace.2ch.net/test/read.cgi/tech/1414186311/

関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0449デフォルトの名無しさん2015/02/16(月) 18:49:26.10ID:H/rtMJFz
>>448
> 数セルに分ける
しかないですかね・・・
問題は文章中に改行もあるので、固定値で区切って次のセルに流すと、文の途中で
改行されてしまうので、ある程度の文字数で改行のある区切りを検査して切り分けて
それをセルに順次分けて流し込む ような感じでしょうか・・・
あとは#になる仕様(バグ?)対策に、書式設定を文字列ではなく標準にしないとでしょうか

ただ、流し込む枠(印刷レポートの書式)が既に運用されていて変更できないので、
文字数にあわせて文字サイズとさらに分けているセルの高さも考慮してはめ込まなければならない上に
文字サイズを調整した文章に、さらに枠全体に配置するために垂直の均等割り当てをしていたのですが、
複数のセルにまたがるとなるとそれもできないですね・・・ 困りました・・・orz
0450デフォルトの名無しさん2015/02/16(月) 19:51:35.23ID:GvyW2zIK
shapeでもだめなんだっけ?
0451デフォルトの名無しさん2015/02/16(月) 20:58:57.53ID:xdM8JK5o
>>449
でっかいラベルをシートに置いて、そこに表示させれば?
ページが分かれる可能性があるなら幾つも作っておくとか
セルほどの柔軟性はなくなるけど、まぁなんとかなるんじゃないか
コードはこんな感じ
ActiveSheet.DrawingObjects("ラベル 1").Text = "テキスト内容"
0452デフォルトの名無しさん2015/02/16(月) 21:38:57.85ID:dgZM3/Bj
チェンジイベントでヴァリデーション使って黄色い小窓をだせば?
0453デフォルトの名無しさん2015/02/16(月) 21:39:47.72ID:x+zyA1Lt
既に運用している印刷レポートって、Access?
0454デフォルトの名無しさん2015/02/17(火) 00:12:30.43ID:146t/jKa
>>449
複数セルを結合して使っちゃダメなの?
0455デフォルトの名無しさん2015/02/17(火) 01:35:26.10ID:lrt7cu1f
プロシージャは役割ごとに細かく分けたほうがいいと言うので
おおもとのプロシージャAからプロシージャBを抜き出しそれをAから呼び出すことにしました。

しかしここで問題が。

BにはAで使ってた変数がたくさんあります。
でもAとは分裂してしまったのでAへのたくさんの変数の参照ができなくなりました。
こういうのって、どうやって解決するのが定番なのですか?
まさかAの変数をすべてグローバルにするの?
グローバル変数というのも使わないほうがいいと言うので困っています。
0456デフォルトの名無しさん2015/02/17(火) 04:05:11.02ID:X2MoRgQW
>>455
ggrks
VBA 変数 スコープ
0457デフォルトの名無しさん2015/02/17(火) 05:33:38.22ID:or7h50KG
>>455
グローバルはpublic、モジュール内全体はprivate、プロシージャ内はautoと三種の参照範囲があるから、それで頑張るくらいかな

VBAで小規模なら細かく分ける必要も無いと思うけど
0458デフォルトの名無しさん2015/02/17(火) 07:19:27.06ID:9NYC6Wy0
>>449
出力エリアがきまってるなら、それに収まる程度に入力を制限するのが普通だろ

>>455
役割ごとにちゃんと分割できてれば、Bの役割に必要な情報をBへの引数で渡すのが一般的
もしBが大量の(A内の)変数を見ないとダメなら、そもそもの機能分割がちゃんとできてない
0459デフォルトの名無しさん2015/02/17(火) 08:52:30.90ID:4e4VuLTt
>>454
結合すれば1024を超えて表示が可能でしょうか?
今のところ2セルを結合しています

>>458
エリアが決まっているので文字数で文字サイズに応じて調整+均等割り付けで
体裁を整えるというように組んでいますが、
業務上、何文字以内という制限を設けるわけにはいかないので・・・
もともとワードでやっていたのですが、文字数のばらつきが多く、
あまりPCに詳しくない利用者が文字サイズや行間の調整ができないので
自動で全てまかなう為にフォームで入れさせて印刷するために設計してます
0460デフォルトの名無しさん2015/02/17(火) 09:51:43.90ID:CCisoKxZ
Excelは諦めた方が早い気がします。
0461デフォルトの名無しさん2015/02/17(火) 11:31:05.37ID:X2MoRgQW
まだ始めてないのが幸い
0462デフォルトの名無しさん2015/02/17(火) 11:56:41.84ID:LFQwlpnt
>>455
イメージと実態が異なってるかもしれないので聞きたいんだけど、
・元のプロシージャは大体何行くらいか?
・たくさんの変数って大体何個くらいか、配列は使っているか?
04634592015/02/17(火) 12:11:55.22ID:GkDdPpGy
>>460
そんな殺生なorz

古いPC引っ張り出してExcel2007で試してみたんですが、
確かに書式設定を「文字列」にすれば2000字くらい入れたセルは
########と表示されるんですが、「標準」にしてあげれば
表示されるんですが、どういうことでしょう

文字サイズを小さくして1セル内に入りきる調整はいりますが、
入ってしまえば1024も軽く超えて表示できてますし、プレビューでも表示できてる
0464デフォルトの名無しさん2015/02/17(火) 12:14:07.07ID:GkDdPpGy
ちなみに「折り返して表示」のチェックを入れてあります
0465デフォルトの名無しさん2015/02/17(火) 15:49:10.19ID:875KssuY
すでに決まってる印刷範囲がどんなもんかわからんけど
1行の文字数上限決めて、上限超えた文字は下の行に強制改行していけばいいんじゃねーの?(鼻ほじ

あとは WordVBA で範囲内の書式をクリアするってのがあるから
逆に範囲内の書式を設定することできるんじゃね?
Word持ってない・使ったことないから詳しくは知らんけど
0466デフォルトの名無しさん2015/02/17(火) 17:08:53.70ID:ScAGgWPE
初かきこみです。
excelのuserformで作成してみたのですが、よくわからなくて。
オプションボタンをクリックするとコンボボックスの選択していたrowsourceが出てくるのですが。

そこで出てきたコンボボックスの値を確定ボタン(コマンドボタン)をクリックしたときにB2に打ち込まれるようにしたくて打ち込まれたら次のB3、b4という感じに繰り返して、閉じるボタンを押すまで打ち込める状態にしたいのですが。

どういう関数なら打ち込めるのかわかりません。長文&説明下手なのでよくわからないかもですが、教えてください
0467デフォルトの名無しさん2015/02/17(火) 18:05:57.87ID:jRndRgSB
DTMの人?
0468デフォルトの名無しさん2015/02/17(火) 20:50:40.68ID:MwEIMFRH
>>457
> プロシージャ内はauto

いつの間にそんなもんが
0469デフォルトの名無しさん2015/02/17(火) 23:48:47.02ID:6KvLI8HS
>>468
古い知識(auto変数)で書いたんだけど、プロシージャ内のdimは正式には何て言うの?
0470デフォルトの名無しさん2015/02/17(火) 23:50:19.47ID:wuWlXvwR
VBA初心者ですが
セルへのアクセスを減らすとスピードが速くなるという書き込みを過去コメントで見ましたが
Dim で変数を定義していくとして実用範囲で最大何個ぐらいまで定義できるのでしょうか?
今構想中の計画では2500必要であることがわかったのですが2500個定義することは可能なのでしょうか?
詳しい方いらっしゃいましたら宜しくお願い致します。
0471デフォルトの名無しさん2015/02/17(火) 23:55:06.61ID:6KvLI8HS
>>470
その変数のサイズ×配列数が2GB内
0472デフォルトの名無しさん2015/02/18(水) 00:00:43.15ID:0d8GWwAd
>>471
2000MBの2GBですか?でしたら膨大ですね。 
定義するのは桁数の少ない自然数なので2500個は全く問題無さそうですね。
ありがとうございます。
0473デフォルトの名無しさん2015/02/18(水) 00:29:38.42ID:FooM0Je6
>>469
古いも新しいもVBAやVBにauto変数なんてないわ
VBAでの変数のスコープは一般的にはプロシジャ(プライベート)、モジュール、パブリックだ
正確にはヘルプの「適用範囲と参照可能範囲の概要」みると
>プロシージャ レベル、プライベート モジュール レベル、およびパブリック モジュール レベルがあります
って書いてあるがな
0474デフォルトの名無しさん2015/02/18(水) 00:30:26.31ID:LcW7LB/I
初歩的な質問なのかもしれませんが、お願いします。
いくつかの数値を纏めて格納する 方法として、リスト()形式と、コレクション形式というのがあると聞きました。
格納が終わったあとで、入っている数値を、昇順に並べ替えて取り出したい場合は、どうすれば上手くやれるでしょう?
たとえば、1を格納、5を格納、3を格納、とやった後に、「135」と並べ替えて出力したい場合などです。

よろしくお願いします。
0475デフォルトの名無しさん2015/02/18(水) 00:43:05.77ID:FooM0Je6
>>474
リスト()形式って何か知らんが
VBAにそのような機能はありません
自作するか、エクセルシートで代用するか、外部ライブラリ使うかして下さい
0476デフォルトの名無しさん2015/02/18(水) 01:24:18.41ID:hnIb3krl
Dim i As Integer
For i = 1 To 100
Dim j As Integer

Next i

のようにForブロック内で宣言した変数jは
Forブロックの外でも使えますか?
0477デフォルトの名無しさん2015/02/18(水) 01:47:08.51ID:FooM0Je6
>>476
宣言より後なら使える
0478デフォルトの名無しさん2015/02/18(水) 04:20:36.63ID:qJod6Zoi
>>474
配列にソートという関数は無いの?

Rubyで言うと、Arrayクラス.sort
0479デフォルトの名無しさん2015/02/18(水) 08:22:38.53ID:yLcFaQ17
>>478
ない

VBAって参照を返せないのがなんとも不便だよなあ。ByRefで受け取った大きな配列をByRefで出力する方法はないものか。
これがあればパイプ処理できるのに。
0480デフォルトの名無しさん2015/02/18(水) 08:44:07.09ID:Lm/UpLLW
>>469
ローカル変数でいいでしょ
特定の言語 (C/C++) の用語使うより全然マシ
0481デフォルトの名無しさん2015/02/18(水) 08:57:16.29ID:mZTAkLE5
>>479
自作するしかないね
0482デフォルトの名無しさん2015/02/18(水) 09:00:07.27ID:Lm/UpLLW
>>479
> ByRefで受け取った大きな配列をByRefで出力する方法はないものか。

同じ配列なら返さなくてもいいように思うが...

Variant 型は実質参照みたいなもんだから、これじゃダメ?

Sub T()
Debug.Print F()(55)
End Sub

Function F() As Variant
Dim A(100) As Intger
A(55) = "松井"
F = A
End Function
0483デフォルトの名無しさん2015/02/18(水) 10:19:46.66ID:yLcFaQ17
>>482
配列に対する操作を繋げたいんですよ。
func2(func2(func1(matrix)))
とやるとmatrixの3ヵ所が変更されるみたいに。
そのたびに新しく配列を作って返すんじゃ効率が悪いから、副作用ありで繋げる処理を書きたい。
0484デフォルトの名無しさん2015/02/18(水) 11:41:15.32ID:yLcFaQ17
間違えた
func2(func2(func1(matrix)))じゃなくて
func3(func2(func1(matrix)))
0485デフォルトの名無しさん2015/02/18(水) 11:41:27.73ID:Yek5NpLy
逆じゃね?
他の言語は知らんけど
VBAでは配列変数はByRefでしか受け渡し出来ないんじゃなかったっけ?
0486デフォルトの名無しさん2015/02/18(水) 11:48:28.31ID:QJoLg/2B
なんで
func1(matrix)
func2(matrix)
func3(matrix)
って書きたくないのかがわからん。
こっちのがどういう順番で何やってるか一目瞭然なのに。
0487デフォルトの名無しさん2015/02/18(水) 11:51:14.19ID:yLcFaQ17
それともうひとつ言うと、for each で取る要素が参照じゃないのが不満。
x = x * 2 という式で各要素を2倍するなんてことができない。
そこをあきらめて y = x * 2 として別な配列に入れようと思っても、実際にやろうとすると y(i, j) って
書かなきゃならないが i と j を動かすスマートな方法がない。
0488デフォルトの名無しさん2015/02/18(水) 11:57:49.28ID:yLcFaQ17
>>485
受け取るときはByRefにすればいいんだけど、関数からreturnするときはコピーが作られちゃうんですよ。
出した例でいうと、func1した結果は引数matrixに反映されるけど、後続処理はコピーに対する処理となるので反映されないです。
0489デフォルトの名無しさん2015/02/18(水) 12:12:57.43ID:a8UdE6sd
もうVBAは捨ててrubyとかpythonとかで外からole操作した方がいいよ
俺はそうしてる
とても捗ってる
0490デフォルトの名無しさん2015/02/18(水) 12:15:29.32ID:yrCv40dm
じゃあ何でこの板にいるんだ
0491デフォルトの名無しさん2015/02/18(水) 12:16:44.52ID:a8UdE6sd
こいつらわざわざVBAで馬鹿なことやってんなーって眺めるため
0492デフォルトの名無しさん2015/02/18(水) 12:18:55.27ID:yLcFaQ17
>>491
たいていの処理を使い捨ての一行プログラムでこなせたりする?
0493デフォルトの名無しさん2015/02/18(水) 12:26:58.19ID:BIe8ociq
なんとなく想像するとクラスモジュールで実現できそうだが、今Linuxなんで試せないわw
あれは自己参照かけるかな?

それはわからんが、できそうなのは配列の全要素を格納が期待できるバッファを用意して足らない部分を動的に確保する。

もうひとつはモジュール単位のproperty let get、と一時オブジェクトは避けられないかもしれんが、
setでargs + objectオブジェクトに参照をもたせるくらいか?

いずれにせよfortranのような参照がモダンな言語で無いのはほとんどの場合において資産。
0494デフォルトの名無しさん2015/02/18(水) 12:27:29.75ID:zPrNzJwI
不満だったら使うな
それで終わりだろ?
0495デフォルトの名無しさん2015/02/18(水) 12:28:28.19ID:a8UdE6sd
>>492
rubyだと

app.Selection.each{|cell| cell.Value = "hoge" if cell.Value =~ /hu*ga*/}
で選択範囲の"huuuuugaaaaa"を"hoge"にしたりとか色々
OLEで提供されてるオブジェクトはメソッド、プロパティ含めてほぼ制限なく使える

あと [1,3,6,2].sort とかも当然できるぞ!!
0496デフォルトの名無しさん2015/02/18(水) 12:35:51.08ID:yLcFaQ17
>>495
それをどこから(どういう環境から)実行するの?
対話的に実行できる?
0497デフォルトの名無しさん2015/02/18(水) 12:36:13.41ID:YbJdAwW+
はいはいruby最強
0498デフォルトの名無しさん2015/02/18(水) 12:48:44.92ID:a8UdE6sd
>>496
irbっていう対話環境が標準で用意されてるからそこから操作できる
もちろんスクリプトファイルを作って実行もできる

具体的にコード書いちゃうと
require 'win32ole' #OLE操作のためのライブラリ読み込み
app = WIN32OLE.connect('Excel.Application') #今開いているExcelのApplicationオブジェクトを取得

あとは煮るなり焼くなり>>495だったり

この辺参考になるはず
http://magazine.rubyist.net/?0027-ExcellentRuby
http://www.boddie.org.uk/python/COM.html
0499デフォルトの名無しさん2015/02/18(水) 12:51:26.25ID:a8UdE6sd
まあフォーム作ったりは難しいし
Excelで完結しないから他人に配布するとかの用途には不向きだね
書き捨てのちょっとしたマクロには最適
0500デフォルトの名無しさん2015/02/18(水) 13:39:13.16ID:QJoLg/2B
書き捨てのちょっとしたマクロなら、VBEで書いた方が圧倒的に楽なんじゃないの?
0501デフォルトの名無しさん2015/02/18(水) 13:41:20.01ID:QJoLg/2B
あと、遅いんじゃないの?
今、C#でCOM経由でExcelを操作するアプリ作ってるけど、COMとの通信回数が増えると目に見えて遅くなる。
0502デフォルトの名無しさん2015/02/18(水) 14:45:17.24ID:Lm/UpLLW
>>500
VBA にはソートとかがないでしょ? って話だったかと。
まあ、俺はわざわざ Ruby とやらの環境を入れる気にはならんけどな。
0503デフォルトの名無しさん2015/02/18(水) 14:51:33.82ID:QJoLg/2B
>>502
> VBA にはソートとかがないでしょ? って話だったかと。
あ、そういう話だったか。

だったら、こういうのを使えるようになった方がいいと思う。
『.NET Frameworkを使う』
http://officetanaka.net/excel/vba/tips/tips98.htm

ArrayListを使った、Sort, Clone, Reverseの例が載ってる。
0504デフォルトの名無しさん2015/02/18(水) 14:52:10.22ID:yLcFaQ17
>>500
Rubyとか興味なくはないけど、一からやるとなると面倒だね。
VBAもツールが揃ってくると書き捨ての処理は一行プログラムで書けるようになってきて、そうなると参照返しが欲しくなる。
行を分けろと言うのは正論だけどさ。
0505デフォルトの名無しさん2015/02/18(水) 15:25:22.43ID:a8UdE6sd
ソートもそうなんだけど、根本的な表現力の話もそうで、
例えば>>503のSample1なんてのは
datalist = Array.new(5){(rand*10000).to_i}
print [datalist.sort, "----", datalist.reverse].join("\n")
とたった2行で同じ出力が得られて捗る
0506デフォルトの名無しさん2015/02/18(水) 15:48:01.19ID:QJoLg/2B
>>505
> とたった2行で同じ出力が得られて捗る
いや、COMが扱えるRubyを使える環境にあって、Rubyのことも良く知ってるなら捗るだろうけど、
Ruby知らない人にはハードル高すぎ。

https://www.ruby-lang.org/ja/downloads/
ActiveScriptRuby
RubyInstaller
RailsInstaller
のどれでもCOMが使えるのかどうかとか、
そもそもCOMって何って人とか、
コマンドライン何それって人もいるかもだし。
0507デフォルトの名無しさん2015/02/18(水) 15:59:54.78ID:SUifHOIO
まあわざわざExcelのためだけに他の言語修得するのはナンセンスだね
既に他の言語知ってたり、479みたいにVBAに不便さを覚えた人にはおすすめ程度

そういえばExcel関係ないVBAの話はこのスレではNGだけど、
Excel関係あるVBA以外の話はこのスレでいいの?
流石にrubyの話はスレ違いだと思うんだけど、Excelの操作、
マクロだと考えるとこのスレのような気もするし
0508デフォルトの名無しさん2015/02/18(水) 17:43:29.73ID:TBGWIM9o
セル内文字列の、色の付いてる文字だけを分離させるにはどうすればよいでしょうか?
入力するときに別のセルに入れてくれれば…と思うことしきりです…
0509デフォルトの名無しさん2015/02/18(水) 17:44:02.68ID:PO1vEDuy
俺はデキるプログラマーアピールしたいから他言語の話もするけど他の奴らはするなって思う
0510デフォルトの名無しさん2015/02/18(水) 17:50:58.57ID:QMIzQpCs
VBAはIDEを無料のVS並みにしてくれるだけでも
かなり開発効率あがるんだが
MSさんおなしゃす
0511デフォルトの名無しさん2015/02/18(水) 18:42:17.76ID:Z5m5h1Uj
多言語のことになると妙に否定的だなw
まぁ会社PCにrubyインスコできないから自分も使う機会ねーんだけどさ

TANAKAのこれhttp://officetanaka.net/excel/vba/tips/tips40.htm
組みなおして call で呼び出せば1行じゃないかやったね
0512デフォルトの名無しさん2015/02/18(水) 18:42:36.36ID:99hPsA+1
>>510
わかる

あとunicode対応してほしい
海外からマクロ動かないクレームが頻繁に来る
0513デフォルトの名無しさん2015/02/18(水) 18:48:16.97ID:2rhvVJ3Z
ruby?
糞だろC#にしとけ
0514デフォルトの名無しさん2015/02/18(水) 18:51:38.23ID:xzrnQB2I
>>512
日本語使わなきゃいいじゃん
0515デフォルトの名無しさん2015/02/18(水) 19:29:22.65ID:yLcFaQ17
他言語使うの、プロクラムは書けても連繋がなあ。
自分もdllいくつか使ってるけど結局は俺様ローカルな世界になっちまう。
0516デフォルトの名無しさん2015/02/18(水) 20:24:24.68ID:+TVqHmXQ
VSTOってどうなの?詳しくは調べてないけど
見た感じvisual studioでvb.net/c#での開発が出来るみたいだし、アドインだって作れそうだけど、活用してる人いない?
0517デフォルトの名無しさん2015/02/18(水) 20:39:48.65ID:FooM0Je6
>>508
Range.Characters で1文字ずつFont.Colorを調べれば出来ると思うけど
簡単にやる方法は無いんじゃないかな
0518デフォルトの名無しさん2015/02/18(水) 21:47:43.19ID:ZsVgoINq
他言語の連携とかはここがいいんじゃない?

VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/
0519デフォルトの名無しさん2015/02/19(木) 01:32:15.47ID:vu9Qsx5a
>>473
悪い悪い、C言語やってたから(笑)
0520デフォルトの名無しさん2015/02/19(木) 03:02:07.75ID:lDFiAK4+
>>488
returnを使わないで、引数で、IN/OUTすれば?
f(ByRef in, ByRef out)

>>511
Macには最初から、Ruby, Pythonなども入っている
0521デフォルトの名無しさん2015/02/19(木) 08:22:32.12ID:4dFHTBvU
>>510
MSはVBAは廃止する方向性で取り組んでますよ。
オンライン版でスクリプトが無いのはその現れ。

プログラム組みたいなら、VS2013使ってろって話。
0522デフォルトの名無しさん2015/02/19(木) 08:30:27.00ID:QTl9VVmV
最近、excelを2007から2013に切り替えました。
2007では機能していたモードレスの設定が、
2013では機能しなくなりました。

UserForm.show 0
コードはこれだけです。
別ファイルをアクティブにすると
フォームが裏に隠れてしまいます。

ウィンドウを上手く配置し、
ボタンが見えるようにしてクリックすると
別ファイルのアクティブシートを取得できます。

2007から2013で何か仕様変更があったのでしょうか?
0523デフォルトの名無しさん2015/02/19(木) 08:46:33.76ID:4dFHTBvU
>>522
http://www.asahi-net.or.jp/~ef2o-inue/kankyo/sub02_05_02.html
0524デフォルトの名無しさん2015/02/19(木) 10:32:27.29ID:55lVElNx
>523
ありがとうございます。
仕様変更があったのですね。
よく分かりました。
何か良い回避策はありませんでしょうか?
0525デフォルトの名無しさん2015/02/19(木) 11:14:55.86ID:8gErZFsQ
>>513
> 糞だろC#にしとけ

C#だと、いまだにReleaseComObject()地獄なんだよね。
そんなの無しにGCで解放してくれって思うんだが。
0526デフォルトの名無しさん2015/02/19(木) 12:27:31.66ID:IuurH7h+
>>524
たしかうまい回避策はなくて、他のアクティブシートでの処理が終わったら
ユーザーフォームと紐付いているブックを毎回アクティブに切り替える必要があったと思う。
0527デフォルトの名無しさん2015/02/19(木) 16:24:48.21ID:NAyB84ut
>>524
当方素人で、コードが違うからどうなのかわからんのだけど、
同じようにモードレスのフォームを開いた後、別シートを開いてから
元のフォームを操作するとインデックス範囲のエラーが発生するので
ThisWorkbook.Worksheets(〜〜と全部明示してみたら一応動作したように思えるけど
対応として大丈夫あってるのだろうか・・・
0528デフォルトの名無しさん2015/02/19(木) 21:16:29.95ID:o2jUxII1
2013手元にないから試せないけど
MDI表示にするオプションとかないの?
フォームをシステムモーダルにする方法とかでもいいけど
それはそれで別の問題も出るだろうし

複数ブックいじるVBAとか結構影響でそうだな
0529デフォルトの名無しさん2015/02/20(金) 00:08:26.48ID:Xi0Ydcd+
>>481
亀レスだが、いま実装中。
なんとかVariantを参照で返せるようになった。あとちょっとだ。

m = 1
x = 参照(m)
?x
1
m = 2
?x
2

となる
0530デフォルトの名無しさん2015/02/20(金) 07:44:51.60ID:LhrcWQ82
>522です。
レス下さった皆さん、ありがとうございます。

やりたいことは、アクティブシートに対して
モードレスなフォームのボタンをクリックすると
そのシートが処理されるというものです。
2013用にブック名、シート名のコンボボックスを
表示させようかと考えています。

次バージョンではどうなるのでしょうね。
0531デフォルトの名無しさん2015/02/24(火) 12:32:13.53ID:nq42fo+u
OS Windows7 プロフェッショナル 64bit
Excel2010

┏━━━━┓  ┏━━━━┓
┃A愛媛県┃  ┃B香川県┃
┗━━━━┛  ┗━━━━┛
┏━━━━┓  ┏━━━━┓
┃C高知県┃  ┃D徳島県┃
┗━━━━┛  ┗━━━━┛ ←コマンドボタン4個

ワークシート
    A      B      C      D
1 松山市   高松市   高知市   徳島市
2 今治市   丸亀市   室戸市   鳴門市
3 宇和島市  坂出市   安芸市   小松島市
4 八幡浜市  善通寺市  南国市   阿南市
5 新居浜市  観音寺市  土佐市   吉野川市
6 西条市   さぬき市  須崎市   阿波市
7 大洲市   東かがわ市 宿毛市   美馬市
8 伊予市   三豊市   土佐清水市 三好市

VBAを使って上の図のようなものを作りたいと思っています。
A列が愛媛県の市町村でB列が香川県の市町村というぐあいです。
そしてA1〜D8の市町村をランダムにE1に表示させます。
表示された市町村がどれであるか考えて上の4個のボタンのどれかを押します。
正解か不正解かはF1に表示させます。
この市町村当てクイズのようなものを作りたいのですが詳しい方いらっしゃいますか。
まずはE1にランダム表示させるところから学んでいきたいと思っています。
0532デフォルトの名無しさん2015/02/24(火) 14:57:55.19ID:jA7JvUel
>>531
【誤】
┏━━━━┓  ┏━━━━┓
┃A愛媛県┃  ┃B香川県┃
┗━━━━┛  ┗━━━━┛
┏━━━━┓  ┏━━━━┓
┃C高知県┃  ┃D徳島県┃
┗━━━━┛  ┗━━━━┛ ←コマンドボタン4個

【正】
┏━━━━┓  ┏━━━━┓
┃B愛媛県┃  ┃A香川県┃
┗━━━━┛  ┗━━━━┛
┏━━━━┓  ┏━━━━┓
┃C高知県┃  ┃D徳島県┃
┗━━━━┛  ┗━━━━┛ ←コマンドボタン4個
0533デフォルトの名無しさん2015/02/24(火) 15:36:15.77ID:cA1xu2y/
>>531
詳しくはないけど
>まずはE1にランダム表示させるところから学んでいきたいと思っています。
RND関数 てのがあるよ
0534デフォルトの名無しさん2015/02/24(火) 15:52:09.13ID:8JogkC7z
>>531
>そしてA1〜D8の市町村をランダムにE1に表示させます。
どのようなタイミングで表示するの?
例えば、一定間隔で表示し時間切れは不正解にするとか
0535デフォルトの名無しさん2015/02/24(火) 16:41:06.64ID:FzvWfJKU
次の問題ボタンとかでいいんじゃね
初心者っぽいし作りやすい仕様を想定してあげよう
05365312015/02/24(火) 19:17:54.40ID:nq42fo+u
問題の出るタイミングはいきなり表示されているのでいいと思ってましたが、
次の問題ボタンを置こうと思います。
>一定間隔で表示し時間切れは不正解にする
そんなこともできるんですか。今回は時間制限はつけないでいいかと思っています。
0537デフォルトの名無しさん2015/02/24(火) 20:49:49.67ID:PIm2u7Y8
とりあえず、どのボタンが押されたかが分かるサンプルと、引数に与えた最小値と最大値の間の整数を返す関数を置いておきますね

Sub Sample1()

Dim Button_Name As String
Button_Name = Application.Caller
MsgBox Button_Name

End Sub


Function makeRndInt(minInt As Integer, maxInt As Integer) As Integer

Randomize
makeRndInt = Int((maxInt - minInt + 1) * Rnd + minInt)

End Function


次の問題ボタンはA1〜D8のセルをランダムに抽出し、E1に表示する機能
回答ボタンは、どのボタンが押されたかを見て、対応する列名を取得し、A1〜D8範囲を探す機能を追加すればいいかと
0538デフォルトの名無しさん2015/02/24(火) 21:05:22.03ID:8JogkC7z
>>536
ヒントです

Sub セル選択()
Cells(Int((8 * Rnd) + 1), Int((4 * Rnd) + 1)).Select
End Sub
05395312015/02/24(火) 22:27:48.47ID:nq42fo+u
ヒントをどうも有難うございます。
プログラムの文章をすぐに理解するのは難しいようです。
頂いたヒントをもとに勉強してきます。
0540デフォルトの名無しさん2015/02/25(水) 14:00:38.12ID:aPhmfYhG
ボタンを押したらセルに入力、だけマクロでやって正否判定と表示はExcel関数でやったほうがはやそう
0541デフォルトの名無しさん2015/02/25(水) 14:25:46.10ID:lUiDnnd2
勉強のためじゃないの?
元々VBA無くてもできそうじゃん
0542デフォルトの名無しさん2015/02/25(水) 16:20:44.02ID:rpMKp3K5
VBAをVBAらしくない使い方をしたものは三年以下の実刑に処す
0543デフォルトの名無しさん2015/02/25(水) 16:38:07.73ID:oiOKwPPk
>>542
恐喝ですか?
0544デフォルトの名無しさん2015/02/25(水) 19:23:19.97ID:oz2nX22y
3年以下の実刑って新しいな
0545デフォルトの名無しさん2015/02/25(水) 21:19:48.54ID:eqSO3lN+
VBAで会社のパソコンから使える出会い系アプリ作ってください。
0546デフォルトの名無しさん2015/02/25(水) 21:21:30.78ID:hgjjK+Cd
殺人予告を投稿するアプリで新しい出会いが
05475312015/02/26(木) 02:04:11.48ID:uI5cgKXN
VBAで作るにはあまり適してないんでしょうかね。
もっとやりやすい方法があるでしょうか。
0548デフォルトの名無しさん2015/02/26(木) 04:05:32.06ID:ldMRR6U8
>>547
勉強用には良いと思うよ
■ このスレッドは過去ログ倉庫に格納されています