Excel VBA質問スレ Part10

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/05/08(金) 07:12:20
Rangeのプロパティ、メソッドを一通り目を通せば意外と使えるものがある。
すぐに役立つかどうかはわからないけどお薦めするよ。
953デフォルトの名無しさん:2009/05/09(土) 00:29:57
今から必死に練習すれば野球選手あるいはサッカー選手になれるのか?
と自分に問えば、答えはNOに決まっている。
それなのに、なぜプログラム言語を学べばどこかに採用されるはずだと思っているのだろう?
それなりに何年かその職種で頑張ってきた人たちでさえ、求職に苦労しているのに、
未だ何のキャリアもなく、定職に就いた事も無い自分が採用される可能性など万に一つもないはずなのに。。
こんな事はすぐわかる事なのに、俺みたいに外部とのつきあいが無いと、
助言してくれる人がいないから、なかなか気づけずにただ無駄に時間だけを無駄遣いしてしまう。
やっぱり、俺には肉体労働か単純労働しかないのか?
954デフォルトの名無しさん:2009/05/09(土) 01:49:49
質問です。

Application.GetOpenFilenameでExcelファイルを開き、
開いたExcelファイルのどのワークシートに対してマクロ機能を使うかという処理なのですが、
シート名を選択するような方法はないでしょうか?

メッセージボックスで「マクロ機能を使いたいシートをアクティブにして下さい。」のように表示し、
手動でアクティブにした後、コマンドボタンを押したら・・・というのは考えられるのですが。

Excelファイル開く→シート名が一覧で表示される→任意のシート名を選択する
のように一連の動作としたいです。

よろしくお願いします。
955デフォルトの名無しさん:2009/05/09(土) 02:54:07
開かれたブックからシート名をすべて取得してユーザーフォーム。
Inputbox に文字でシート名と番号を表示して、番号を入力させるちょっと見た目ショボイ方法でもいいかも。

※左下のタブ表示移動の三角を右クリックするとシートが多いときに出てくるダイアログは Application.Dialogs では出せなかった。
956デフォルトの名無しさん:2009/05/09(土) 02:54:10
for each sht in thisWorkbooks.Sheets
debug.print sht.name
next

でシート名を引けるからリストボックスなりにアイテム追加すればいい
957デフォルトの名無しさん:2009/05/09(土) 03:10:06
>>955
>>956

レスありがとうございます。
やはりユーザーフォームを使うしかないのですね。
GetOpenFilenameのようにシート選択も標準メソッドとしてあったらよかったのですが・・・

シート名を取得してユーザーフォームに表示する方法で進めてみます。
アドバイスありがとうございました。
958デフォルトの名無しさん:2009/05/09(土) 05:26:23
>>953
>未だ何のキャリアもなく、定職に就いた事も無い自分
確かにそうだろうが、好きなら趣味でやれば良い。
好きでもないのに、義務感?でやってるなら、他の事をすれば良い。
959デフォルトの名無しさん:2009/05/09(土) 07:55:30
>>953
野球選手やサッカー選手って、0歳から教育してたとしても、
なれるのは更にそのごく一部だよな。
ピアニストやバイオリニスト考えても、子供の内から学んでも、
音大行ける奴はごく少数。更にプロになれるのは更にそのごく一部。

まず、比較対象を間違えてる。

事務系の仕事でサッカー上手かったり、ピアノ弾けたとしても、ちょっとモテル程度。
でも、事務系の仕事でVBAが少しだけでも分かれば、それは仕事面でのプラス。

断言しておくよ。職場にExcelがある仕事で、VBAを覚えておいて損な事は無い。
もしプログラムが苦手で、自分で組むのが得意じゃないとしても問題ない。
プログラマーに依頼するにも知識は必要だからね。

その言語が出来る事、向いてる事、出来ない事。
これを知るだけでも仕事上では役に立つ。
作るのは出来る奴にやらせりゃいいんだよ。
960デフォルトの名無しさん:2009/05/09(土) 10:37:36
>>953
経験が無い方が、逆に変な癖とか無いし企業側としては教えやすいっていう場合もありますよ。
生半可な知識持ってるとタチが悪いのも結構あります。

就職活動は行動する前に自己完結せずに行動を起して判断は相手に任せればいいのです。
961デフォルトの名無しさん:2009/05/09(土) 12:38:08
>>953
毎日10時間を10年続ければその道のプロになれます
よく阿呆な大人は脳波年を取ると動かなくなると言いますが
あれは嘘です
脳は年齢に関係なくしっかり動きます
ただ自分には無理だと思う人には無理です
962デフォルトの名無しさん:2009/05/09(土) 12:52:04
とりあえずスレタイを読み直そうぜ。
963デフォルトの名無しさん:2009/05/09(土) 13:38:51
10年続けるのかあ
10年後にVBAが使われてるかどうか…
使われてるだろうなあ。

昔あった2000年問題も「このボロコンピュータがそんな先まで使われてないだろう」って
思い込んでしまったのが原因だし。
964デフォルトの名無しさん:2009/05/09(土) 13:48:17
>963
Excel97 がでてからもう10年以上たってるし、
この先も使われるだろうね…
965デフォルトの名無しさん:2009/05/09(土) 14:01:39
>>953 です。
昨日、夜中にスレ違いな書き込みしてすみませんでした。
レスしてくれた方々、ありがとうございました。

久しぶりに庭で蛇を見たw
966デフォルトの名無しさん:2009/05/09(土) 14:50:28
何度も質問してすみません。

標準モジュールでフォームのPrivate Subプロシージャの真偽を判定したい場合は、
標準モジュールでpublic変数を宣言し、Private Subプロシージャ内でpublic変数に真偽を設定し、
それを標準モジュールで判定するという方法しかないでしょうか?

よろしくお願いします。
967デフォルトの名無しさん:2009/05/09(土) 14:50:32
>>965
安定剤飲んで寝とけ。
968デフォルトの名無しさん:2009/05/09(土) 16:07:46
>>966
処理の結果を一つだけ別のプロシージャに返したい場合はSubじゃなくてFunctionの方を使うのが普通。
結果が複数ある場合は参照渡しをする。
変数でPublicを使うのはできるだけ避けた方がいい。

そういう話じゃなくて?
969デフォルトの名無しさん:2009/05/09(土) 16:25:57
>>968
解りづらい説明で申し訳ありません。

問題としていることは、
・標準モジュールよりUserForm.Showでフォーム画面を開く
・コマンドボタンのクリックイベント「はい」または「いいえ」を押すと、Unload Meをしフォーム画面を閉じる。
・標準モジュールに戻ってきたが、「はい」か「いいえ」のどちらでフォーム画面を閉じたのか解らない

という感じです。
標準モジュール内で値渡しや参照渡し、Functionプロシージャによる戻り値は一通り理解したのですが、
標準モジュールからフォームへ上記を行うにはどうしたらよいのかと・・・

よろしくお願いします。
970デフォルトの名無しさん:2009/05/09(土) 18:38:43
例えば
str = msgbox(msg, vbYesNo)
if str = vbYes then
else
end if

ところで、コマンドボタンをクリックした時に、何かアクションさせないのかなあ?
971デフォルトの名無しさん:2009/05/09(土) 18:44:01
じゃぁ
どっかのセルに書き込めばOK
972デフォルトの名無しさん:2009/05/09(土) 18:50:00
例えば
if UserForm1.ActiveControl.Name = "ComamandButton1" then
elseif UserForm1.ActiveControl.Name = "ComamandButton2" then
end if
973デフォルトの名無しさん:2009/05/09(土) 20:07:14
たびたび説明下手ですみません。

上の「はい」「いいえ」はあくまで例でして、実際にやりたいことは

Sub マクロ()
  Call ファイル選択関数()
  Call シート選択関数()
  Call シート内検索関数()
End Sub

のように処理内容ごとに関数をわけてます。
2番目のシート選択関数で、シート名をフォームの
コンボボックス及びコマンドボックスを使って抽出しているのですが、
抽出したシート名を3番目の関数でも使いたいのです。

Public変数を宣言しておいて、
2番目の関数のフォーム内でPublic変数にシート名を代入
3番目の関数でPublic変数名のシートを検索
という感じではとりあえず動きは問題なさそうですが、
Publicはあまり使わないほうがいいのかなと・・・
974デフォルトの名無しさん:2009/05/09(土) 20:32:04
だから968が
>変数でPublicを使うのはできるだけ避けた方がいい。
って書いてるやん

まぁ出来るだけって事であって絶対使うなって事ではないし、あんたが作り易い方法で作れば
良いでしょ?
975デフォルトの名無しさん:2009/05/09(土) 21:03:43
>>974
そうですね、すみません。

皆さんありがとうございました。
976デフォルトの名無しさん:2009/05/09(土) 22:25:32
エクセル2003とXPを使用しています

A1~Q1を右寄せに
A3~Q3を右寄せに
、、、、、、
A49~Q49を右寄せに
としたいと思っているのですが
現状Range(Cells(1 + i*2, 1), Cells(1 + i*2, 19)).HorizontalAlignment = xlRight
をforでくくって複数回実行しているのですが

マウスで操作するように
A1~Q1、A3~Q3、、、、A49~Q49をまず選択して
HorizontalAlignment = xlRightを1回実行すれば49まで一気に右寄せにできるいい方法はないでしょうか?
977デフォルトの名無しさん:2009/05/09(土) 22:31:57
>>976
ループではRangeに渡す文字列を作るだけにして、ループを抜けてから
Rstr = "A1:Q1,A3:Q3,A5:Q5, … ,A49:Q49"
Range(Rstr).HorizontalAlignment = xlRight
978デフォルトの名無しさん:2009/05/09(土) 22:55:51
>>977
サンクス
そうか文字列足せばいいんだ
無事1回の実行でやりたいことができました

今までは実行したら右寄せが終わるまで砂時計が出ててカクカクしてたのがなくなりました
979デフォルトの名無しさん:2009/05/09(土) 22:58:06
>>977
それだと全部文字列書かないといけないジャン!

>>976
マクロ登録で複数選択して右寄せってやってみそ!
980デフォルトの名無しさん:2009/05/09(土) 23:21:34
>>978
どうしても一発出来ないような処理の場合
ScreenUpdatingでカクカクは見えなくできるよ
981デフォルトの名無しさん:2009/05/09(土) 23:29:00
range("A1:Q1")の範囲を拡張して
range("A1:Z1")に範囲を拡張したいと思ってるのですが
始点は変更せずに終点だけを変更するものって用意されているのでしょうか

>>979
マクロも便利ですね
こっちの方もちょっと勉強してみようと思います
982デフォルトの名無しさん:2009/05/09(土) 23:41:55
ちょっと違うが
Set extRange = Union(Range("A1:Q1"), Range("R1:Z1"))
983デフォルトの名無しさん:2009/05/09(土) 23:46:46
>>981
A1を起点として変動する最終列のセルを求めるなら

LastC = Cells(1, 256).End(xlToLeft).Column
984デフォルトの名無しさん:2009/05/09(土) 23:49:37
↑訂正
×最終列のセルを求めるなら
○最終列番を求めるなら
985デフォルトの名無しさん:2009/05/10(日) 00:08:08
>>981
「拡張」の意味がよくわからんが。
始点が変わらないなら Range("A1:Q1").Range("A1:Z1") みたいに書けば
最初のRangeの範囲の左上をA1とみなした相対的なサイズを指定したことになる。
986デフォルトの名無しさん:2009/05/10(日) 00:30:30
>>976
単に奇数行を右寄せしたいだけなら
Sub Test2()
Dim bRow As Byte
Dim bCol As Byte
Dim bLastRow As Byte
Dim bLastCol As Byte

With ActiveCell.CurrentRegion
bLastRow = .Rows.Count
bLastCol = .Columns.Count

For bRow = 1 To bLastRow
If bRow Mod 2 <> 0 Then
For bCol = 1 To bLastCol
.Cells(bRow, bCol).HorizontalAlignment = xlRight
Next bCol
End If
Next bRow
End With
End Sub
じゃだめ?
987デフォルトの名無しさん:2009/05/10(日) 00:31:18
>>986
長すぎ。それから質問をよく読め
988デフォルトの名無しさん:2009/05/10(日) 00:32:17
インデントが無効になった・・・orz
見づら過ぎてすまん
989デフォルトの名無しさん:2009/05/10(日) 00:35:04
>>977のレスをちゃんとプログラムに起こすとこうなるかな。
Dim Rstr As String
Rstr = "A1:Q1"
For i = 3 To 49 Step 2
  Rstr = Rstr + ",A" & i & ":Q" & i
Next
Range(Rstr).HorizontalAlignment = xlRight
990デフォルトの名無しさん:2009/05/10(日) 00:47:12
そんな汎用性のないコードを書いちゃいかんよ。
Rangeで扱える文字数をオーバーしたらどうすんだよ。
試しに49を70にしてみなよ。
991デフォルトの名無しさん:2009/05/10(日) 00:54:35
誰か汎用性のあるサブルーチンを要求する質問なんてしてたっけ?
992デフォルトの名無しさん:2009/05/10(日) 00:57:03
代案のコードも示さずに文句だけ言うやつなんか無視しとけ
何の役にも立たんどころか質問スレにとっては単なる荒らしと変わらん
993デフォルトの名無しさん:2009/05/10(日) 01:25:00
xlRight だが xlHAlignRight とは違うの?
994デフォルトの名無しさん:2009/05/10(日) 02:00:00
なんで馬鹿は自分の馬鹿を認めないのかね。
普通にループすりゃいいだけだろうがよ。
いっぺんにやろうとするのに無理があるんだよ。
995デフォルトの名無しさん:2009/05/10(日) 02:02:09
>>992
おまえこそ役にたたねーよ。
>>998がダメなのが分らないならVBAなんてやめるんだな。
996デフォルトの名無しさん:2009/05/10(日) 02:07:24
xlHAlignRightだよなあ
でも内部コードは同じだからxlRightでも同じ結果になるんだよなあ
なんでコンパイル通っちゃうんだろう
997デフォルトの名無しさん:2009/05/10(日) 02:08:51
ふだん、「その関数は遅いから論外」「こっちの関数のが100ミリ秒速い」とか言ってる
ベンチマーク狂の人に素晴らしい回答をお願いしたいところ
998デフォルトの名無しさん:2009/05/10(日) 02:11:10
>>997
速いとか遅いとかじゃねーっだよヴォケ。
確実に動くことが大事なのが分らんの?
ヴァカにはわからんだろうね。

999デフォルトの名無しさん:2009/05/10(日) 02:16:43
分るわけねーよ。2chなんだからw
質問者の言うことをなんでも聞けばいいと思ってるんだろう。
ループの方が確実と教えるだけの能力がないんだよ。
1000デフォルトの名無しさん:2009/05/10(日) 02:17:41
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。