Rangeのプロパティ、メソッドを一通り目を通せば意外と使えるものがある。 すぐに役立つかどうかはわからないけどお薦めするよ。
今から必死に練習すれば野球選手あるいはサッカー選手になれるのか? と自分に問えば、答えはNOに決まっている。 それなのに、なぜプログラム言語を学べばどこかに採用されるはずだと思っているのだろう? それなりに何年かその職種で頑張ってきた人たちでさえ、求職に苦労しているのに、 未だ何のキャリアもなく、定職に就いた事も無い自分が採用される可能性など万に一つもないはずなのに。。 こんな事はすぐわかる事なのに、俺みたいに外部とのつきあいが無いと、 助言してくれる人がいないから、なかなか気づけずにただ無駄に時間だけを無駄遣いしてしまう。 やっぱり、俺には肉体労働か単純労働しかないのか?
質問です。 Application.GetOpenFilenameでExcelファイルを開き、 開いたExcelファイルのどのワークシートに対してマクロ機能を使うかという処理なのですが、 シート名を選択するような方法はないでしょうか? メッセージボックスで「マクロ機能を使いたいシートをアクティブにして下さい。」のように表示し、 手動でアクティブにした後、コマンドボタンを押したら・・・というのは考えられるのですが。 Excelファイル開く→シート名が一覧で表示される→任意のシート名を選択する のように一連の動作としたいです。 よろしくお願いします。
955 :
デフォルトの名無しさん :2009/05/09(土) 02:54:07
開かれたブックからシート名をすべて取得してユーザーフォーム。 Inputbox に文字でシート名と番号を表示して、番号を入力させるちょっと見た目ショボイ方法でもいいかも。 ※左下のタブ表示移動の三角を右クリックするとシートが多いときに出てくるダイアログは Application.Dialogs では出せなかった。
for each sht in thisWorkbooks.Sheets debug.print sht.name next でシート名を引けるからリストボックスなりにアイテム追加すればいい
>>955 >>956 レスありがとうございます。
やはりユーザーフォームを使うしかないのですね。
GetOpenFilenameのようにシート選択も標準メソッドとしてあったらよかったのですが・・・
シート名を取得してユーザーフォームに表示する方法で進めてみます。
アドバイスありがとうございました。
>>953 >未だ何のキャリアもなく、定職に就いた事も無い自分
確かにそうだろうが、好きなら趣味でやれば良い。
好きでもないのに、義務感?でやってるなら、他の事をすれば良い。
>>953 野球選手やサッカー選手って、0歳から教育してたとしても、
なれるのは更にそのごく一部だよな。
ピアニストやバイオリニスト考えても、子供の内から学んでも、
音大行ける奴はごく少数。更にプロになれるのは更にそのごく一部。
まず、比較対象を間違えてる。
事務系の仕事でサッカー上手かったり、ピアノ弾けたとしても、ちょっとモテル程度。
でも、事務系の仕事でVBAが少しだけでも分かれば、それは仕事面でのプラス。
断言しておくよ。職場にExcelがある仕事で、VBAを覚えておいて損な事は無い。
もしプログラムが苦手で、自分で組むのが得意じゃないとしても問題ない。
プログラマーに依頼するにも知識は必要だからね。
その言語が出来る事、向いてる事、出来ない事。
これを知るだけでも仕事上では役に立つ。
作るのは出来る奴にやらせりゃいいんだよ。
>>953 経験が無い方が、逆に変な癖とか無いし企業側としては教えやすいっていう場合もありますよ。
生半可な知識持ってるとタチが悪いのも結構あります。
就職活動は行動する前に自己完結せずに行動を起して判断は相手に任せればいいのです。
961 :
デフォルトの名無しさん :2009/05/09(土) 12:38:08
>>953 毎日10時間を10年続ければその道のプロになれます
よく阿呆な大人は脳波年を取ると動かなくなると言いますが
あれは嘘です
脳は年齢に関係なくしっかり動きます
ただ自分には無理だと思う人には無理です
とりあえずスレタイを読み直そうぜ。
10年続けるのかあ 10年後にVBAが使われてるかどうか… 使われてるだろうなあ。 昔あった2000年問題も「このボロコンピュータがそんな先まで使われてないだろう」って 思い込んでしまったのが原因だし。
>963 Excel97 がでてからもう10年以上たってるし、 この先も使われるだろうね…
>>953 です。
昨日、夜中にスレ違いな書き込みしてすみませんでした。
レスしてくれた方々、ありがとうございました。
久しぶりに庭で蛇を見たw
何度も質問してすみません。 標準モジュールでフォームのPrivate Subプロシージャの真偽を判定したい場合は、 標準モジュールでpublic変数を宣言し、Private Subプロシージャ内でpublic変数に真偽を設定し、 それを標準モジュールで判定するという方法しかないでしょうか? よろしくお願いします。
>>966 処理の結果を一つだけ別のプロシージャに返したい場合はSubじゃなくてFunctionの方を使うのが普通。
結果が複数ある場合は参照渡しをする。
変数でPublicを使うのはできるだけ避けた方がいい。
そういう話じゃなくて?
>>968 解りづらい説明で申し訳ありません。
問題としていることは、
・標準モジュールよりUserForm.Showでフォーム画面を開く
・コマンドボタンのクリックイベント「はい」または「いいえ」を押すと、Unload Meをしフォーム画面を閉じる。
・標準モジュールに戻ってきたが、「はい」か「いいえ」のどちらでフォーム画面を閉じたのか解らない
という感じです。
標準モジュール内で値渡しや参照渡し、Functionプロシージャによる戻り値は一通り理解したのですが、
標準モジュールからフォームへ上記を行うにはどうしたらよいのかと・・・
よろしくお願いします。
例えば str = msgbox(msg, vbYesNo) if str = vbYes then else end if ところで、コマンドボタンをクリックした時に、何かアクションさせないのかなあ?
じゃぁ どっかのセルに書き込めばOK
例えば if UserForm1.ActiveControl.Name = "ComamandButton1" then elseif UserForm1.ActiveControl.Name = "ComamandButton2" then end if
たびたび説明下手ですみません。 上の「はい」「いいえ」はあくまで例でして、実際にやりたいことは Sub マクロ() Call ファイル選択関数() Call シート選択関数() Call シート内検索関数() End Sub のように処理内容ごとに関数をわけてます。 2番目のシート選択関数で、シート名をフォームの コンボボックス及びコマンドボックスを使って抽出しているのですが、 抽出したシート名を3番目の関数でも使いたいのです。 Public変数を宣言しておいて、 2番目の関数のフォーム内でPublic変数にシート名を代入 3番目の関数でPublic変数名のシートを検索 という感じではとりあえず動きは問題なさそうですが、 Publicはあまり使わないほうがいいのかなと・・・
だから968が >変数でPublicを使うのはできるだけ避けた方がいい。 って書いてるやん まぁ出来るだけって事であって絶対使うなって事ではないし、あんたが作り易い方法で作れば 良いでしょ?
>>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まで一気に右寄せにできるいい方法はないでしょうか?
>>976 ループではRangeに渡す文字列を作るだけにして、ループを抜けてから
Rstr = "A1:Q1,A3:Q3,A5:Q5, … ,A49:Q49"
Range(Rstr).HorizontalAlignment = xlRight
978 :
デフォルトの名無しさん :2009/05/09(土) 22:55:51
>>977 サンクス
そうか文字列足せばいいんだ
無事1回の実行でやりたいことができました
今までは実行したら右寄せが終わるまで砂時計が出ててカクカクしてたのがなくなりました
>>977 それだと全部文字列書かないといけないジャン!
>>976 マクロ登録で複数選択して右寄せってやってみそ!
>>978 どうしても一発出来ないような処理の場合
ScreenUpdatingでカクカクは見えなくできるよ
981 :
デフォルトの名無しさん :2009/05/09(土) 23:29:00
range("A1:Q1")の範囲を拡張して
range("A1:Z1")に範囲を拡張したいと思ってるのですが
始点は変更せずに終点だけを変更するものって用意されているのでしょうか
>>979 マクロも便利ですね
こっちの方もちょっと勉強してみようと思います
ちょっと違うが Set extRange = Union(Range("A1:Q1"), Range("R1:Z1"))
>>981 A1を起点として変動する最終列のセルを求めるなら
LastC = Cells(1, 256).End(xlToLeft).Column
↑訂正 ×最終列のセルを求めるなら ○最終列番を求めるなら
>>981 「拡張」の意味がよくわからんが。
始点が変わらないなら Range("A1:Q1").Range("A1:Z1") みたいに書けば
最初のRangeの範囲の左上をA1とみなした相対的なサイズを指定したことになる。
>>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
じゃだめ?
インデントが無効になった・・・orz 見づら過ぎてすまん
>>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
そんな汎用性のないコードを書いちゃいかんよ。 Rangeで扱える文字数をオーバーしたらどうすんだよ。 試しに49を70にしてみなよ。
誰か汎用性のあるサブルーチンを要求する質問なんてしてたっけ?
代案のコードも示さずに文句だけ言うやつなんか無視しとけ 何の役にも立たんどころか質問スレにとっては単なる荒らしと変わらん
xlRight だが xlHAlignRight とは違うの?
なんで馬鹿は自分の馬鹿を認めないのかね。 普通にループすりゃいいだけだろうがよ。 いっぺんにやろうとするのに無理があるんだよ。
>>992 おまえこそ役にたたねーよ。
>>998 がダメなのが分らないならVBAなんてやめるんだな。
xlHAlignRightだよなあ でも内部コードは同じだからxlRightでも同じ結果になるんだよなあ なんでコンパイル通っちゃうんだろう
ふだん、「その関数は遅いから論外」「こっちの関数のが100ミリ秒速い」とか言ってる ベンチマーク狂の人に素晴らしい回答をお願いしたいところ
>>997 速いとか遅いとかじゃねーっだよヴォケ。
確実に動くことが大事なのが分らんの?
ヴァカにはわからんだろうね。
分るわけねーよ。2chなんだからw 質問者の言うことをなんでも聞けばいいと思ってるんだろう。 ループの方が確実と教えるだけの能力がないんだよ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。