Excel VBA 質問スレ Part32
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/10/07(月) 22:19:55.86★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 質問スレ Part31
http://toro.2ch.net/test/read.cgi/tech/1376371376/
関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0421デフォルトの名無しさん
2014/01/11(土) 04:44:36.37Sleepは、自主的にCPUの実行権を放棄して、
他のプロセスに、CPUのタイムスライスを与える
DoEventsはイベントキューから、
イベントをとって処理する?
0422デフォルトの名無しさん
2014/01/11(土) 07:17:37.53いちおうマジレスしとくけど
Sleep使うとき
スレッドをしばらく停止しておきたいとき
DoEvents使うとき
溜まってるメッセージキューを処理したいとき
まあ出来れば二度と来ないでください
0423低脳
2014/01/11(土) 11:19:55.48そのスレッドとかメッセージキューとは、どういう概念ですか?
0424デフォルトの名無しさん
2014/01/11(土) 12:08:58.66スレッドはプロセス内部で実行単位をさらに分割したもの
VBAなら1プロセス1スレッド
1CPUが割り当てられ4コアなら25%の力を引き出せる
他言語で1プロセスnスレッドが可能なものもある
やはり1スレッドに1CPUの割り当てとなるが4スレッド使えば4コアを100%使い切れる
メッセージはWindowsのGUIの仕組み
キーボード、マウスクリックその他イベントのトリガーは全てGUI部品に対するメッセージで実現されている
めんどくさいやめた
0425デフォルトの名無しさん
2014/01/11(土) 12:50:23.25DoEventsはユーザーの入力待ちに使う。他のアプリと連携するときに使うこともある
ある意味、関数内で隠しのアプリケーションを一つ立ち上げるのに近いので
使い方よりも内部を理解して注意点を把握することが大事
キーワードはイベントループ、メッセージポンプ、メッセージループ(呼び方はいろいろ)
もっと簡単に言うと学ぶ気のない奴は去れ
0426デフォルトの名無しさん
2014/01/11(土) 12:58:28.43低能で厚顔無恥はスルーだろjk
0427デフォルトの名無しさん
2014/01/11(土) 13:14:53.49お前はググらなければわからないってだけじゃ・・・
0428デフォルトの名無しさん
2014/01/11(土) 15:15:33.46その別ブックを閉じるとその変数を参照できません。
これを防ぐにはどうすればいいのでしょうか?
0429デフォルトの名無しさん
2014/01/11(土) 15:39:13.08オブジェクトの場合はセルの場所が記憶されるだけなのでブックを閉じるとセルの中身は見えなくなる
オブジェクトじゃない変数にセルの中身(値)を記憶しておけばいい
0430デフォルトの名無しさん
2014/01/11(土) 20:10:43.64その方法とは?
0431デフォルトの名無しさん
2014/01/11(土) 20:12:55.39設計書見せて
0432デフォルトの名無しさん
2014/01/11(土) 20:43:43.23構造体やクラスのように複数の子要素をもつ型を返すようにするのが基本じゃね?
まぁ他にも配列や連想配列を返すとか、グローバル変数を介するとか
いくらでも方法はあるけどね
0433デフォルトの名無しさん
2014/01/11(土) 22:05:29.031〜10の縦並びの表で、調査結果が飛び飛びに得られ、
データが得られなかった番号のみを抽出してそれのみの
新たな表を作成するVBAプログラムを作りたいのですが、
表番号 調査項目
1 xx
2 xx
3 xx
4 xx
・
・
10 xx
2,3,5,7,10 の調査結果が得られ調査結果が得られた順に結果のみの新たな表が別のブックに作成される.
↓
最初の表から未調査の1,4,6,8,9のみの表を作成しそれを元に再調査と言った流れです。
仮に10としてありますが実際の表は1000以上あり手で消すのは現実的ではありません
除外する方法を色々考えましたがすぐ出来そうで簡単にはできないようで行き詰まりました。
宜しくお願い致します。
0434デフォルトの名無しさん
2014/01/11(土) 22:10:53.29調査結果が得られたかどうかはどうやって判断するんだ?
つか、VBA使わんでも、その条件でフィルタかければ良いだけな気はするがな
0435デフォルトの名無しさん
2014/01/11(土) 22:19:02.70複数の戻り値っていうのが同じ方(例えば二つの数値とかだったら、
数値型の配列を返すとか。
0436433
2014/01/11(土) 22:19:05.56結果が得られた順に別ブックへ結果を記載して保存される仕組みになっています。
(調査結果(別ブック))
表番号 調査項目 調査結果
2 xx false xx
3 xx true xx
7 xx true xx
5 xx true xx
10 xx false xx
何気にこの状態から表番号を1〜10に補って並べ替えるのも方法が思いつきません、、
逆に1〜10から上の数値を間引く方法もわからない感じです、、
0437ピラフ
2014/01/11(土) 22:25:15.62/ \
/ ─ ─\
/ (●) (●) \
| (__人__) |
\ ` ⌒´ ,/
/ ::::i \
/ / ::::|_/
\/ ::|
| ::::| キュム
i \ ::::/ キュム
\ |::/
|\_//
\_/
0438433
2014/01/11(土) 22:48:47.30>>435
素人なりに1つだけ思いついた方法は
結果値の表番号を一つ一つサーチして該当する行を1行削除するを繰り返し
削除後にソートして寄せると完成しますが
数百回処理を繰り返す必要がり力業っぽい
のでこのやり方は違うかなと思いました
0439デフォルトの名無しさん
2014/01/11(土) 23:13:09.99その程度の処理量を更に削る為に労力を使う方が、初心者らしい愚行だよ
力業でも0.2秒で終る処理を、0.1秒で終るようにするための模索に
何十分や何時間の時間を浪費するとか、バカバカしくてやってられん
0441デフォルトの名無しさん
2014/01/11(土) 23:34:47.28その時間で別の仕事したほうが効率いい
とはいえ、一定以上の効率をもったコードを常に書けるだけの能力を持っていたいとは思うね
そうすりゃパソコン借りる時間が減る=金まわりがよくなるからな
0442デフォルトの名無しさん
2014/01/11(土) 23:38:38.28なぜダメなのかよくわからんな
0443ピラフ
2014/01/11(土) 23:40:07.650444433
2014/01/12(日) 00:27:32.65データーが欠落した状態で結果のみが別のブックへ書き出されている状態でしてフィルタがかけられない状態かと思います。
(フィルタ機能を完全熟知してないので間違っているかもしれませんが)
自分の知識不足ですみません 激しく堂々巡りをしているようですので本日は一旦落ちます。。
0445デフォルトの名無しさん
2014/01/12(日) 00:51:33.87ランダムに存在する特定の数値をスマートに間引く方法 (2,3,5,7,10・・ こういう数を一括削除する)
うまい方法は無いでしょうか?
数時間考えましたが全く解決方法が見つからず吐きそうなのでもう寝ますw
0446デフォルトの名無しさん
2014/01/12(日) 01:07:43.46その数値が一定の法則に従っていない以上、順次検索して間引くしかないわけだが
間引く元シートは準備されてるのか?
だったらそこから結果のシート(ブック)参照して結果有るかないかチェックする列つくって
その列でフィルタすればVBAなんか使わなくてもいいぞ
まあVBAでやるなら>>438のやり方でいいんじゃね
0447デフォルトの名無しさん
2014/01/12(日) 01:31:20.39状況がよく分んないけど、
ADO使ってシートにそういうSQL
投げてやればいいんじゃないの?
0448デフォルトの名無しさん
2014/01/12(日) 03:18:51.28列(フィールド)の区切りは、スペースかタブ?
すべての行の最初の列(表番号)だけを抜き出して、
ファイルAに保存する
(Excelの画面でもできる)
ファイルAをsortコマンドで、
数字でソートして、ファイルBに保存する
(Excelの画面でもできる)
(ここで表番号の重複を考えて、念のために、
ファイルBをuniqueコマンドで、
連続した重複行を除いて、ファイルCへ出力する
ファイルB、Cの行数を比較する
行数が異なっていたらエラー?)
ループ変数をインクリメントさせながら、
ファイルBを1行ずつ読んで、数字を突き合わせる
ファイルBに存在しない数字を、
ファイルDへ出力する
0449448
2014/01/12(日) 03:20:52.50表番号順に並んでいない時の処理です
最初のファイルから、1行ずつ、
最初の列(表番号)を抜き出して、
連想配列のキーとして、
その値に、2列目から改行までを代入する
ファイルBを1行ずつ読んで、
その数字をキーとして、
連想配列の値を取り出して、文字列を連結する
このように処理は、細かく単機能に分けると、
バグを減らせます
sort + uniqueも、よくあるパターン
0450448
2014/01/12(日) 03:33:07.53Excelの画面で、
表番号でソートするだけで出来るわw
0451448
2014/01/12(日) 03:44:48.55まず幾つかのランダムな数字をソートして、
ファイルAへ出力する
(Excelの画面でもできる)
ループ変数をインクリメントさせながら、
ファイルAを1行ずつ読んで、数字を突き合わせる
ファイルAに存在しない数字を、
ファイルBへ出力する
0452448
2014/01/12(日) 05:49:03.84まず幾つかのランダムな数字をソートして、
行区切りで、ファイルAへ出力する
(Excelの画面でもできる)
Excelの画面の、自動ナンバーで、
1-1,000の千行を代入し、ファイルBとして保存する
diffで、両者の差分を取る
0453ピラフ
2014/01/13(月) 21:17:31.14えと、数列の差を求める方法と、要素を削除する方法があって
それぞれこんな感じ。
http://uploda.cc/img/img52d3d869b7f67.png
これらを組み合わせるとできるはずよ。
コードはこんな感じで
https://friendpaste.com/1ooShGbBWBLAPVIitWTlDD?rev=303435326666
0454デフォルトの名無しさん
2014/01/13(月) 21:24:07.27全大文字化とかの表面的なところを隠しても
0455ピラフ
2014/01/13(月) 21:45:43.48完全に間違ってた、こっちで
https://friendpaste.com/1ooShGbBWBLAPVIitWTlDD
>>454
そういうのあるよね。ピラフはCAPICOMのサンプルコードを参考にしてる。
インデントは空白3文字で変数名はアッパーキャメルケース。
変数の宣言は使う直前。
0456デフォルトの名無しさん
2014/01/13(月) 21:47:01.99with を使いまくったら個性的過ぎると怒られたことがある。
0457ピラフ
2014/01/13(月) 21:49:50.33ガハハ、ピラフガハハ。
Withブロックマスターを名乗ったら言いと思うよ。
0458デフォルトの名無しさん
2014/01/15(水) 12:12:50.31桃白白しらない?
0459デフォルトの名無しさん
2014/01/15(水) 13:02:26.08その問に知ってるって答えるくらいなら、初めからコテ変えなんてしない
とかマジレスしてみる
まあ>>458も、その辺を把握している上でのツッコミなんだろうけどw
0460デフォルトの名無しさん
2014/01/16(木) 02:24:37.890461デフォルトの名無しさん
2014/01/16(木) 02:34:02.86Withの使用を辞めることだ。
0462デフォルトの名無しさん
2014/01/16(木) 02:34:59.47ちょっと性格は変だけどスキルはあったし丁寧に回答してた人。
0463デフォルトの名無しさん
2014/01/16(木) 03:26:21.55なるほど。勉強になります。ありがとうございます。
0464デフォルトの名無しさん
2014/01/16(木) 09:11:14.50たんすの前で何を着て出てくるか悩んでるよ
0465デフォルトの名無しさん
2014/01/16(木) 09:47:10.65何人か居るけど、誰のこと言ってるの?
0466デフォルトの名無しさん
2014/01/16(木) 09:51:25.46Parentプロパティ
0467デフォルトの名無しさん
2014/01/16(木) 15:38:16.990468デフォルトの名無しさん
2014/01/18(土) 15:56:54.23あるフォルダにある画像ファイル(ファイル名は選択範囲のselectされたセルの中)をすべて縮小(たとえば70%)して上書き保存させるにはどうすればいいですか?
他のフリーソフトの助けを借りるのでもいいです。
0469デフォルトの名無しさん
2014/01/18(土) 16:30:55.58その処理の内、何処まで出来てて、どこが解らないの?
まさか、1から全部コード書いて差し出せとか言わないよね?
0470468
2014/01/18(土) 16:44:55.37画像縮小だけがわかりません。
下が自作コードです。
=====================================
Sub Unko()
Dim C As Range
Const PATH As String = "C:\Manko"
For Each C In Selection
SizeSmall (PATH & "\" & C.Value)
Next C
End Sub
Sub SizeSmall(F As String)
■■■ここが分からないのです■■■
End Sub
=====================================
0471デフォルトの名無しさん
2014/01/18(土) 17:02:29.21つ ImageMagick
WinAPI使う方法とか、ActiveX導入する方法とか、Imageコントロール使う方法とかいろいろあるけど
とりあえずImageMagickで目的は果たせるから、それ以上を望むなら勝手に勉強してね
0472デフォルトの名無しさん
2014/01/18(土) 17:03:29.95バカじゃねw
0473470
2014/01/18(土) 17:13:43.13ありがとうございます。
これですね。
http://ja.wikipedia.org/wiki/ImageMagick
素晴らしそうですね。
ところが質問です。
[Q1] WikiにVBAと書いてないけど大丈夫ですか?
[Q2] VBAのコードに書くにはどんな呪文を唱えればいいですか?
0474デフォルトの名無しさん
2014/01/18(土) 17:16:26.190475470
2014/01/18(土) 17:17:25.84神に誓いますか?
0476デフォルトの名無しさん
2014/01/18(土) 17:19:37.65コマンドラインで使うのに、VBAも糞も無いだろw
0477デフォルトの名無しさん
2014/01/18(土) 17:20:30.89何をですか?
0478デフォルトの名無しさん
2014/01/18(土) 17:20:33.50糞は便器の中にありますよ
0479デフォルトの名無しさん
2014/01/18(土) 17:21:40.19誰がコマンドで使うと言いましたか?
ImageMagickはVBAで使えない
~~~~~~~~~~~~~~~~~~~~~~~~~~
0480デフォルトの名無しさん
2014/01/18(土) 17:29:32.870481デフォルトの名無しさん
2014/01/18(土) 17:42:38.570482デフォルトの名無しさん
2014/01/18(土) 17:46:54.09世の中に出回ってるフリーソフトの何割くらいがこの「コマンドラインからの利用」に対応してますか?
「コマンドラインからの利用」ができればどうにかすればVBAでも使えるんだろ?使える気がする。だから可能性が広がる。
0483デフォルトの名無しさん
2014/01/18(土) 18:23:38.440484デフォルトの名無しさん
2014/01/18(土) 23:22:26.46コピーして別アプリに張り付けるとかならやったことあるけど
プロパティでサイズってないのかな?
0485デフォルトの名無しさん
2014/01/18(土) 23:23:46.330486デフォルトの名無しさん
2014/01/18(土) 23:25:41.070487デフォルトの名無しさん
2014/01/19(日) 00:19:07.250488デフォルトの名無しさん
2014/01/19(日) 07:42:05.86Microsoft Shell Controls And Automation に参照チェックして出来る
というか以前自分のPCのフォルダに有る画像一覧のサイズを貼り付けるのを作ったことはあるけどね
0489デフォルトの名無しさん
2014/01/19(日) 08:26:53.48画像のサイズは基本的にヘッダに格納されてるから、バイナリ読めば解るし
StdPictureオブジェクトに格納すれば、Twips単位での取得は簡単にできるよ
でも、ファイル名とかは、ファイル名を書き換えるだけで意味があるけど
画像サイズは、ヘッダのサイズを書き換えても、画像データを変換しなければ
画像の実サイズとヘッダ上に記されたサイズ情報が不整合を起こすだけなので
サイズプロパティがあれば、サイズ変更が出来るってものじゃない
重要なのは「情報」の書き換えではなく「実体」の変換だからね
塩の入った容器のラベルを「砂糖」に貼り替えても、中身の入れ替えをしなかったら
中身は塩のままなのと同じ
0490デフォルトの名無しさん
2014/01/19(日) 11:52:49.86Excelワークシートに貼り付けられた画像ファイルの縮小をしたいんじゃないかと思うんだが
0491デフォルトの名無しさん
2014/01/19(日) 23:10:35.11クラスモジュールを使うことはないの?
どの入門書でも標準モジュールしか扱ってない。
0492デフォルトの名無しさん
2014/01/19(日) 23:36:56.500493491
2014/01/19(日) 23:49:52.75そんな本ありますか?
0494デフォルトの名無しさん
2014/01/20(月) 00:16:34.660495491
2014/01/20(月) 01:10:09.85その書の名は?
0496デフォルトの名無しさん
2014/01/20(月) 01:18:10.65自分で検索もできないような人間にクラスが使えるとは思えないけど、ほれ
http://www.kinokuniya.co.jp/f/dsg-01-9784816336515
0497491
2014/01/20(月) 01:39:46.172003じゃないか。
売り切れじゃないか。
0498デフォルトの名無しさん
2014/01/20(月) 02:04:59.15国外追放レベルのバカだな
Excelのバージョンが変わってもクラスの使い方なんてほぼ同じだし、本屋はここ1軒だけじゃないし
世の中には図書館という便利な物がある
この程度のこといちいち教えなきゃわからんのか
おまえはプログラミングするな質問するなするな迷惑だ
0499491
2014/01/20(月) 02:23:26.65もともとおかしいんだよ、きみの顔は。
http://blog-imgs-48.fc2.com/a/y/a/ayaushi/201303301847509b1.jpg
0500デフォルトの名無しさん
2014/01/20(月) 07:17:48.73自分の品位を貶めるだけの行為だって気付かないのかな?
まぁ>>498も口が悪いが
「確かにその通りだけど、国外追放レベルはヒドス・゚・(つД`)・゚・ 」
くらいの、余裕を持った返しが出来る大人になろうぜ
0501デフォルトの名無しさん
2014/01/20(月) 07:22:07.74まぁVBAでそんなに無理してまでクラスモジュールを使わなくてもコードは組めるってことだね。
本当にきちんとクラスについて勉強したいなら、JavaやC#を勉強した方がいい。
VB.Netですらデザインパターンを踏襲した様なきちんとした本は見たことが無い。
0502デフォルトの名無しさん
2014/01/20(月) 08:19:32.85継承とかコンストラクタに引数渡せないとかたいして便利じゃないから
あとクラス毎にモジュール作ることになるけどモジュールを階層で管理する機能とかないから面倒だし
0503デフォルトの名無しさん
2014/01/20(月) 08:43:55.01そりゃ昨今のメジャーな言語と比べて、相対的に便利かと言ったら便利じゃないけど
どの言語を使うかって話ではなく、VBAを使う上でクラスを活用するかどうかって話では
他言語と比べて便利かどうかという相対的な話ではなく、絶対的に便利かどうかであって
その観点で見れば、スキルさえあれば十分便利に活用できる
いろいろ不足はあってもどかしい部分も多いけど、使わないよりは使った方が遙かに便利という意味でね
0504デフォルトの名無しさん
2014/01/20(月) 10:46:52.40その例えで行くなら、VBAを使う上でクラス有りとクラス無しを比較して相対的にどうか、って考えなきゃ
0505デフォルトの名無しさん
2014/01/20(月) 11:54:18.370506デフォルトの名無しさん
2014/01/20(月) 14:18:53.69インターフェイス継承はできるし、どうしても引数ありでオブジェクトを作りたいならFactoryメソッドを作ればいい。
> あとクラス毎にモジュール作ることになるけどモジュールを階層で管理する機能とかないから面倒だし
機能毎にアドインにまとめればいいんじゃないかな。
0507デフォルトの名無しさん
2014/01/20(月) 14:37:20.31http://www.objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/dp-ocp-2.html
の音符の例。
Note.cls:
Public Sub Play()
End Sub
Half.cls:
Implements Note
Private Sub Note_Play()
Debug.Print "play half"
End Sub
Quater.cls:
Implements Note
Private Sub Note_Play()
Debug.Print "play quater"
End Sub
(続く)
0508デフォルトの名無しさん
2014/01/20(月) 14:38:35.12Staff.cls:
Private mNotes As New collection
Public Sub AddNote(ByRef aNote As Note)
mNotes.Add aNote
End Sub
Public Sub Play()
Dim aNote As Note
For Each aNote In mNotes
aNote.Play
Next
End Sub
Module1.bas:
Sub PlayStaff()
Dim myStaff As New Staff
myStaff.AddNote New Half
myStaff.AddNote New Quarter
myStaff.AddNote New Half
myStaff.Play
End Sub
という感じでVBAでも実現可能。
(Collectionが順番を保証しないというのは、今回は無視)
0509デフォルトの名無しさん
2014/01/20(月) 14:53:56.460510デフォルトの名無しさん
2014/01/20(月) 15:09:55.04基本的にはAddした順だけど、仕様としてそれは保証されてない
0511デフォルトの名無しさん
2014/01/20(月) 22:32:00.44指定位置勝手に変わると話にならんわけだが、ホントに保障されてないのか?
0512デフォルトの名無しさん
2014/01/20(月) 22:59:04.99仕様見ればわかることを他人に聞くな
0513デフォルトの名無しさん
2014/01/21(火) 00:04:41.49Object指向言語というより
Object指向に片足突っ込んだ構造化言語かな。
どうもMicroSoftはこんな片足突っ込んだような状態が好きなのか、
.Netフレームワークも関数型言語に片足突っ込んだObject指向言語っぽいよね。
「Object指向は考え方」って人もいるだろうけど、VBAの場合は上のレスに有ったような
面倒なストラテジーパターンも、.Netではシュチュエーション次第でもっと簡単なテンプレートパターンで書けるしね。
0514デフォルトの名無しさん
2014/01/21(火) 01:11:35.57>>502 は別に他の言語と比較してる訳じゃないんだが...
まあ、使いたいなら使えばいいんじゃね?
スキル誇示したいお年頃みたいだし (w
0515デフォルトの名無しさん
2014/01/21(火) 06:25:03.06インターフェース継承って何?
このコードの内、何が何を継承してるの?
見た感じ、インターフェースを実装して
処理を移譲することで似たような効果をもたらしているだけにしか見えないんだけど。
0516デフォルトの名無しさん
2014/01/21(火) 08:12:19.84こういうのを得意気に語ってた時期もあったなぁ... (遠い目)
0517デフォルトの名無しさん
2014/01/21(火) 09:30:04.82皆に否定されて悔しかったんだね...わかります (w
0518デフォルトの名無しさん
2014/01/21(火) 10:10:47.90こういうのを得意気に語ってた時期もあったなぁ... (遠い目)
0519デフォルトの名無しさん
2014/01/21(火) 10:25:24.40用語等については異論もあるでしょうが、重要なのは>>507のリンク先のC++のポリモーフィズム同等のことがVBAでも実現できることです。
この範囲で実現できるものであれば、VBAでもクラスが活躍できます。
それから、言わずもがなですが、クラスを使うことによるカプセル化の恩恵も受けます。
このことは、xUnitと親和性が高いです。
それと、WithEventsを使ったExcelオブジェクトとのEventを介したやり取りも便利です。
0520デフォルトの名無しさん
2014/01/21(火) 16:57:10.56INPUT: URL
OUTPUT: 「ショートカットファイル」 on デスクトップ
ファイル名はなんでもいいです。
■ このスレッドは過去ログ倉庫に格納されています