1 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 11:14:15 ] ・まじめにExcelの機能を追及してみようと思う奇特なひと ・スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと ・VBAなんていまさらやりたくないのに業務で仕方なく使っているひと ・とにかく漏れにこんな仕事まわすなと怒っているひと そんなM$大好きなひとからアンチM$なひとたちまで幅広くカバーするスレです OOoのCalcの質問もOKです 前スレ pc10.2ch.net/test/read.cgi/tech/1054356121/
184 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 10:48:46 ] いま正規表現の検索フォームを作ってます 検索対象をusedrangeで取得してfor eachでまわしてます。 これで動作は問題ないのですが、対象が多いと時間がかかってしまいます。 そこで、rng=usedrangeと配列に代入して高速化しようとして問題にぶちあたりました。 配列に代入されるのがValueっぽいので、 セルに10:00の様に時間や日付が入っている場合 longになるので検索文字が10などと一致しません。 usedrang.textとして代入すると空になってしまいます。 配列に代入された文字の表示形式を調べて変換することも考えたのですが、 現状と大差ない感じがします。 シート上に表示されている値をまとめて配列に代入する方法か代替案がありましたら ご教授おねがいします。
185 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 10:53:50 ] クエリー
186 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 11:05:11 ] txt→CSV変換でなにか、いいサンプルコードないですか? 入力ファイル:oder.txt 出力ファイル:任意.csv csvに出力する時、元のtxtから不要データの排除と任意条件での集計 VBAかVBSで出来そうと思いいろいろ本読んで見たけど いかんせんCobolerなので、よくわかっとりません
187 名前:デフォルトの名無しさん [2007/02/05(月) 11:09:25 ] 元のテキストファイルのフォーマットはどのようなものですか? 固定長?
188 名前:デフォルトの名無しさん [2007/02/05(月) 11:36:51 ] Public Sub TextToCSV(ByVal pInPath As String, ByVal pOutPath As String) Const C_DELIM As String = "," '区切り文字 Dim s As String:Dim s2 As String:Dim ss() As String Dim fnoIn As Long: Dim fnoOut As Long 'ファイル開く fnoIn = FreeFile: Open pInPath For Input As #fnoIn fnoOut = FreeFile: Open pOutPath For Output As #fnoOut 'ファイル終了まで繰り返し Do While (EOF(fnoIn)) '1行読み出し Line Input #fnoIn, s '特定のバイト位置に区切り文字を入れた文字列を作成する。 'イメージ000001111122222⇒00000,11111,22222 s2 = Mid(s, 1, 5) & "," & Mid(s, 6, 5) & "," & Mid(s, 11, 5) '区切り文字が入った文字列をSplitで配列に出力 ss = Split(s2) '各要素のチェックをする If ss(0) = "99999" Then GoTo LOOP_NEXT 'ここまで来たら大丈夫のようなのでカンマ入り文字列(s2)CSVに出力する Print #fnoOut, s2 LOOP_NEXT: Loop Close #fnoIn: Close #fnoOut End Sub
189 名前:デフォルトの名無しさん [2007/02/05(月) 11:37:36 ] あータブとか消されてしまうのか。見づらいな。
190 名前:186 mailto:sage [2007/02/05(月) 15:09:56 ] >>187 固定で102byteです。 得意先がいい加減で、仕様も手探り状態なもので(泣 >>188 ありがとうございます。 このコードを参考にして、試行錯誤してみます。
191 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 17:01:11 ] >>190 得意先に仕様書無いと作れないと言えばいいじゃん。
192 名前:186 mailto:sage [2007/02/05(月) 18:04:31 ] >>191 言ったよ゚・(つД`)・゚・ 普段もらっている受注データとは別のもので。。。 特殊なパターンで、これしか渡せないと言われた。 txtデータと口頭で言われた項目(どこまでが**で**byteで、とか)だけ。 結局、自分たちで解析するしかなくて。。。 ホストのマスターに落とす必要ないのでVBSかAccessの類で出来ないか 考えてたんです。 ちなみに得意先はホ●ダ技研鈴鹿工場です バイクも車もホ●ダだが、こういう体質は好かん!
193 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 18:10:10 ] 大丈夫、他も似たようなもんだ。
194 名前:デフォルトの名無しさん [2007/02/05(月) 20:11:48 ] >>180 >>181 >>182 >>183 激しく感謝です。やっぱだめなんですね・・・^^;
195 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:04:29 ] >>194 つか<、>で範囲チェックすりゃいいじゃん
196 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:09:03 ] >>195 それはやっちゃダメ 結果的に同じでもコード的に意味が違ってしまう つまり可読性を損なう
197 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:18:55 ] >>196 どうしても出来ないときは いいじゃんコメント書いとけばいいんだから 全部そんなプログラム組んじゃいけないけど
198 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:20:09 ] 後は10とか100でかけて整数値にするかだな
199 名前:184 mailto:sage [2007/02/05(月) 21:59:21 ] >>185 俺にたいするレスと受け取っていいんですよね? 色々検索して ttp://www.microsoft.com/japan/technet/scriptcenter/resources/officetips/jun05/tips0607.mspx を参考にしてテストしてみたんですが、 やっぱり時間とかはきちんと取得できないんですけど、 (セルに10:00といれておくと0.5になる) これじゃないんでしょうか? 申し訳ないんですが、検索キーワードなど教えていただけると 助かります。 いや、助けてください
200 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 22:41:49 ] Dim tm As Date Dim buf As String tm = Cells(0, 0) buf = Format(tm, hh:mm") これで普通の文字列になるがな
201 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 22:42:29 ] buf = Format(tm," hh:mm")
202 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 22:45:10 ] 更にtmだけでも応用すりゃ検索もできる
203 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 23:08:56 ] >>200-202 おまえ、バカだろ。文字列にする方法なんてこの際問題じゃない。そんなの簡単に解る。 君のやり方で文字列化するなら、その前にその値が元々どういう表示形式で表示されていたか判断しなきゃならないんだよ。 そして>>184 に > 配列に代入された文字の表示形式を調べて変換することも考えたのですが、 とあるから、君の考えた方法は既に変わりきってる上で、表示形式をいちいち調べて文字列に変換してたら ValueではなくTextプロパティをループで読むのと大差ないってこった。
204 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 23:14:58 ] >>203 いや >>10 :00といれておくと0.5 と言う単なるヒントだ、そのまま使ったら馬鹿だが
205 名前:デフォルトの名無しさん [2007/02/06(火) 00:15:27 ] 10:00といれておくと0.5になるなら 逆に検索値を時間の場合10:00なら0.5にすりゃいんじゃねぇ?
206 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 00:35:33 ] それだと時間じゃない0.5もヒットするわけで
207 名前:デフォルトの名無しさん [2007/02/06(火) 01:07:40 ] データベース使っても結局Value値がセットされると・・・ 0.5でヒットしたらセル見にいって属性しらべたら? 少しはマシかも、0.5とかいっぱいあったら終わりだけど
208 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:23:47 ] Findじゃ遅いの?
209 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:27:24 ] findじゃだめなんだよ
210 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:32:58 ] あとはクエリ使って、ここで答えでないんなら データベース関係のスレで聞いてみたら?
211 名前:184 mailto:sage [2007/02/06(火) 01:35:12 ] 色々なレスありがとうございます。 最初の書き込みが携帯からで、内容をはしょりすぎて誤解があるようなので再度書き込みます。 A列)日付 B列)曜日 C列)作業名 D列)開始時刻 E列)終了時刻 F列)処理時間 G列)備考 が入っている複数のシートから正規表現で検索をしたいと思っています。 今の簡単なコードを書くと Set reg = CreateObject("VBScript.RegExp") With reg .Pattern = strPattern .IgnoreCase = True .Global = True end with For Each sh in Thisworkbook.Sheets For Each rng in sh.UsedRange If reg.test(rng.Text) Then 検索文字列が見つかったときの処理 Debug.? "[address]" & rng.Address & " [text]" & rng.Text & " [Formula]" & rng.Formula End If Next Next といった流れなのですが、検索対象が大量にあり処理に時間がかかってしまいます。(対象30万件で5分くらい) そこでFor Each rng in sh.UsedRangeをやめて、rng = sh.UsedRangeのように 配列にして、検索しようとしたところ、日付や時間(表示形式は[h]:mm)がLong型になるため srtPattern = "10" などに10:00などが該当しなくなります。 rng = sh.UsedRange.Formulaは代入がうまくいくのですが、rng = sh.UsedRange.Textはできないようです。 列ごとに時間や日付が入っているなら、そこだけ変換すりゃいーだろ、と言われそうですが 列がずれた場合や新たに項目が増えた場合を考えて、決め打ちで変換するのは出来れば避けたいと考えています。 説明下手ですいませんが、高速に処理する方法がありましたらご教授お願いします。
212 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:39:00 ] 件数多いなぁ、確実にデータベース使った方が良いと思うよ 漏れはやり方わからんが
213 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:42:57 ] >>列がずれた場合や新たに項目が増えた場合を考えて 列のセルに名前付けりゃいいんじゃないの?
214 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:56:50 ] > 列がずれた場合や新たに項目が増えた場合を考えて、 2行目(実データの1行目)の表示形式に合わせるって手もある 30万回表示形式取得したら相当遅くなるだろうが、列数分(現状7回)だけなら殆ど気にならないだろ
215 名前:たのんます [2007/02/06(火) 02:00:54 ] エクセルに関する質問なんですが 統計数字データをグラフに変換して、統計データによるグラフを作成する際に 統計データの始点と終点を同じにして、重ねて比べられるようなグラフにしたいのですが 統計データの量が、比較したいAとBでは異なるため、 始点終点を同じにして、重ねて比べることができません。 何か関数とかその他の方法で、 違うデータ量のものを重ねて比較する方法はないでしょうか?
216 名前:184 mailto:sage [2007/02/06(火) 02:08:44 ] 書き忘れましたが、正規表現を使いたい理由は作業名が入力者により、まちまちなのでまとめて検索したいからです。 誤)日付はDate型ですね。すいません。 0.5は12:00でした。すいません。 いま>>199 のリンク先のコードを改良してテストしてみたら、 10:00とかはちゃんと取れますね(表示10:00→取得値10:00:00でした) ただ24時間を越えるとダメみたいです(表示28:00→取得値1900/01/01 4:00:00でした) 日付も表示が1月1日でも2007/01/01でした。 何か指定する方法があるのかもしれませんが… >>208 Findって正規表現使えましたっけ?調べてみます >>210 なにぶんADOとか初めてなんでもう少し ttp://support.microsoft.com/?kbid=257819 とかを見て勉強してみます。 >>212 俺もそう思います >>213 名前を定義なども考えましたが、名前=範囲な訳で新規に項目が増えた場合にはコードを追加し 範囲別にコードを書かなければいけないので、試してません。 条件分岐で範囲(名前)別にコードを書く必要もないかもしれませんが、 ただでさえ件数が多く時間がかかるので、極力条件分岐などの処理をいれたくないので。 >>214 それは考えつきませんでした。試して見たいと思います。 色々ありがとうございました。自分でも試行錯誤してみようと思います。
217 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:16:11 ] >>216 Date型 は日付と時間一緒ですよ(小数点以下が時間) >名前を定義 範囲で名前付けるんじゃなく、1行目の1セルに名前付けて 呼び出せば行位置と列位置が分かる 列位置分かればなんの行か分かるでしょ
218 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:19:39 ] >>217 >名前を定義 と書いていて複数シートじゃ駄目だね・・・
219 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:20:11 ] >>215 あるけどマルチしたので教えません
220 名前:たのんます [2007/02/06(火) 02:49:33 ] すいません マルチの意味がわかりました、、、 してはいけないことと知りませんでした。 ただものすごく困っています。 色々調べても方法がなくて、、、 ご存知でしたら、何卒お教えいただけませんでしょうか? 以後こんな事をしてしまわないように気をつけます。
221 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:59:27 ] 今回のが教訓だ。ここで教えちゃったら教訓にならない。 「マルチしても謝れば教えてもらえる」程度に思っちゃうだろう。 今回マルチをしてしまった責は、今回答えてもらえないということで負い 以後気を付けることで、以後の質問では突き放されることはなくなる。 まぁマルチをしても、2chで仮初めの礼を言われることくらいしか楽しみのない 哀れな教えたがり君が答えてくれることもあるけどね。
222 名前:デフォルトの名無しさん [2007/02/06(火) 13:58:34 ] VBAでTerminateメソッドって使えないんでしょうか? VBAから起動しているアプリを終了したいんですが Set WshShell = CreateObject("WScript.Shell") WshShell.Terminate ("ファイルパス") と打ち込んでもエラーになっていまいます。 Set WshShell = CreateObject("WScript.Shell") WshShell.exec ("ファイルパス") で起動はできるようですが。 VBAを使って、windows上で起動しているアプリを終了させるには どうしたらいいんでしょうか?
223 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 14:25:54 ] >>222 Win32API使うかWMI使うかだな つーか全然VBAの質問じゃないし
224 名前:222 [2007/02/06(火) 14:34:30 ] え、これVBAの質問じゃないんですか? すいません。 これはAPIのスレに行けばいいんですかね?
225 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 15:09:04 ] VB言語でApplicationオブジェクト(ExcelやWord)を操作するからVisual Basic for Application、略してVBA。 Applicationオブジェクト(Excelではブック、シート、セルなどを含む)を操作しなかったら 例えExcelやWord付属のVBEで実行しようと、VBAの分野の話じゃ無い。 開発環境の方のVisual Basicでやるべき事を、ExcelやWord付属のVBEに持ってきてるだけだ。 VBAはあくまでもマクロ言語なのに、開発環境に匹敵するほど強力過ぎる故にその辺の区別が出来ない奴が多くて困る。 「VBAで」の部分を「VB6.0で」に置換しても通用しちゃうような話は、全部開発環境分野の話だと思ってくれ。 因みに君のレベルならWin32APIよりはWMIの方がいいと思うぞ。 でもどっちにしろスレで質問することばかり考えてないで自分で調べることを考えよう。 どうせWin32APIスレでは言語限定での丸投げ(コード書いてクレクレ)なんて聞いちゃくれないし。
226 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 10:38:35 ] ADOを使用してエクセルのシートをデータベースにセットする場合 各セル毎のデータ形式でなく、全て文字列形式にしてセットする方法があるんでしょうか? (セルを全て文字列形式にするという方法は除いて) もしあるのなら、教えてください。
227 名前:デフォルトの名無しさん [2007/02/07(水) 14:47:01 ] >>221 何をエラそうに講釈たれてんだよ、バーカ。何も教えないくせに態度ばっかしデカいんだよ。
228 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 14:56:05 ] ( ゚д゚)ポカーン
229 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:50:04 ] マルチがなぜダメなのかを知っていればあんなに高飛車に 偉そうなことは言わないというのは間違いのない話であるよな。
230 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 01:01:14 ] つうか >>226 の質問はスルーか
231 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 03:03:30 ] if Do While ********* Loop end if こんな感じのプログラムのDoLoopを1秒たったら繰り返すような感じに出来ますか?
232 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 03:36:24 ] >>231 Application.WaitなりWin32APIのSleepなりお好きなように
233 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 17:02:10 ] >>232
234 名前:デフォルトの名無しさん [2007/02/08(木) 20:05:16 ] const aretsul = 1 DATA = "データファイル" Cells(row, aretsul).Text Cellsに「222123,」見たいな感じにデータが入ってるんですが、最後のコンマを消したいんです 最後の一文字を読み込まないようにするにはどうすればいいでしょうか?
235 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 20:31:13 ] > 最後の一文字を読み込まないようにする Value値にも因るが、基本的に不可能。 読み込んだ後で、末尾の1文字を消すなら文字列操作関数でどうにでもなるけどね。
236 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 21:21:27 ] >>234 left(cells(セルA,セルB), len(cells(セルA,セルB)) - 1) こんなんどう?(未テスト。やりたいことは伝わるかと) っていうか上の2行は?
237 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 21:40:45 ] >>235 >>236
238 名前:デフォルトの名無しさん [2007/02/08(木) 21:58:30 ] ごめん、ビジネスsoft板のExcel総合スレで聞いたんだけど、こっちの方がよさげなので、 すみませんがマルチさせていただきます。 以下、コピペですが、エラーを防ぐ原因と方法を知ってる方いたら教えてください。 すみません、VBAのことで質問です。 リンク先のプログラムで、コマンドボタンを押した後に表示されるフォーム(モーダレス)の コマンドボタンを押して処理を実行中にシートをダブルクリックしたりすとエラーで落ちちゃう んですが、これを防ぐにはフォームをモーダルでshowするしかないですかね? 555.sytes.net/up/img/375.zip
239 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 22:35:29 ] >>238 原因不明なのですが、試してみてくれませんでしょうか? ループの前に Application.ScreenUpdating = false ループの後に Application.ScreenUpdating = true スペルミスあったらごめんなさい。
240 名前:238 [2007/02/08(木) 22:46:43 ] >>239 ありがとうございますm(_ _)m 教えていただいた通りにしたらエラーがでなくなりました。 Application.ScreenUpdating = false で画面の更新を一時的に止めてやるんですね。 Formをmodalで表示しなくてもこの方法ならいけそうです!
241 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 01:38:11 ] >>226
242 名前:デフォルトの名無しさん [2007/02/09(金) 01:45:38 ] >>241
243 名前:デフォルトの名無しさん [2007/02/12(月) 10:41:46 ] すみませんが質問です。 ユーザーフォームにテキストボックス若しくはラベルを作り、 そこに文字を電光掲示板のように文字をスクロールさせる事は可能ですか?
244 名前:デフォルトの名無しさん [2007/02/12(月) 10:49:33 ] タイマー作って文字列を更新しろ
245 名前:デフォルトの名無しさん [2007/02/12(月) 11:39:55 ] Alt + PrintScreenで、画面のハードコピーをとって、 エクセルシートに貼り付ける時に、 そのハードコピーの拡大率は100%ですよね。 これを80%の拡大率で貼り付けたい時はどうすればよいのでしょうか? 貼り付けた後に、拡大率を変更するのは面倒なので。 (エクセルシート自体は100%のままで)
246 名前:デフォルトの名無しさん [2007/02/12(月) 12:22:16 ] sub 貼りつけ const ZOOM_RATE AS SINGLE = 0.8 ActiveSheet.Paste Selection.ShapeRange.LockAspectRatio = msoTrue Selection.ShapeRange.Height = Selection.ShapeRange.Height * ZOOM_RATE Selection.ShapeRange.Width = Selection.ShapeRange.Width * ZOOM_RATE end sub どのプロパティ実現できるか分からないときは、マクロの記録を活用すると良いですよ。
247 名前:243 [2007/02/12(月) 17:24:50 ] >>244 なめらかに文字を流したいのですが・・・
248 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 17:27:26 ] >>247 ラベルの位置を微調整するとか、自前で文字描画するとか、まぁ頑張って。
249 名前:243 mailto:sage [2007/02/12(月) 17:31:17 ] >>248 簡単にできる方法ってないんですね・・・ 何とかがんばってみます!
250 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 18:06:55 ] いや、簡単だろ
251 名前:デフォルトの名無しさん [2007/02/12(月) 18:12:42 ] 質問です。 Office2007 Excelでマクロの記録機能で、テキストボックスを表示して、テキストボックス内に文字を表示するといったマクロを記録しましたが、テキストボックスに関するマクロが一切記録されません。 何か個別に設定が必要なのでしょうか?
252 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 15:53:09 ] そのテキストボックス自分で実装したなら無理じゃね?
253 名前:デフォルトの名無しさん [2007/02/13(火) 19:25:13 ] 質問があります。 たとえばA1:D50までの表がありその中に3桁の数値が入っているのですが、 そのなかに指定した1桁の数値(H1に入力した数値)が(3桁のいずれかに)含まれるセルに色をつけたいのです。 また、関係ないかもしれないですが、表には空欄がある場合があります。 どうしたらいいでしょか。 お力をお貸しください。
254 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 20:07:08 ] >>253 条件付き書式でも出来るが、VBAでやりたいなら単にループ回してInStrあたりでその数字が含まれてるかどうか調べればいいだけじゃん。 第二第三引数は数値渡しても自動で文字列化されるし、戻り値をそのまま条件に出来る。
255 名前:デフォルトの名無しさん [2007/02/14(水) 15:53:03 ] 教えてください! VBAからマクロの記録を終了させたり開始させたりする事って 出来るのでしょうか? Application.CommandBars("Stop Recording").Visible = True strTempBuff = CommandBars("Stop Recording").Controls(1).Caption If Not strTempBuff = "新しいマクロの記録(&R)..." Then '記録中なら停止したい。 xlApp.Application.CommandBars("Stop Recording").Controls(1).Execute '同じErr xlApp.Application.CommandBars("Stop Recording").Controls("記録終了(&R)").Execute '同じErr End If 上記コードで実行すると、マクロ記録中の場合 オートメーションエラーが発生してしまいます。 既にマクロが走っているからでしょうか?
256 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 23:16:03 ] すみませぬが質問です。フォームにラベルを作り、そのラベルにランダムの行数のセルを表示させ、 ちょっと時間をおいてその隣のセルを表示させる、というプログラムを作りましたが 上手いこといきません。アドバイス下さいませ。 Option Explicit Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'メイン Private Sub userform_initialize() Call 表示 End Sub '表示 Sub 表示() '乱数発生 Randomize Dim 行番号 As Long Dim 乱数 As Long 行番号 = Worksheets("sheet1").Range("a65536").End(xlUp).Row 乱数 = Int(Rnd * 行番号) + 1 Label1.Caption = Cells(乱数, 1).Value Sleep (1000) Label1.Caption = Cells(乱数, 2).Value End Sub
257 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 00:01:44 ] >>256 なにが上手いこといかないのか良く分からないんですが、 きっとエラーになるのではなくて、いきなり表示がCells(乱数,2)の値に なると仮定してレス Private Sub userform_initialize() はFormが表示されるまえに起こるイベントなんで、 表示されたときにはCells(乱数,2)が表示されてしまうと思います。 あとは、 Label1.Caption = Cells(乱数, 1).Value '追加↓ DoEvents Sleep (1000) Label1.Caption = Cells(乱数, 2).Value と、DoEventsを入れないと Sub 表示()の処理がすべて終わるまで 表示が更新されないと思いますよ。
258 名前:デフォルトの名無しさん [2007/02/15(木) 00:30:37 ] アクティブセルに色付けするとき、どう指定するんでしょうか? range("A1").interior.colorindex=36 などという例は見たのですが、特定のセルじゃなく、アクティブなセルとして指定する場合を教えてください。
259 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 00:43:08 ] range("A1")の変わりにActiveCellって書けばいいだけじゃん。 何でそんなことも調べられないの? 「アクティブなセル」でヘルプ検索したらすぐ出てくるのに。
260 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 00:50:17 ] カーソル移動したセルの色変えたいなら イベントと組み合わせて使えばよい
261 名前:258 mailto:sage [2007/02/15(木) 00:59:28 ] >>259 それも試しにやってみたのですが、色が変わらないので間違っているのかと。 ちなみにユーザー定義関数内でやろうとしていて以下のようにしてもoutputはでますが、 色が出ないんです。指定がおかしいのでしょうか? Function color(work) ActiveCell.Interior.ColorIndex = 36 color = "color" & work End Function
262 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:18:30 ] >>261 普通にできてしまったのですが…。 Function test() ActiveCell.Interior.ColorIndex = 36 End Function 同じですよね、多分?
263 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:25:42 ] >>262 たびたびすみません。同じだと思うのですが・・・。 やろうとしていることは、 ・ユーザー定義関数を作ろうとしていて(ここでいうcolorという関数) ・計算結果がある値をとればセルの色を変える というもので、上述のcolorという関数はそれをおもいっきり簡略化したものです。 やっぱり上手くいかないです・・・ もしかして根本的にわたしが勘違いしているのかもしれません。ユーザー定義関数とマクロは別物ということでしょうか?
264 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:27:47 ] 263補足 >>262 さんのを登録後、エクセル上で=test()と任意のセルに入力しても ゼロと表示されるだけで色は変わりませんでした・・・
265 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:29:16 ] 引数のworkには何が入る予定なの?
266 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:30:49 ] あー、分かった。 セルでセル関数のようにはマクロのユーザー関数は使えないよ。 ツールメニュー→マクロ→color(自分で作ったユーザ関数)を選らんで、 その時点で使うわけ。
267 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:30:54 ] >>265 ただの文字列です。
268 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:34:30 ] 「セルの計算結果」って言ってるのは、 =SUM(R[-3]C:R[-1]C) ←こういう奴の話を言ってるんだよね? で、このイコールのところに自分で作った関数を入れたいってことよね? 結論から言えば、できないんじゃないかなあ。
269 名前:268 mailto:sage [2007/02/15(木) 01:37:15 ] ごめん! ウソ言ってた。 できたよ。
270 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:37:24 ] >>261 > ユーザー定義関数内でやろうとしていて 先に書けよ。 ユーザー定義関数ってのは引数を計算して、式を入れたセルに値を返す物で 書式設定だのなんだのというシート上の操作を行うものじゃないぞ。 だからアクティブセルを取得することは出来るが操作は出来ない。それがユーザー定義関数ってものだ。 指定がおかしいんじゃなくて、やろうとしている事に対してユーザー定義関数を使おうとしているのがおかしい。 取得が出来てることはDebug.Print ActiveCell.Address(0, 0)を入れればわかるだろう。 操作がしたいならイベントを使え。
271 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:38:10 ] www.relief.jp/itnote/archives/001873.php
272 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:48:01 ] >>268 そういうやつですね。 文字列の長さからいろいろと計算させる予定でした。 結果的にダメっぽいですね。 いろいろとありがとうございました。 >>270 イベントでやるしかないのですね。 >それがユーザー定義関数ってものだ。 名言の匂いがしますね。使わせて頂きます。 >>271 参考になりました。
273 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:48:02 ] 265+266+268+269 あとはがんばって〜。寝るわ。
274 名前:デフォルトの名無しさん [2007/02/15(木) 03:47:04 ] Const a = 1 Const b = 2 Const c = 3 Sub main() a1 = 1 b1 = 1 c1 = 1 cells_a = 0 cells_b = 0 cells_c = 0 Do While cells(a1, a).Text <> "" a1 = a1 + 1 cells_a = cells_a + 1 Loop Do While cells(b1, b).Text <> "" b1 = b1 + 1 cells_b = cells_b + 1 Loop Do While cells(c1, c).Text <> "" c1 = c1 + 1 cells_c = cells_c + 1 Loop cells(1, 5).Value = cells_a cells(2, 5).Value = cells_b cells(3, 5).Value = cells_c End Sub このプログラムを短くできませんか?
275 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 04:39:47 ] 配列使うと1/3近くには出来るかも知れないが 速度は落ちるんじゃないかな
276 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 10:09:42 ] >>274 Const a = 1 Const b = 2 Const c = 3 Sub main() a1 = 1:b1 = 1:c1 = 1 With Application.WorksheetFunction cells(1, 5).Value = .Count(Range(Cells(a1,a),Cells(a1,a).End(xlDown))) cells(2, 5).Value = .count(Range(Cells(b1,b),Cells(b1,b).End(xlDown))) cells(3, 5).Value = .count(Range(Cells(c1,c),Cells(c1,c).End(xlDown))) End With End Sub 試してないけど、とかじゃダメなのか?
277 名前:256 mailto:sage [2007/02/15(木) 10:51:13 ] >>257 お答えありがとうございます。説明不足ですみませんでした。 御推察のとおり、1つ目のセルは表示されずに2つ目が表示されてしまっていました。 で、>>257 様の誤解を参考にして色々試したのですが、どうにもうまくいきません。 もう少しだけヒント頂けないでしょうか?
278 名前:sage [2007/02/15(木) 13:13:37 ] >>277 何を試してどうだめだったのか書かないと… とりあえず自分の環境では普通に動く フォームを表示したときに表示したければ UserForm_Activaue()内で Callしてみれば? とりあえず、F8でステップインしながら 動きを確認してみることをお勧めするよ 後はDebug.Printするとか。 ローカルウィンドウで 変数に期待通りの値が はいってるか確認する方法もあるし。 なんにしても情報が少なすぎだと思いますよ
279 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 13:18:21 ] うはぁ あげちった… 携帯からレスするもんじゃないな…
280 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 14:18:22 ] 他人事ながら ×UserForm_Activaue() ○UserForm_Activate() 横レス失礼
281 名前:256 mailto:sage [2007/02/15(木) 16:06:37 ] >>278 ,>>280 またまた説明足らずで申し訳ありませんでした。 で、ご指摘の方法でちゃんと出来ました! 自分の持ってるVBAの本が初心者用のものだったため、 UserForm_Active()とか全然載ってなくて方法が分かりませんでした。 今回はどうもありがとうございました!
282 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 16:27:59 ] VBに高階関数とかってないの?関数に関数を引数として渡したいだけなんだけど。
283 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 16:49:21 ] >>282 AddressOf
284 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 19:07:28 ] >>283 おお、サンクス