トップページ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
0736デフォルトの名無しさん2014/06/14(土) 14:18:26.82ID:Je/qq0DA
>>728
俺の体感では
システム側の問題でマクロ付きのエクセルファイルが壊れるのは、それ以外のファイルが壊れるのと差はない
マクロでおかしなことやってるか、マクロ関係なくファイル壊れるような環境かのどっちかが疑わしい

>>731
リソースの競合

>>735
パス長の問題で読み書きできないんじゃないのか?
0737デフォルトの名無しさん2014/06/14(土) 15:36:29.51ID:UnUM1hDE
http://peace.2ch.net/test/read.cgi/tech/1342087380/
こちらで質問したのですが、

こちらのスレのほうがよかったのですかね?
708です
0738デフォルトの名無しさん2014/06/14(土) 21:48:17.67ID:ez0d87W9
>>736
> マクロでおかしなことやってるか、マクロ関係なくファイル壊れるような環境かのどっちかが疑わしい
まじにこんな事言う人始めて見たw
0739デフォルトの名無しさん2014/06/15(日) 09:58:44.35ID:2EJJf8nr
A列の1行目から最終行まで処理を繰り返すにはこれで良いかと思うのですが
B列に値が入っていない所から同じ処理をさせるようにするにはどうすればよいのでしょうか?

For wRow = 1 To Range("A" & Rows.Count).End(xlUp).Row
・・・
・・

Next

 A B
1 x x
2 x x
3 x x
4 x    ←この列から処理を始めたい
5 x
0740デフォルトの名無しさん2014/06/15(日) 10:14:00.30ID:QD8jtgNH
>>739
Dim FirstB As Long
FirstB = Range("B1").End(xlDown).Offset(1).Row

For wRow = FirstB …
0741デフォルトの名無しさん2014/06/15(日) 11:40:26.86ID:2EJJf8nr
>>740
早々のレスありがとうございます。
上手くいきました!作業効率があがり助かりました!
0742デフォルトの名無しさん2014/06/15(日) 21:21:01.30ID:2EJJf8nr
>>740
度々すみません
この処理を仮に6行目からスタートさせるにはどうすればいいのですか?
0743デフォルトの名無しさん2014/06/15(日) 21:24:01.33ID:QD8jtgNH
>>742
B1をB6に変えればいいよ。
0744デフォルトの名無しさん2014/06/15(日) 22:09:31.20ID:2EJJf8nr
>>743
ありがとうございます。初歩的な質問ですみませんでした
0745デフォルトの名無しさん2014/06/17(火) 03:05:20.46ID:1LOl6xrI
クラス名の後にドットを入力してもクラスのパブリックなプロシージャが
候補に出てきません。エクセル2002の仕様ですか?
0746デフォルトの名無しさん2014/06/17(火) 03:10:24.91ID:1LOl6xrI
それと、あるサイトで分からない表現があったのですが
[_END]の[]で括るのは、どういう意味ですか?

Enum Area
 West = 0
 East
 [_END] = -1
End Enum
0747デフォルトの名無しさん2014/06/17(火) 03:59:06.43ID:jPdOoXg3
>>746
セル範囲の名前の定義
0748デフォルトの名無しさん2014/06/17(火) 10:25:10.56ID:X2vvvV0A
オブジェクト変数をオブジェクト変数に代入するとどうなりますか?
0749デフォルトの名無しさん2014/06/17(火) 10:25:54.01ID:X2vvvV0A
配列変数も配列変数に代入するとどうなりますか?
0750デフォルトの名無しさん2014/06/17(火) 10:26:46.03ID:X2vvvV0A
↑このへんのことをたとえ1年くらいVBAを使ってなくてもすぐに思い出せるようにしておくいい方法はありますか?
0751デフォルトの名無しさん2014/06/17(火) 10:36:51.26ID:l2MahTzn
>>746
通常指定できない変数名を使うときに[]でくくると言うVBAのルール
ExcelVBAとして>>747の使い方する時もあるけど、>>746のはそれじゃない

ちなみに_で始めた列挙名は非表示メンバになって、通常の入力補助とかに出てこない
オブジェクトブラウザで 非表示のメンバを表示 にして確認できる
0752デフォルトの名無しさん2014/06/17(火) 10:41:48.38ID:Yj2sqA8/
>>745
クラス名そのものではなく
クラス名を型として宣言した変数の後にドットを入力しましょう

それでもダメなら、どこかにコンパイルエラーがあると思うので
メニューの デバッグ > VBAProjectのコンパイル で確認しましょう

>>747
コードエリアで使う場合と、宣言エリアの列挙型で使う場合とでは意味が違うよ

>>746
列挙型では、_ で始まる名前を [ ] で囲むと、入力候補に表示されないメンバを定義できる
これは、_で始まるメンバは非表示メンバになるのと、[ ] で囲むと通常使えない名前を定義できるのとの合わせ技です

>>748
オブジェクト変数をオブジェクト変数に代入するとエラーになります
オブジェクト変数をオブジェクト変数に参照代入すると、参照代入先のオブジェクト変数でも
元のオブジェクト変数が参照しているオブジェクトを参照できるようになります

>>749
可変要素数の配列変数への代入では、元の配列変数のコピーが作成されます
固定要素数の配列変数への代入では、要素数が同じでもエラーになります
0753デフォルトの名無しさん2014/06/17(火) 12:09:43.40ID:l2MahTzn
>>752
コードエリアとか宣言エリアとか
参照代入とか
微妙な俺様用語使うのやめれ
07546622014/06/17(火) 15:43:08.43ID:ZBiDicGQ
>>662についてどなたかアドバイスお願いします。 m(__)m
0755デフォルトの名無しさん2014/06/17(火) 17:05:41.46ID:HVt3rccc
cnt=1の時と場合わけする方法で良いと思います。
0756デフォルトの名無しさん2014/06/17(火) 18:58:25.63ID:Oy7I6t4I
>>754
こんな方法はどうだろうか?

3x1 の配列でTranspos問題でるなら

  ReDim Preserve TestArray(1 To 3, 1 To cnt + 1)

として 3x(cnt+1) の配列でReDimして Transposする

んで読み込む時は 配列の1次元目の最終データ
つまり
 TestArray(cnt+1, 1)
 TestArray(cnt+1, 2)
 TestArray(cnt+1, 3)
は無効データとして無視する
0757デフォルトの名無しさん2014/06/17(火) 21:32:49.72ID:l2MahTzn
>>754
Transposeの仕様っぽいから、1次元の配列になるのはどうしようもないんじゃない

そもそもWorksheetFunction.Transpose使う必然性がわからん
俺なら配列そのもの変換せずに、読む方で行列入れ替えて読むが
どうしても配列変換したければ自分で配列変換する関数作る
0758デフォルトの名無しさん2014/06/17(火) 23:57:50.59ID:SruwTgIk
スクロールロックキーを押してないのに
勝手にスクロールロックされるという怪現象に長年悩まされてます
これまでは発生頻度が低いから気にしてなかったのですが、
最近バーコードリーダーを接続したPCで頻繁に発生するようになりました

あまりにうざいので、VBAで対抗しようと考えて
まずは Call Application.OnKey("{SCROLLLOCK}", "") としてみたのですがダメでした
何か良い方法ないでしょうか

SCROLLLOCKのON/OFFを判定して、
ONならOFFにする方法なんて無いでしょうか
0759デフォルトの名無しさん2014/06/18(水) 00:03:23.37ID:EzL2wKEq
一番いいのは、VBAで対処なんて余計なこと考えずにそのPCをさっさと修理に出すことだな
0760デフォルトの名無しさん2014/06/18(水) 00:05:05.34ID:0b/GVhNi
>>752
どうもありがとうございました!
0761デフォルトの名無しさん2014/06/18(水) 00:47:57.54ID:+FU8wlvZ
>>758
「勝手にスクロールロック」でぐぐったらこんなん出た。
マウスのチルトホイールが悪さしてたらしい。
http://orbit.cocolog-nifty.com/supportdiary/2009/08/post-2f3e.html
07626622014/06/18(水) 07:46:00.29ID:SiDz/mVA
>>755>>756>>757 ありがとうございます。
Transposeの仕様であるなら仕方ないですね。
今はcnt=1かどうかの場合分けで対応しています。

>>756
提案ありがとうございます。なるほど、そのようにしてTransposeで1次元となることを避けることができるのですね。
参考になります。この方法ならコードの修正部分も少なさそうです。

>>757
仰るようにTransposeを使う必然性はありません。
今の知識がありゼロから作り始めるならTransposeは使わずに作ると思います。
昔の名残を活用するために必然性のないTransposeを使う羽目になってしまいました。
時間ができたら全部書き直したい気持ちはあるのですが。。。
0763デフォルトの名無しさん2014/06/18(水) 08:21:57.79ID:ahd+98VX
>>753w
0764デフォルトの名無しさん2014/06/18(水) 10:15:27.45ID:fAjoLlg4
>>759
>>761
PCもキーボードもマウス何回か換えてるし
EXCELも2000から2013にかけて何回か乗り換えてるから
違う原因と思うんですが
07657612014/06/18(水) 10:36:30.12ID:+FU8wlvZ
>>764
んじゃこっちはどう?

http://blog.livedoor.jp/sigh_too/archives/51273110.html

ctrl + c と間違えて Fn + c を押しちゃってた人の話
0766デフォルトの名無しさん2014/06/18(水) 10:39:53.19ID:+FU8wlvZ
スクロールロックの割り当てが
Fn + K とかの場合もあるって事で機種によって違うみたいね。
0767デフォルトの名無しさん2014/06/18(水) 12:31:44.62ID:k5Dh+D1T
>>764
ここでもそんな相談は見たことないし、検索でもほとんど出てこないので、
何か特別なソフトが原因じゃないのかなあ
一般人が使わないようなアプリが入っているとか、変なマクロが走っているとか

そのパソコンはあなた専用?それとも共用?
0768デフォルトの名無しさん2014/06/18(水) 12:35:01.13ID:k5Dh+D1T
>>764
いつもまったく気付かない?
一度でもスクロールロックされる瞬間を目撃したことはある?
その時、パソコンは使用中か放置中だったか
0769デフォルトの名無しさん2014/06/18(水) 17:42:06.75ID:fAjoLlg4
下の2件と同様です
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13105571298

http://okwave.jp/qa/q6865033.html

すばやく連続入力して一呼吸おいた後に、次の入力を始めようとして
あれ?と気付くことが多いような気がします
入力中に突然ロックされたことはないと思います
PCは基本的に自分専用です。

発生頻度は1〜2ヶ月に1回くらいでしょうか
バーコードリーダーの場合は接続して間もないですが、
1日に1〜2回は出ていそうです。
PS2接続です。
0770デフォルトの名無しさん2014/06/18(水) 19:27:12.46ID:x3SERBGR
質問です。
金額計算なんですが、例えばM列に1を入れるとK+Lの合計を0.5倍にして(何も入れないとK+Lの合計)N列に表示するっていう文を作りたいんですが、色々調べてもわかりません
よろしければ教えて下さい!
0771デフォルトの名無しさん2014/06/18(水) 19:46:58.78ID:EzL2wKEq
何がどう判らないのかが判らないし、シートがどうなってんのかも知らんけど

Dim i As Integer
Dim lastrow As Integer

For i = 1 To lastrow
If Cells(i, 13).Value = 1 Then
Cells(i, 14) = (Cells(i, 11) + Cells(i, 12)) * 0.5
Else
Cells(i, 14) = Cells(i, 11) + Cells(i, 12)
End If
Next
0772デフォルトの名無しさん2014/06/18(水) 19:48:50.42ID:/mM+tAme
選択された複数のセルで
重複するものは代表1つだけにして
その要素数の数だけ文字列型の配列変数を返り値とする関数を作りたいです。

コードをお願いします。
0773デフォルトの名無しさん2014/06/18(水) 20:01:04.29ID:ZRwyQinV
>>772
Selection.Uniquify
0774デフォルトの名無しさん2014/06/18(水) 20:38:45.97ID:/mM+tAme
>>773
こら。そんなのないぞ。
0775デフォルトの名無しさん2014/06/18(水) 21:22:12.13ID:+FU8wlvZ
なんか手を変え品を変え
同じ質問を繰り返している人がいるように思えるのは俺だけ?
Dictionaryとか自前で配列変数作るとかやりようはそれなりにあると思うけど。
0776デフォルトの名無しさん2014/06/18(水) 23:31:09.78ID:IQKBzqn4
宿題なんじゃね
0777デフォルトの名無しさん2014/06/19(木) 06:51:10.55ID:Wcq0Jv47
>>772
へい。
https://friendpaste.com/7AESsKfoWV1tNVQmlhrMgY
0778デフォルトの名無しさん2014/06/19(木) 07:19:42.28ID:NPfluINM
「関数を作りたい」に違和感。じゃあ勝手に作れよ
「関数が必要」とか「作って欲しい」って書け
0779デフォルトの名無しさん2014/06/19(木) 11:17:24.00ID:Oioydr8f
>>777
こら、VBAで使えないぞ。
本当にVBAの言語用なのか?
0780デフォルトの名無しさん2014/06/19(木) 11:33:56.90ID:YZPnLqDa
さっきまでボタン押してたら動いたマクロが押しても無反応になるのはなぜですか?無反応というのは、ボタンを押しても実行中にすらならないのです
停止もエラーも何もなく、ただ無反応
0781デフォルトの名無しさん2014/06/19(木) 11:39:54.47ID:w+8gDH2b
>>779
これはすごい恩知らずwww
間違いなくVBAで使えるぞ。
0782デフォルトの名無しさん2014/06/19(木) 11:52:02.14ID:w+8gDH2b
>>780
コードが書いてないからそれだけではなんとも分からないですよ。
あと、使ってるエクセルとOSのバージョンも書いてないし。
とりあえずステップインで実行してみてはどうですか?
0783デフォルトの名無しさん2014/06/19(木) 11:55:45.95ID:Oioydr8f
>>781
こら、ウソ言うな。
選択してMainを実行したら「インデックスが有効範囲にないぞ」というエラーが出る。
0784デフォルトの名無しさん2014/06/19(木) 12:09:33.27ID:w+8gDH2b
>>793
ためしに縦一列に文字だけ(数字は無視される)入れて、
その範囲を選択した状態でマクロ実行してみろよ
0785デフォルトの名無しさん2014/06/19(木) 12:13:22.03ID:w+8gDH2b
安価ミスった>>793じゃなくて>>783

ちょこっと手直しすると範囲が縦一列じゃなくて
数字も無視しないようになるけど
777さんに対してあまりにも無礼だからこれ以上は教えてやらない。
0786デフォルトの名無しさん2014/06/19(木) 13:25:10.11ID:Oioydr8f
>>785
そんなバグだらけじゃ使い物にならないじゃないか。
糞ボロ。ポンコツ。
0787デフォルトの名無しさん2014/06/19(木) 14:00:13.35ID:w+8gDH2b
だって初めに条件付けてないお前が悪いんだよ
だからあれはバグじゃなくて仕様
0788デフォルトの名無しさん2014/06/19(木) 14:00:36.50ID:8jNSzAvz
もう既に本人はいなくなっててなりすましの荒らしが暴れているだけ
解散
0789デフォルトの名無しさん2014/06/19(木) 14:26:30.45ID:z2Nts7io
>>782
すみませんなぜか再起動したら解決しました
0790デフォルトの名無しさん2014/06/19(木) 21:26:30.92ID:B42MAC9K
Endステートメントって使ってる人いますか?

Sub Test()
On Error Go To ErrorHandler

If hogeError Than
call EndProc
End If

call EndProc
ErrorHandler:
call EndProc
End Sub

Private Sub EndProc()
'インスタンスの破棄とかScreenUpdating =Trueとか
'プログラムの終了
End

End Sub

msdnとかだとEndステートメントはすぐに停止させる時だけ使えとかって書いてあるんだけど、この関数呼べば必ず綺麗に後処理できるから便利〜
と思ってたんだけどやっぱりダメなんすかね?
0791デフォルトの名無しさん2014/06/19(木) 21:49:00.62ID:zV78lioG
>>790
End使うとUnloadなしでフォームが閉じたりするから、綺麗に後処理できない
だから使うなって言われてる
0792デフォルトの名無しさん2014/06/19(木) 22:42:28.51ID:B42MAC9K
>>791
あ〜なるほど、そっかformのイベントエラーとかでEnd飛ばしちゃうとUnloadとかされないのか
やっぱりエラーは個別にやんなきゃダメっすね、ありがとうございました。
0793デフォルトの名無しさん2014/06/20(金) 19:07:25.47ID:zU8FIBtE
MsgBoxのようにメッセージを出したいんですが
そのメッセージはユーザがコピペできるようにしたいんです。
一番てっとり早い方法はなんでしょう?
0794デフォルトの名無しさん2014/06/20(金) 19:42:55.71ID:qdXxhrxP
>>793
メッセージボックスって普通コピー出来るんだが、VBAのはダメなんだっけ?
0795デフォルトの名無しさん2014/06/20(金) 19:46:15.80ID:zU8FIBtE
>>794
できないんですよ。
0796デフォルトの名無しさん2014/06/20(金) 19:47:17.20ID:zU8FIBtE
>>794
普通コピーできるって、その普通とはどういう環境?
0797デフォルトの名無しさん2014/06/20(金) 19:49:02.65ID:zU8FIBtE
おろどいた。
無理やりオボったらちゃんとコピペできてた。
0798デフォルトの名無しさん2014/06/20(金) 19:50:50.72ID:y3Z+Q6P/
オボったらってのはマウスでゴチャゴチャしたらって意味け?
0799デフォルトの名無しさん2014/06/20(金) 19:53:22.06ID:zU8FIBtE
オボカタさんのようにコピペしたのだ
0800デフォルトの名無しさん2014/06/20(金) 19:54:23.75ID:zU8FIBtE
でもちゃんと選択して色が変わってCtrl+Cでコピペできるような仕様にするにはどうすればいいですか?
0801デフォルトの名無しさん2014/06/20(金) 20:02:43.06ID:qdXxhrxP
いんぷっとぼっくす
0802デフォルトの名無しさん2014/06/20(金) 20:11:28.85ID:zU8FIBtE
インプットボックスをアウトプット用にできますか?
そもそもインプットボックスって名のとおりアウトプットじゃないじゃないですか?
だからインプットボックスについてるボタンなどをすべて無効化したい。
0803デフォルトの名無しさん2014/06/20(金) 20:22:09.60ID:ZokJyX4+
ユーザーフォームでMsgboxもどきみたいの作ればいいんじゃないの?
0804デフォルトの名無しさん2014/06/20(金) 20:28:58.52ID:qdXxhrxP
メッセージボックスのメッセージ部分が選択可能になったものありませんか?
これ以外認めないんだろ?最初からそう聞けばいいのに
0805デフォルトの名無しさん2014/06/20(金) 22:47:42.81ID:q4j+Bx57
>>802
全てのボタンを無効化したら閉じることも出来ないじゃん
0806デフォルトの名無しさん2014/06/20(金) 23:29:37.04ID:NSJkRCsB
ボタンがなければ閉じることも出来ない
そんな凝り固まった常識をぶち壊していきたい
0807デフォルトの名無しさん2014/06/21(土) 00:14:38.91ID:mfmIX+n9
ユーザーフォームにテキストボックス置いて編集禁止にしとけ
編集禁止でも選択とコピーは可能だから
テキストボックスの背景をグレーするとかでMsgBoxと区別つかんようにできるし
0808デフォルトの名無しさん2014/06/21(土) 00:18:27.48ID:JKn6FGb9
EXCEL2013で、検索ダイアログを表示させるボタンを作りたいんですけど、
下記のコードを使うと置換のタブが開かれた状態で表示されるので、
検索タブが開かれる状態でコードを登録する方法を教えて下さい。

CommandBars.FindControl(ID:=313).Execute
0809デフォルトの名無しさん2014/06/21(土) 01:00:45.34ID:cHoAUDWh
>>808
2013の資料が手元にないけど、2007なら
Application.CommandBars.FindControl(ID:=1849).Execute
0810デフォルトの名無しさん2014/06/21(土) 01:04:01.23ID:mfmIX+n9
>>808
ちょっと違うけど一応検索
Application.Dialogs(xlDialogFormulaFind).Show

ワークシートがアクティブになってれば
SendKeys("^F")
0811デフォルトの名無しさん2014/06/21(土) 13:03:36.05ID:BHEAfygD
>>809
2013でも使えました。ありがとうございます。
0812デフォルトの名無しさん2014/06/21(土) 13:05:15.05ID:BHEAfygD
>>810
こんな検索もあるんですね。参考になりました。有難うございます。
0813デフォルトの名無しさん2014/06/21(土) 14:15:51.51ID:62Gltl9i
>>758
758です。色々ぐぐって自己解決できたのでコード載せときます
オフにするところの2行の意味がよく分かりませんが
希望の動作ができたから良しとします
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long

Private Sub Worksheet_Change(ByVal Target As Range)
Const VK_SCROLL = &H91
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2

Dim LockState As Boolean
Dim keys(0 To 255) As Byte

GetKeyboardState keys(0)
LockState = keys(VK_SCROLL)

'オンであれば強制的にオフ
If LockState = True Then
keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End If
End Sub
0814デフォルトの名無しさん2014/06/21(土) 15:51:17.12ID:MWnqmoLJ
Msgboxが表示された時にどのボタンにもフォーカスがない状態って出来ます?
はいやいいえになってると、Enter連打であっさりスルーされちゃうので

ぐぐっても「いいえ」に合わせるコードはでてきでも、
フォーカス無しのコードは出てこないし

msgbox("上書きしますか?",vbDefaultButton2+vbYesNo)

上のじゃないけど、ユーザーフォーム使うしかないんでしょうか?
0815デフォルトの名無しさん2014/06/21(土) 17:20:31.07ID:4JtY8OkT
どうせ見られないメッセージボックスなら出さない方がいいと思うよ
0816デフォルトの名無しさん2014/06/21(土) 18:03:25.68ID:Qjh9DMWW
> ユーザーフォーム使うしかないんでしょうか?
そりゃ当然だろ?

融通は利かないが、良く使われる用途なら簡素化できるってのが
MsgBoxを初めとする組込ダイアログなわけで
その仕様を外れたら自作になるのは、プログラムとしては当然のこと

MsgBoxではアレが出来ないコレが出来ないではなく、
本来なら全て自前でフォーム作らなければならないメッセージダイアログに置いて
特定の制限内の機能で事足りる場合はMsgBox関数で楽できるって考えるべき

つまりメッセージダイアログは、MsgBox基準ではなく自作基準で考えよう
0817デフォルトの名無しさん2014/06/21(土) 22:22:34.80ID:A7b0CBz5
>>814
おれスルーしたい時はESCだわ
0818デフォルトの名無しさん2014/06/21(土) 23:06:28.70ID:Ipr85krH
>>816
やはりそうですか…

今のところシートの中のVBA記述だけで作れていて
「シートコピーするだけで使えるマクロだから皆で使ってね」
って売り込みしたいので、ユーザーフォームは出来れば避けたかったのですが
まず開発タブを表示してVBEを開いて…とかだと多分みんな使ってくれない(汗

>>817
ESCやALT+F4は最初から無効みたいで、大丈夫でした

はい・いいえ・キャンセルを表示してフォーカスをキャンセルにして
キャンセル押したら再度Msgbox表示する方法で妥協を考えています。
ここを参考にしました。
http://www.excel.studio-kazu.jp/kw/20050314190246.html
0819デフォルトの名無しさん2014/06/22(日) 04:00:56.97ID:3PJ9Umqu
なぜそこまでしてフォームを自作することを敬遠するのか意味解らないw

MsgBox関数みたいに、メッセージの内容次第で幅も高さも可変で
いくつかのアイコン表示が出来たり、ボタンの数も種類も変えられたりするように作るなら面倒だけど
メッセージ内容もボタンも固定で、単にEnter連打で消えないようにするだけのものなら
1,2分もあれば作れるじゃん

ここで質問したりレスを読んだりするよりも短い時間で作れるものなのに
そんな簡単なことよりも、>>818の最後に書いてるような弊害を抱える方法で妥協するのは何故?
0820デフォルトの名無しさん2014/06/22(日) 08:34:28.55ID:icvg/MGo
変数がたくさん(100以上をイメージしてください)はいった配列変数があって
それを単純に昇順に並べるとき
VBAでわざわざ新シートつくってセルA1〜A100以降にわざわざ入力して
Excelのソート機能をわざわわざVBA呼び出して
そのあとわざわざ配列変数に入れなおすということをしています。
(この間ユーザに画面を見せないようApplication.Screenupdate = Falseにしています)

もっといい方法はありませんか?
やってること自体は単にアルゴリズムでいう「ソート」なので、新シート作ったりしないで、単に配列のソートをしたいだけなのですが。

ついでにExcel本来についている機能を利用するときそのコードがどうなって見れる方法とかありますか?
0821デフォルトの名無しさん2014/06/22(日) 08:35:41.60ID:icvg/MGo
とくに偉そうに説教してる>>819、なにかいい方法はないか?
0822デフォルトの名無しさん2014/06/22(日) 08:50:10.63ID:bqRgXzqb
excelのソート機能を呼び出すのが嫌なら自前でコードをごりごり書けば良い
配列のソートなんかいっくらでもサンプルがネットにある。
そうすれば、そのためにApplication.Screenupdate = Falseするのは回避出来る
0823デフォルトの名無しさん2014/06/22(日) 08:53:16.45ID:E7Bp6E2C
偉そうに説教してるという質問者が一番偉そうな件
0824桃白白 ◆9Jro6YFwm650 2014/06/22(日) 12:08:58.33ID:TaqxR0c4
>>820
(; ・`д・´)桃白白バブルソート実装しようか?
0825デフォルトの名無しさん2014/06/22(日) 12:09:12.69ID:HL9MA0On
>>820
>やってること自体は単にアルゴリズムでいう「ソート」なので、新シート作ったりしないで、単に配列のソートをしたいだけなのですが。
「ソート アルゴリズム」でググれ

ついでにExcel本来についている機能を利用するときそのコードがどうなって見れる方法とかありますか?
「メモリエディタ」でググれ
0826デフォルトの名無しさん2014/06/22(日) 12:42:39.60ID:LETTRPjp
質問者が偉そうと言うのには同意だが、

>>819
> なぜそこまでしてフォームを自作することを敬遠するのか意味解らないw

も相当頭悪そう
ちゃんと書かれてるやん
0827デフォルトの名無しさん2014/06/22(日) 12:46:42.79ID:rb15rihA
>>820
VBAにはソート機能がないので、ワークシートを使うかソートのプログラムを自分で作るのが定番
誰かが公開したやつをネットからコピペしてもいいし

それ以外には、Windowsのソート機能を使うという方法もあるけど、あんまり一般的じゃないしメリットも少ない
0828デフォルトの名無しさん2014/06/22(日) 14:14:21.42ID:28X7tRhT
そう言えばVBAってソート出来るObjectって使えるの無いんかな。
0829デフォルトの名無しさん2014/06/22(日) 14:15:56.96ID:ISsPU5R9
VBAにはソート関数が無いの?

PowerShellにもあるのに
0830デフォルトの名無しさん2014/06/22(日) 16:11:48.02ID:rb15rihA
>>828
いくらでもある
標準で入ってるのだとvbsとか.netの配列オブジェクトを使えばソートメソッドも付いてくるけど使うのがめんどくさい
0831デフォルトの名無しさん2014/06/22(日) 16:36:24.01ID:28X7tRhT
>>830
.Netの配列なんて標準でついてるんだ。
標準ってことはdllファイルとかにしなくても参照設定で普通に使えるってこと?
Ienumelableの実装とかどうなってるの?
0832デフォルトの名無しさん2014/06/22(日) 18:47:31.78ID:rb15rihA
>>831
CrerateObject以下略だけで使える
実装までは知らんけど、基本的な使い方はvbsの配列オブジェクトと似てる
0833デフォルトの名無しさん2014/06/22(日) 19:22:55.53ID:jr7Ep/EM
それって複数のマクロが各々異なるバージョンのアセンブリを利用する場合にも問題ない?
細かい話だが前から気になってるんだよ
0834デフォルトの名無しさん2014/06/22(日) 20:58:53.57ID:rb15rihA
もともと外部オブジェクトなんて保証外だわな
あくまでも自己責任で

半角文字のソート程度ならバージョンが違っても動作が変わることは少ないと思うけど、
あえてそこまでして使うメリットもあんまりないと思うんで、気になるならVBAでソートプロシージャを自作しとけ
速度が必要ならワークシート関数使った方がたぶん速い
0835デフォルトの名無しさん2014/06/22(日) 21:13:25.13ID:ut82qKlb
>>826
別にユーザーフォーム使ったところで、呼び出しをシートに書いておけば
「シートコピーするだけで使えるマクロだから皆で使ってね」
からは外れない故の慰問だろ?
■ このスレッドは過去ログ倉庫に格納されています