1read 100read
2013年01月プログラム15: Excel VBA 質問スレ Part27 (502) TOP カテ一覧 スレ一覧 2ch元 削除依頼
Pythonのお勉強 Part47 (919)
C++11/C++1y 16 (423)
サウンドプログラミング5 (697)
DarkBASIC (467)
C、C++の最適化について語るスレ 3 (833)
C#で仕事ある? (816)

Excel VBA 質問スレ Part27


1 :2012/11/25 〜 最終レス :2013/01/16
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
http://toro.2ch.net/test/read.cgi/tech/1345363310/

2 :
関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/

3 :
わからなければとりあえず Alt, T, M, R
T, M, R
T, M, R

4 :
新しいスレッドを立ててくださいです。。。
くださいです。。。
。。。
くださいです (ワラ

5 :
ある特定のシートに関連づいたWindowオブジェクト(複数ある場合もあり?)を取得するにはどうすればいいんでしょうか
WorkbookのWindowsプロパティやActiveWindowだと
状況によって意図しないWindowを取得してしまいそうなんですが

6 :
大阪マラソンのページで、ここにナンバー(4ケタ)を入れて検索すると、走った人の名前とゴールタイムや各5kmごとの区間タイムが出てきます
http://p.twpl.jp/show/orig/htR9M
できるだけたくさんのデータをVBAを使って収集したいのですが、
そのために使用するブラウザを操作してwebからデータを集めるための使用するステートメントや関数などのコードは
どんなものがあるか代表的なものから便利なものまでひととおり教えていただけませんか?
お約束のようなので付け加えますと
(この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)

7 :
Excel VBAの勉強にオススメの本かサイトなどあれば教えてください

8 :
>>7
MSDNライブラリ

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

10 :
正直な話、VBAはド素人でも何とか書けちゃう言語なのに
本とかサイトに沿って勉強しようとしてる時点で向いてない気がするよ
とりあえず書いて困ったら検索の方が合ってる言語だと思う
大抵やりたいことをぐぐれば答えが見つかるし

11 :
>>10
それは他言語の経験がある人の場合だな
どんなに簡単な言語でも素人がいきなり書くのは無理
アルゴリズムとか変数の概念とか、言語の種類に関係ない基本事項はやっぱりきちんと勉強しないと

12 :
>>6
最近のマラソンは仮装して走るのがブームらしいね
先週はこんな人が優勝してる
ttp://24.media.tumblr.com/tumblr_mdqqq5Pgot1qziltwo1_500.jpg

13 :
そんなに難しく考えるようなものじゃないんですね
ありがとうございます

14 :
          ○   ∇ 、,、´`゙;~、  ';冫 ☆
           ┏  ━ゝヽ''人∧━∧从━〆A!゚━━┓。
 ╋┓"〓┃  < ゝ\',冫。' ∩___∩ ゛△│´'´,.ゝ'┃.      ●┃ ┃┃
 ┃┃_.━┛ヤ━━━━━ | ノ      ヽ━━━━━━━━━  ━┛ ・ ・
        ∇  ┠─Σ-/  ●   ● |  ァ Ζそ,´; ┨'゚,。
           .。冫▽ < |    ( _●_)  ミ  乙  ≧   ▽        >>1
         。 ┃   彡、   |∪|  、`\ │   て く
           ┠─./ __  ヽノ /´>  )'.┼ ァ Ζ┨ ミo''`
         。、゚`。、 (___)   / (_/' ×  个o
        ○  ┃   `|       /   !ヽ.◇    o┃
            ┗〆━┷ Z,.' /┷━''o ヾo┷+\━┛,゛;
       ヾ                   '、´    ∇

15 :
>>12
トップだけあって、お面と足の筋肉のギャップが凄いなw

16 :
>>3
多摩レボリューションだっけ?

17 :
そろそろ>>6がとんでもないリンクを貼ってしまったことに気付く頃合かな

18 :
失礼(汗。
こちらでした。
http://www.moviecloud.jp/osaka2012/

19 :
動的配列をdimで宣言しておいて、後からredimで要素数を指定する、
という使い方の場合、
その配列が
redimしてあるかどうかを調べる方法ってありますか?
別プロシージャから引数で渡された配列を処理する時に、
宣言だけでredimされていない変数は処理をスキップしたいのですが、
isarrayでは区別できませんでした。
(要素数が指定されてなくてもtrueになってしまう。)
使用しない変数にもredim (0) をするのは、
コードの改修がかなり必要になるので、出来れば避けたいです。
何か良い方法がありましたらアドバイスいただけると幸いです。

20 :
書き忘れてましたが、何故処理をスキップしたいのかというと、
redimされてない変数を処理すると
実行時エラー '9':
インデックスが有効範囲にありません。
というエラーがでるからです。

21 :
>>20
なんだろう、この気持ち悪さは

22 :
>>20
それ単なるバグじゃ?

23 :
>>20
UBound

24 :
>>22
そうです、私の書いたコードのアルゴリズムがまちがってるので
エラーになります。
根本的に直すのは複数箇所の修正が必要になるので、
小手先でごまかそうと考えて先の質問をしました。
>>23
ありがとうございます。
残念ながらuboundもダメでした。やはり
インデックスの有効範囲〜
のエラーになります。

25 :
>>24
あろーはー。例外捕まえちゃったら?
Array関数で作った要素数0の配列は0から-1までになるから
これを真似しちゃったらいんじゃない。
UBound(a) - LBound(a) + 1で要素数を求めるときにも整合性取れるし。
こんな感じで。
https://friendpaste.com/4gLpu6eKECJSBtzyhlIocW

26 :
>>24
On Error

27 :
連投すみません
とりあえず、邪道ですがエラートラップを用いて応急的に対策しました。
お騒がせして申し訳ありませんでした。
ちなみにこんな感じです。
On Error Resume Next
If UBound(hoge) < 0 Then
On Error GoTo 0
Else
On Error GoTo 0
[本来の処理]
End If

28 :
すみません。リロードしてませんでした。
アドバイスありがとうございました。
今後の参考にさせて頂きます。

29 :
「配列 空 vba」とかでググったらいっぱいヒットするけど・・・

30 :
>>29
どうもすみません、教えていただいたキーワードでぐぐったら出てきました。
大変参考になりました。
ttp://app.m-cocolog.jp/t/typecast/652919/549018/73143358
ここにあった not not で解決でした。
皆様ありがとうございました。

31 :
いずれにしても、関数にした方がいいよ。
If not not varArray Then
とか、何を調べてるのかぱっと見意味不明だし。
If IsVarArrayEmpty(varArray) Then
とか
If Not IsVarArrayEmpty(varArray) Then
だったらわかりやすいでしょ。

32 :
色々調べたのですが突破口が見つかりません。
質問させてください、お願いします。
・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 :
>>32
質問1 数字は0.5、1、2の3通りだけ?
質問2 全体の合計は8の倍数になってる?整理したらきっちり最後まで「合計8」のグループに分けられる?

34 :
あれ、書き込んでなかった
困ってること:文字列(フォント)の横幅dot数を調べたい
Graphics.MeasureString メソッドがあればいいんだけれど、エクセルなので・・・
どうしたらいいでしょうか

35 :
>>34
GetTextExtentPoint32

36 :
うおーありがとうございます

37 :
>>33
ご回答ありがとうございます。
質問1 数値自体はその3つのみです。
質問2 いえ、全体の合計は不明です 少なくとも、8の倍数キッカリには収まりません

38 :
>>32>>37
ループ(
 1 D行を足す、列番号を取得
 2 8未満である
  Y→1
   8である
  Y→ループ抜ける
   8以上である
  Y→最後の加算を破棄して次の列にいく→1

3 取得した列番号を基に列を入れかえる

39 :
>>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 :
自由に並べ替えていいんなら全体を降順ソートすれば一発で終わるんだけど

41 :
>>40
身も蓋もないことを

42 :
>>38 ありがとうございます、早速試してみます
>>39 すみません、初歩的なミスでしたorz
 順番ですが、上にあるもの程、優先になります。
 その例ですと、1+2+2+2+0.5…(2個飛ばして)+0.5
 を選択し、飛ばした先にある0.5を、
 1+2+2+2+0.5 の次に並び替えるようにしたいです。
>>40 説明不足でした、優先順位がありますorz

43 :
つかここアルゴリズムスレじゃないんだから、方法は自分で考えろよ
その方法をVBAで実装する段階になってから質問しろや

44 :
皆様、ご指導ありがとうございます。
>>38さんのアドバイスを参考に、
汚いソースになりましたが、なんとか完成致しました。
スレ汚し、失礼しました

45 :
更にお願いします
というかここでいいのかわからんけど
Excel2000 64bit機でGetTextExtentPoint32を動かす方法教えてください
Excel2000 32bit機では正常に動作しました
Office2007 64bit機で動作させるにはPtrSafeを挿入すればいいらしいんですが不明です
Excel2000 64bit機でPtrSafeがコンパイルエラーになってしまいます

GetTextExtentPoint32の使用はここを参照にしました
ttp://tamagolab.raindrop.jp/wiki/index.php?Excel%20VBA%20%A4%CE%A5%E1%A5%E2

46 :
Excel2000に64bitバージョンなんてあったか?
どっちにしてもOSの情報わからんと何とも言えんわ

47 :
win7 64bit機です
何か勘違いしてたかも
>>45
19: hWnd = Application.hWnd
でエラーが発生して動作しなくなりました
winXP 32bit機 Excel2000の入ってるPC引っ張り出してきて実行したところ
オブジェクトはこのプロパティまたはメソッドをサポートしていません
とエラーを生成しました
PC環境で実行できたり出来なかったりするんですが、何か参照設定が必要だったりするのでしょうか

48 :
・・・ああ判った
Application.hWnd てexcel2000じゃサポートしてないのか
ってことですよね

49 :
>>48
PtrSafe

50 :
まず、
OSに32/64ビットの区別があること
EXCELに32/64ビットの区別があること
を理解してから出直してください

51 :
Long Long Ago問題か?

52 :
bit数とかPtrSafe以前にExcel2000じゃ動かないって話
OSとか関係ないって突っ込んでるの一人もいない・・・

53 :
楽しみは最後までとっておくタイプ

54 :
>>47
Excel2000の時代にはウィンドウハンドルが簡単に拾えるApplication.Hwnd なんて
便利なものは無かったからな。
Excel2000も守備範囲なら API FindWindow でExcelのウィンドウハンドルを取得
するようにしておけば新旧Excelで使える。数行増えるだけだし。
ってVBAからだんだん離れるのであとはググれ

55 :
>>50
でもExcel2000は32bitしかないでしょ。
13年前のソフトだよ?

56 :
助けて下さい!マジではまってます。
指定したディレクトリの中にあるファイル一覧を取得しようと
下記コードを書いたのですがなぜか、エラーが出てしまいます。
どこに問題があるのでしょうか?
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 :
strFileName = Dir() ここ

58 :
>>57
エラーの起きる場所は分かってるのですが
strFileName = Dir()  ← なぜここでエラーになりますか?
ネットで解説されたコードをそのまま利用しているのですが
その解説サイトの人は特にエラー発生の可能性については言及していませんでした。

59 :
>>56
これが全ソースコード?
このコードだけをサブプロシージャにしてエラーが出るの?
変数の命名ルールがキショいね

60 :
>>56
そのコードには問題ないアルよ。
最初のDirを忘れてたり再帰でぐーるぐるしてたりするんじゃない?
桃白白はそういう疑念を持っています。

61 :
strFileNameをint指定してるのに、Dir()格納できねええだろ
フォルダ名一覧取得するためにstrFileNameとやらの中身に入れるなら別のstring型変数いれないと

62 :
あ、ごめん適当なこといった
C:\testってちゃんとフォルダが存在するよね?

63 :
Adodbオブジェクトは実は全力の5%位の力しか使っていないと聞きました。全力を使ったらどうなるのでしょうか?地球が壊れますか?また、どんなメソッドが使えるのでしょう。
良かったら教えて下さい

64 :
>>56
こいつ・・・動くぞ・・・!

65 :
>>56
tempフォルダかその中のファイルに、アクセス権のないのがあるんじゃ?

66 :
>>59
問題となる部分のコードです。
一部ネット上に転がっていたソースを流用している為です。
>>60 >>61 >>62
再起処理はやっておりません。
また、 c:\test も存在しています。
私の環境が問題なのかなぁ?
Excel2010 でマクロ組んでるんですけどん。

67 :
>>65
tempじゃなくてtestだった
フォルダなくてもエラーにはならないっぽいから、フォルダはあるのに
ファイルかフォルダにアクセス権ないんじゃ?

68 :
>>66
問題となる部分かどうかはお前が判断するな
全コードを提示して

69 :
普通にExcelで、セルの色とかフォントの色を変えたいとき
ツールバーの該当コマンドボタンの▼をクリックするとカラーパレットが展開されて
そこから色を選ぶことができるんだけど
例えば
セルに下線を引くマクロを作ったとして、複数セルを選択し
・マクロボタンの▼をクリックして、カラーパレットが展開されて、「カラーを選んで下線を引く」
フォントの既定組み合わせ{明朝11、明朝13、ゴシック10、ゴシック11、ゴシック13}等を設定しておき
・マクロボタンの▼をクリックして、フォント・フォントサイズの組み合わせから選択して「フォントを変更する」
みたいなことってできますか?

70 :
できる

71 :
右クリックやツールバーからできることは大体できる
書式設定とか普通

72 :
>>66
ちなみにエラーが発生したとき、
変数"file_count"の値はどうなってます?
(コード中断時に file_count の上にマウスカーソル持ってくれば値が表示されます)

73 :
>>72
ありがとうございます。
どうしてもDirを使った方法だとできなかったので Fileうんたらの方法を使ってうまくいきました。

74 :
VBA エディタで行番号を表示させる事は出来ないのでしょうか?

75 :
>>74
アドイン公開してる人がいたような
ググればすぐに見つかるはず

76 :
セルに入力させるにあたって、1又は9以外を入力させたくないんですが、そういうことって出来ますか?

77 :
>>76
VBAではないが
セルに入力規則を設定して
マウスで候補を選ばせるのはどう?

78 :
>>77
入力規則のこと忘れてました^^;
それが良いですね。ありがとです

79 :
>>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 :
>>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 :
そりゃだめだC3を含んだ複数セルをコピペした場合そのチェックは動かない
targetをFor EachしてC3セルだった場合にだけチェックするように書き換えないと
これはVBA以前の問題で全てのケースを洗い出す想像力大切よ

82 :
チェンジ かつ 固定セルなら
V = Range("$C$3").Value
If V <> 1 And V <> 9 Then MsgBox "$C$3 is 1 or 9 only.", vbOKOnly
でいいじゃん入力規則でいいじゃん

83 :
入力規則の方が高速でいいよな

84 :
人間が介在する作業で高速もクソもないだろ
どうがんばっても人間の指の方が遅いんだから

85 :
スループットは確かに人間が介在したらそこがネックになるけど
操作する人間に対するレスポンスが早いか遅いかって話で、操作性の問題だな
人間の感覚でとらえられないぐらいの差ならどうでもいい

86 :
VBA で
c:\test\ を
c:\test
という具合に末尾の \ を削除したいのですがどうすれば末尾の特定文字を削除する事が出来ますか?

87 :
自己解決

left でいけた。いkぅぅう

88 :
>>80
それだけのためにマクロ入れたらxlsmにするとかマクロ有効にするとかで嫌がられないか?

89 :
leftってまさか、なんでもかんでも一文字削ってるんじゃ…

90 :
HTTP/HTTPSで通信を行い、JSONPのデータをデコードして
セルに書き出すようなExcelVBAのサンプルなどはございますでしょうか?
よろしくお願いいたします。

91 :
そんなCOMはねえな

92 :
と思ったらJScript使えばそのままいけるのか
「vba HTTP/HTTPSで通信を行い、JSONP」でぐぐれ

93 :
>>92
ありがとうございmす、さっそくググってきます!

94 :
対象バージョンは2007以降です。セルの幅と高さを初期化する方法を教えてください
ぐぐったら以下のようなコードが出てきましたが、数値で指定するのはなんだかスマートじゃない気がします
ActiveSheet.Cells.Select
Selection.RowHeight = 13.5
Selection.ColumnWidth = 8.38
例えばRowHeight.SetDefaultみたいに初期化する方法が用意されていたりはしないんでしょうか?

95 :
会社でその部署の各個人のPCすべてに
個人用のマクロ(フォームモジュールと標準モジュールの2つのファイルがある)をインポートさせてあげたいんですが
中にはおじいちゃんおばあちゃんがいるので
手順を示すのではなくVBAに似たVBSでスクリプトを書いて
そのファイルをダブルクリックすればいいだけ、というようにしたいです。
どうすればできますか?

96 :
>>95
とりあえずこんな感じのコードをAutoOpenに仕込めば可能だけど
Workbooks("Book1.xls").VBProject.VBComponents("Module1").Import Filename
全部で何人(何台)あるの?
作る手間と説明する手間を考えると、もし100台程度なら昼休みに自分と数人の詳しい仲間でクリックして回った方が早いよ
どんなに簡単にしても、普段と違うことはできない人、更新の指示を見落とす人なんかが年齢に関係なくいるし
設定をいじっちゃってて作ったスクリプトがうまく動かないマシンなんてのも必ず出てくる
仕事で使うんならあんまり凝ったことはせずに確実にやる方法を考えた方がいいよ

97 :
>>96
ありがとうございます。
たしかに机を回るのも手だけど
コードもときどき更新するので
そのたびに机を回るのは今後を考えると面倒。
そのAutoOpenを検討させていただきますね。

98 :
objIE.Document.All("BtnID").Click
これでIEのクリック操作で押せるボタンがあります
変数で使いたいので下記のようにするとエラーとなり押せません
変数を宣言しないと押せます(Variant型)
ここに使えるデータ型は何でしょうか?
Dim ID As String
ID = "BtnID"
objIE.Document.All(ID).Click

99 :
>>98
ここには「整数または文字列」って書いてあるね
http://msdn.microsoft.com/ja-jp/library/cc410318.aspx
getelementbyidじゃダメなの?
ちなみにココはExcelの質問スレだからスレチだよ
以降は>>2に移動してね

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
DarkBASIC (467)
【入門】Common Lisp その9【質問よろず】 (846)
Pythonについて(アンチ専用) (787)
【RAD統合環境】 Qt 総合スレ 14 【Win/Mac/Linux】 (561)
【GUI】wxWidgets(旧wxWindows) その5【サイザー】 (521)
OpenGLスレ Part19 (206)
--log9.info------------------
メタラーでもあり、AKBファンでもある人★3 (256)
【Thrash】スラッシュメタル総合スレPart22【Metal】 (928)
アンドレ・マトス/Andre Matos/Shaman/VIRGO 2 (603)
【萌え】G∀LMET【デスメタル】 (728)
(sonata arctica 31) (935)
うちさぁ、メタルあんだけど・・・聴いてかない? (598)
■浜田麻里の衣装をバカにしていた工藤静香 (547)
【オーディション】STRATOVARIUS 15【開始】 (591)
ゴミ扱いされてるが実は名盤を挙げるスレ (472)
メタラーの痛い発言を晒すスレPART2 (448)
【ガルネリウス】GALNERYUS 56 【小野正利】 (1001)
Ozzfest Japan 2013 DAY5 (553)
みんなが忘れてしまっていること in HR/HM 13 (650)
[TMG]松本孝弘統一スレッド 41[TAK] (867)
ゴア/ポルノ/R・グラインド総合 Part54 (240)
アースシェイカー 2013年は30周年 (592)
--log55.com------------------
★2ch.scは何故失敗したのか
★クロール批判要望スレ
★削ジェンヌに文句ある人集合
★迷惑行為報告担当 - 小さな親切募集中 2
★2ch.scへの要望スレ Part3
★かっこう観測所
★スレ立て人キャップ
★2ch.scニュース系板観測所