12/11/25 20:19:47.50
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 質問スレ Part26
スレリンク(tech板)
2:デフォルトの名無しさん
12/11/25 20:20:18.07
関連スレ:VBAなんでも質問スレ
スレリンク(tech板)
3:デフォルトの名無しさん
12/11/25 20:26:49.17
わからなければとりあえず Alt, T, M, R
T, M, R
T, M, R
4:デフォルトの名無しさん
12/11/25 20:29:39.60
新しいスレッドを立ててくださいです。。。
くださいです。。。
。。。
くださいです (ワラ
5:デフォルトの名無しさん
12/11/25 20:32:51.83
ある特定のシートに関連づいたWindowオブジェクト(複数ある場合もあり?)を取得するにはどうすればいいんでしょうか
WorkbookのWindowsプロパティやActiveWindowだと
状況によって意図しないWindowを取得してしまいそうなんですが
6:デフォルトの名無しさん
12/11/25 22:27:14.08
大阪マラソンのページで、ここにナンバー(4ケタ)を入れて検索すると、走った人の名前とゴールタイムや各5kmごとの区間タイムが出てきます
URLリンク(p.twpl.jp)
できるだけたくさんのデータをVBAを使って収集したいのですが、
そのために使用するブラウザを操作してwebからデータを集めるための使用するステートメントや関数などのコードは
どんなものがあるか代表的なものから便利なものまでひととおり教えていただけませんか?
お約束のようなので付け加えますと
(この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
7:デフォルトの名無しさん
12/11/25 23:23:56.04
Excel VBAの勉強にオススメの本かサイトなどあれば教えてください
8:デフォルトの名無しさん
12/11/26 00:11:55.40
>>7
MSDNライブラリ
9:デフォルトの名無しさん
12/11/26 00:16:20.29
>>7 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
10:デフォルトの名無しさん
12/11/26 00:31:24.22
正直な話、VBAはド素人でも何とか書けちゃう言語なのに
本とかサイトに沿って勉強しようとしてる時点で向いてない気がするよ
とりあえず書いて困ったら検索の方が合ってる言語だと思う
大抵やりたいことをぐぐれば答えが見つかるし
11:デフォルトの名無しさん
12/11/26 01:40:29.54
>>10
それは他言語の経験がある人の場合だな
どんなに簡単な言語でも素人がいきなり書くのは無理
アルゴリズムとか変数の概念とか、言語の種類に関係ない基本事項はやっぱりきちんと勉強しないと
12:デフォルトの名無しさん
12/11/26 01:44:25.23
>>6
最近のマラソンは仮装して走るのがブームらしいね
先週はこんな人が優勝してる
URLリンク(24.media.tumblr.com)
13:7
12/11/26 01:46:15.16
そんなに難しく考えるようなものじゃないんですね
ありがとうございます
14:デフォルトの名無しさん
12/11/26 03:01:49.13
○ ∇ 、,、´`゙;~、 ';冫 ☆
┏ ━ゝヽ''人∧━∧从━〆A!゚━┓。
╋┓"〓┃ < ゝ\',冫。' ∩___∩ ゛△│´'´,.ゝ'┃. ●┃ ┃┃
┃┃_.━┛ヤ━━━ | ノ ヽ━━━━━ ━┛ ・ ・
∇ ┠─Σ-/ ● ● | ァ Ζそ,´; ┨'゚,。
.。冫▽ < | ( _●_) ミ 乙 ≧ ▽ >>1乙
。 ┃ 彡、 |∪| 、`\ │ て く
┠─./ __ ヽノ /´> )'.┼ ァ Ζ┨ ミo''`
。、゚`。、 (___) / (_/' × 个o
○ ┃ `| / !ヽ.◇ o┃
┗〆━┷ Z,.' /┷━''o ヾo┷+\━┛,゛;
ヾ '、´ ∇
15:デフォルトの名無しさん
12/11/26 05:29:33.77
>>12
トップだけあって、お面と足の筋肉のギャップが凄いなw
16:デフォルトの名無しさん
12/11/26 18:45:48.12
>>3
多摩レボリューションだっけ?
17:デフォルトの名無しさん
12/11/26 20:30:34.97
そろそろ>>6がとんでもないリンクを貼ってしまったことに気付く頃合かな
18:6
12/11/26 21:17:48.15
失礼(汗。
こちらでした。
URLリンク(www.moviecloud.jp)
19:デフォルトの名無しさん
12/11/27 12:51:37.37
動的配列をdimで宣言しておいて、後からredimで要素数を指定する、
という使い方の場合、
その配列が
redimしてあるかどうかを調べる方法ってありますか?
別プロシージャから引数で渡された配列を処理する時に、
宣言だけでredimされていない変数は処理をスキップしたいのですが、
isarrayでは区別できませんでした。
(要素数が指定されてなくてもtrueになってしまう。)
使用しない変数にもredim (0) をするのは、
コードの改修がかなり必要になるので、出来れば避けたいです。
何か良い方法がありましたらアドバイスいただけると幸いです。
20:19
12/11/27 13:02:23.62
書き忘れてましたが、何故処理をスキップしたいのかというと、
redimされてない変数を処理すると
実行時エラー '9':
インデックスが有効範囲にありません。
というエラーがでるからです。
21:デフォルトの名無しさん
12/11/27 13:53:38.86
>>20
なんだろう、この気持ち悪さは
22:デフォルトの名無しさん
12/11/27 14:51:52.95
>>20
それ単なるバグじゃ?
23:デフォルトの名無しさん
12/11/27 15:43:04.91
>>20
UBound
24:19
12/11/27 15:53:11.68
>>22
そうです、私の書いたコードのアルゴリズムがまちがってるので
エラーになります。
根本的に直すのは複数箇所の修正が必要になるので、
小手先でごまかそうと考えて先の質問をしました。
>>23
ありがとうございます。
残念ながらuboundもダメでした。やはり
インデックスの有効範囲~
のエラーになります。
25:桃白白
12/11/27 16:04:24.14
>>24
あろーはー。例外捕まえちゃったら?
Array関数で作った要素数0の配列は0から-1までになるから
これを真似しちゃったらいんじゃない。
UBound(a) - LBound(a) + 1で要素数を求めるときにも整合性取れるし。
こんな感じで。
URLリンク(friendpaste.com)
26:デフォルトの名無しさん
12/11/27 16:08:10.23
>>24
On Error
27:19
12/11/27 16:08:11.75
連投すみません
とりあえず、邪道ですがエラートラップを用いて応急的に対策しました。
お騒がせして申し訳ありませんでした。
ちなみにこんな感じです。
On Error Resume Next
If UBound(hoge) < 0 Then
On Error GoTo 0
Else
On Error GoTo 0
[本来の処理]
End If
28:19
12/11/27 16:11:50.63
すみません。リロードしてませんでした。
アドバイスありがとうございました。
今後の参考にさせて頂きます。
29:デフォルトの名無しさん
12/11/27 16:12:40.19
「配列 空 vba」とかでググったらいっぱいヒットするけど・・・
30:19
12/11/27 16:22:47.40
>>29
どうもすみません、教えていただいたキーワードでぐぐったら出てきました。
大変参考になりました。
URLリンク(app.m-cocolog.jp)
ここにあった not not で解決でした。
皆様ありがとうございました。
31:デフォルトの名無しさん
12/11/27 16:56:47.35
いずれにしても、関数にした方がいいよ。
If not not varArray Then
とか、何を調べてるのかぱっと見意味不明だし。
If IsVarArrayEmpty(varArray) Then
とか
If Not IsVarArrayEmpty(varArray) Then
だったらわかりやすいでしょ。
32:デフォルトの名無しさん
12/11/27 21:56:55.29
色々調べたのですが突破口が見つかりません。
質問させてください、お願いします。
・Windows7,Office2007です。
1
2
1
0.5
2
…
と、D行に数字がありまして、合計8になるように並び替えたいのです。
もし、1+2+0.5…=7.5となった段階で、次の並びが1、2、0.5となっていた場合は、
1や2ではなく、0.5を選択したいです。
そして、1や2が入っていた行の上に、0.5が入っていた行を持ってきたいのです。
これを、配列がなくなるまで続けたいのですが、どのようにすればいいかが掴めません。
ご教授、宜しくお願いします。
33:デフォルトの名無しさん
12/11/27 22:06:42.34
>>32
質問1 数字は0.5、1、2の3通りだけ?
質問2 全体の合計は8の倍数になってる?整理したらきっちり最後まで「合計8」のグループに分けられる?
34:デフォルトの名無しさん
12/11/28 00:31:29.04
あれ、書き込んでなかった
困ってること:文字列(フォント)の横幅dot数を調べたい
Graphics.MeasureString メソッドがあればいいんだけれど、エクセルなので・・・
どうしたらいいでしょうか
35:デフォルトの名無しさん
12/11/28 01:20:43.77
>>34
GetTextExtentPoint32
36:デフォルトの名無しさん
12/11/28 01:22:49.74
うおーありがとうございます
37:32
12/11/28 02:13:13.20
>>33
ご回答ありがとうございます。
質問1 数値自体はその3つのみです。
質問2 いえ、全体の合計は不明です 少なくとも、8の倍数キッカリには収まりません
38:デフォルトの名無しさん
12/11/28 02:31:18.33
>>32>>37
ループ(
1 D行を足す、列番号を取得
2 8未満である
Y→1
8である
Y→ループ抜ける
8以上である
Y→最後の加算を破棄して次の列にいく→1
)
3 取得した列番号を基に列を入れかえる
39:デフォルトの名無しさん
12/11/28 02:37:08.01
>>32
まず一点、誤りを指摘すると、
エクセルでは「D行」とはいわず「D列」といいます。
「行」というのは1~の縦方向、
「列」というのはA~の横方向の呼び方です。
それであなたの質問に対する確認なのですが、
行を入れ替える条件はもっと限定できませんか?
たとえば、
1
2
2
2
0.5
1
2
0.5
と並んでいたら
1+2+2+2+0.5…(2個飛ばして)+0.5
で8ですが、
1+2+2+2…(1個飛ばして)+1
も8になります。
つまり数値の取り方に複数の候補がある場合、
どれを優先すればよいのかがよく分からないのです。
その部分はもっと厳密に説明する必要があると思います。
40:デフォルトの名無しさん
12/11/28 03:24:12.41
自由に並べ替えていいんなら全体を降順ソートすれば一発で終わるんだけど
41:デフォルトの名無しさん
12/11/28 04:02:04.18
>>40
身も蓋もないことを
42:32
12/11/28 08:57:48.88
>>38 ありがとうございます、早速試してみます
>>39 すみません、初歩的なミスでしたorz
順番ですが、上にあるもの程、優先になります。
その例ですと、1+2+2+2+0.5…(2個飛ばして)+0.5
を選択し、飛ばした先にある0.5を、
1+2+2+2+0.5 の次に並び替えるようにしたいです。
>>40 説明不足でした、優先順位がありますorz
43:デフォルトの名無しさん
12/11/28 18:28:43.80
つかここアルゴリズムスレじゃないんだから、方法は自分で考えろよ
その方法をVBAで実装する段階になってから質問しろや
44:32
12/11/28 18:32:59.44
皆様、ご指導ありがとうございます。
>>38さんのアドバイスを参考に、
汚いソースになりましたが、なんとか完成致しました。
スレ汚し、失礼しました
45:34
12/11/28 18:34:40.00
更にお願いします
というかここでいいのかわからんけど
Excel2000 64bit機でGetTextExtentPoint32を動かす方法教えてください
Excel2000 32bit機では正常に動作しました
Office2007 64bit機で動作させるにはPtrSafeを挿入すればいいらしいんですが不明です
Excel2000 64bit機でPtrSafeがコンパイルエラーになってしまいます
GetTextExtentPoint32の使用はここを参照にしました
URLリンク(tamagolab.raindrop.jp)
46:デフォルトの名無しさん
12/11/28 18:43:41.56
Excel2000に64bitバージョンなんてあったか?
どっちにしてもOSの情報わからんと何とも言えんわ
47:34
12/11/28 19:09:14.68
win7 64bit機です
何か勘違いしてたかも
>>45の
19: hWnd = Application.hWnd
でエラーが発生して動作しなくなりました
winXP 32bit機 Excel2000の入ってるPC引っ張り出してきて実行したところ
オブジェクトはこのプロパティまたはメソッドをサポートしていません
とエラーを生成しました
PC環境で実行できたり出来なかったりするんですが、何か参照設定が必要だったりするのでしょうか
48:34
12/11/28 19:22:47.39
・・・ああ判った
Application.hWnd てexcel2000じゃサポートしてないのか
ってことですよね
49:デフォルトの名無しさん
12/11/28 20:34:16.35
>>48
PtrSafe
50:デフォルトの名無しさん
12/11/28 21:29:13.31
まず、
OSに32/64ビットの区別があること
EXCELに32/64ビットの区別があること
を理解してから出直してください
51:デフォルトの名無しさん
12/11/28 21:43:29.61
Long Long Ago問題か?
52:デフォルトの名無しさん
12/11/28 22:06:49.53
bit数とかPtrSafe以前にExcel2000じゃ動かないって話
OSとか関係ないって突っ込んでるの一人もいない・・・
53:デフォルトの名無しさん
12/11/29 12:17:23.26
楽しみは最後までとっておくタイプ
54:デフォルトの名無しさん
12/11/29 13:30:43.87
>>47
Excel2000の時代にはウィンドウハンドルが簡単に拾えるApplication.Hwnd なんて
便利なものは無かったからな。
Excel2000も守備範囲なら API FindWindow でExcelのウィンドウハンドルを取得
するようにしておけば新旧Excelで使える。数行増えるだけだし。
ってVBAからだんだん離れるのであとはググれ
55:デフォルトの名無しさん
12/11/29 17:50:02.29
>>50
でもExcel2000は32bitしかないでしょ。
13年前のソフトだよ?
56:デフォルトの名無しさん
12/11/30 18:40:44.70
助けて下さい!マジではまってます。
指定したディレクトリの中にあるファイル一覧を取得しようと
下記コードを書いたのですがなぜか、エラーが出てしまいます。
どこに問題があるのでしょうか?
Dim path_test As String
path_test = "C:\test"
Dim file_count As Integer
file_count = 0
strFileName = Dir(path_test & "\*.*", vbNormal)
Do While strFileName <> ""
strFileName = Dir() '★エラー発生★
file_count = file_count + 1
Loop
★エラー発生★
実行時エラー'5': プロシージャの呼び出し、または引数が不正です。
57:デフォルトの名無しさん
12/11/30 18:47:30.11
strFileName = Dir() ここ
58:デフォルトの名無しさん
12/11/30 19:08:22.96
>>57
エラーの起きる場所は分かってるのですが
strFileName = Dir() ← なぜここでエラーになりますか?
ネットで解説されたコードをそのまま利用しているのですが
その解説サイトの人は特にエラー発生の可能性については言及していませんでした。
59:デフォルトの名無しさん
12/11/30 19:16:01.88
>>56
これが全ソースコード?
このコードだけをサブプロシージャにしてエラーが出るの?
変数の命名ルールがキショいね
60:桃白白
12/11/30 19:24:36.72
>>56
そのコードには問題ないアルよ。
最初のDirを忘れてたり再帰でぐーるぐるしてたりするんじゃない?
桃白白はそういう疑念を持っています。
61:デフォルトの名無しさん
12/11/30 19:25:31.16
strFileNameをint指定してるのに、Dir()格納できねええだろ
フォルダ名一覧取得するためにstrFileNameとやらの中身に入れるなら別のstring型変数いれないと
62:デフォルトの名無しさん
12/11/30 19:28:37.98
あ、ごめん適当なこといった
C:\testってちゃんとフォルダが存在するよね?
63:デフォルトの名無しさん
12/11/30 19:43:20.30
Adodbオブジェクトは実は全力の5%位の力しか使っていないと聞きました。全力を使ったらどうなるのでしょうか?地球が壊れますか?また、どんなメソッドが使えるのでしょう。
良かったら教えて下さい
64:デフォルトの名無しさん
12/11/30 19:44:13.23
>>56
こいつ・・・動くぞ・・・!
65:デフォルトの名無しさん
12/11/30 20:01:42.85
>>56
tempフォルダかその中のファイルに、アクセス権のないのがあるんじゃ?
66:56
12/11/30 20:02:47.65
>>59
問題となる部分のコードです。
一部ネット上に転がっていたソースを流用している為です。
>>60 >>61 >>62
再起処理はやっておりません。
また、 c:\test も存在しています。
私の環境が問題なのかなぁ?
Excel2010 でマクロ組んでるんですけどん。
67:デフォルトの名無しさん
12/11/30 20:50:27.10
>>65
tempじゃなくてtestだった
フォルダなくてもエラーにはならないっぽいから、フォルダはあるのに
ファイルかフォルダにアクセス権ないんじゃ?
68:デフォルトの名無しさん
12/11/30 20:58:36.04
>>66
問題となる部分かどうかはお前が判断するな
全コードを提示して
69:デフォルトの名無しさん
12/11/30 21:13:43.14
普通にExcelで、セルの色とかフォントの色を変えたいとき
ツールバーの該当コマンドボタンの▼をクリックするとカラーパレットが展開されて
そこから色を選ぶことができるんだけど
例えば
セルに下線を引くマクロを作ったとして、複数セルを選択し
・マクロボタンの▼をクリックして、カラーパレットが展開されて、「カラーを選んで下線を引く」
フォントの既定組み合わせ{明朝11、明朝13、ゴシック10、ゴシック11、ゴシック13}等を設定しておき
・マクロボタンの▼をクリックして、フォント・フォントサイズの組み合わせから選択して「フォントを変更する」
みたいなことってできますか?
70:デフォルトの名無しさん
12/11/30 21:36:36.33
できる
71:デフォルトの名無しさん
12/11/30 22:18:21.46
右クリックやツールバーからできることは大体できる
書式設定とか普通
72:デフォルトの名無しさん
12/11/30 22:52:14.28
>>66
ちなみにエラーが発生したとき、
変数"file_count"の値はどうなってます?
(コード中断時に file_count の上にマウスカーソル持ってくれば値が表示されます)
73:デフォルトの名無しさん
12/12/01 00:57:31.13
>>72
ありがとうございます。
どうしてもDirを使った方法だとできなかったので Fileうんたらの方法を使ってうまくいきました。
74:デフォルトの名無しさん
12/12/01 01:39:54.57
VBA エディタで行番号を表示させる事は出来ないのでしょうか?
75:デフォルトの名無しさん
12/12/01 01:47:50.06
>>74
アドイン公開してる人がいたような
ググればすぐに見つかるはず
76:デフォルトの名無しさん
12/12/01 08:06:00.76
セルに入力させるにあたって、1又は9以外を入力させたくないんですが、そういうことって出来ますか?
77:デフォルトの名無しさん
12/12/01 08:17:19.22
>>76
VBAではないが
セルに入力規則を設定して
マウスで候補を選ばせるのはどう?
78:デフォルトの名無しさん
12/12/01 09:06:41.20
>>77
入力規則のこと忘れてました^^;
それが良いですね。ありがとです
79:デフォルトの名無しさん
12/12/01 09:11:06.92
>>76
>>77の方法が一番簡単だけど、
どうしてもVBAでやりたかったら対象のシートにこんなマクロを設定してみる。
特定のセルのみの設定なら修正が必要。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tmpRange As Range
For Each tmpRange In Target
If tmpRange.Value <> 1 And tmpRange.Value <> 9 Then
tmpRange.Value = ""
End If
Next
End Sub
80:デフォルトの名無しさん
12/12/01 09:34:57.53
>>79
ありがとう。今やってんのはC3セルのみなんで
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = "$C$3" Then
If Range("c3").Value <> 1 And Range("c3").Value <> 9 Then
MsgBox "値は1,9のいずれかのみ 訂正!", vbOKOnly
End If
End If
Application.EnableEvents = True
End Sub
という事にしました。入力規則も簡単で良いんですが、VBAの勉強も兼ねて^^;
81:デフォルトの名無しさん
12/12/01 11:28:36.00
そりゃだめだC3を含んだ複数セルをコピペした場合そのチェックは動かない
targetをFor EachしてC3セルだった場合にだけチェックするように書き換えないと
これはVBA以前の問題で全てのケースを洗い出す想像力大切よ
82:デフォルトの名無しさん
12/12/01 12:17:58.08
チェンジ かつ 固定セルなら
V = Range("$C$3").Value
If V <> 1 And V <> 9 Then MsgBox "$C$3 is 1 or 9 only.", vbOKOnly
でいいじゃん入力規則でいいじゃん
83:デフォルトの名無しさん
12/12/01 12:28:30.43
入力規則の方が高速でいいよな
84:デフォルトの名無しさん
12/12/01 13:52:56.94
人間が介在する作業で高速もクソもないだろ
どうがんばっても人間の指の方が遅いんだから
85:デフォルトの名無しさん
12/12/01 20:37:23.52
スループットは確かに人間が介在したらそこがネックになるけど
操作する人間に対するレスポンスが早いか遅いかって話で、操作性の問題だな
人間の感覚でとらえられないぐらいの差ならどうでもいい
86:デフォルトの名無しさん
12/12/01 21:08:25.23
VBA で
c:\test\ を
c:\test
という具合に末尾の \ を削除したいのですがどうすれば末尾の特定文字を削除する事が出来ますか?
87:デフォルトの名無しさん
12/12/01 21:13:58.31
自己解決
left でいけた。いkぅぅう
88:デフォルトの名無しさん
12/12/01 21:51:02.08
>>80
それだけのためにマクロ入れたらxlsmにするとかマクロ有効にするとかで嫌がられないか?
89:デフォルトの名無しさん
12/12/01 21:51:36.03
leftってまさか、なんでもかんでも一文字削ってるんじゃ…
90:デフォルトの名無しさん
12/12/02 14:47:52.43
HTTP/HTTPSで通信を行い、JSONPのデータをデコードして
セルに書き出すようなExcelVBAのサンプルなどはございますでしょうか?
よろしくお願いいたします。
91:デフォルトの名無しさん
12/12/02 15:03:44.97
そんなCOMはねえな
92:デフォルトの名無しさん
12/12/02 15:06:15.54
と思ったらJScript使えばそのままいけるのか
「vba HTTP/HTTPSで通信を行い、JSONP」でぐぐれ
93:デフォルトの名無しさん
12/12/02 15:49:07.67
>>92
ありがとうございmす、さっそくググってきます!