1 名前:既定のプロパティさん mailto:sage [2012/01/29(日) 00:05:13.16 ] 01 pc11.2ch.net/test/read.cgi/tech/1054356121/ 02 pc11.2ch.net/test/read.cgi/tech/1168308855/ 03 pc11.2ch.net/test/read.cgi/tech/1180192018/ 04 pc11.2ch.net/test/read.cgi/tech/1189814602/ 05 pc11.2ch.net/test/read.cgi/tech/1197448064/ 06 pc11.2ch.net/test/read.cgi/tech/1205231499/ 07 pc11.2ch.net/test/read.cgi/tech/1212587819/ 08 pc11.2ch.net/test/read.cgi/tech/1219673793/ 09 pc11.2ch.net/test/read.cgi/tech/1228372971/ 10 pc12.2ch.net/test/read.cgi/tech/1235332603/ 11 pc12.2ch.net/test/read.cgi/tech/1241885130/ 12 pc12.2ch.net/test/read.cgi/tech/1247566074/ 13 pc12.2ch.net/test/read.cgi/tech/1254281104/ 14 pc12.2ch.net/test/read.cgi/tech/1262748898/ 15 pc12.2ch.net/test/read.cgi/tech/1271261239/ 16 hibari.2ch.net/test/read.cgi/tech/1280045912/ 17 hibari.2ch.net/test/read.cgi/tech/1289182437/ 18 hibari.2ch.net/test/read.cgi/tech/1298240666/ 19 hibari.2ch.net/test/read.cgi/tech/1305754555/ 20 hibari.2ch.net/test/read.cgi/tech/1312435844/ 21 hibari.2ch.net/test/read.cgi/tech/1316931607/ 前スレ: Excel VBA 質問スレ Part22 toro.2ch.net/test/read.cgi/tech/1322400978/
113 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 03:01:53.56 ] >>112 順番は逆だが気にするな 中学か高校の情報の授業なんだろうが先生が期待している回答ではないかと Sub チェック() With Selection .Interior.Pattern = xlNone .SpecialCells(xlCellTypeBlanks).Interior.Color = RGB(255, 255, 0) End With End Sub
114 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 03:16:33.90 ] >>112 Sub チェック() Selection.Interior.Color = -4142 Selection.SpecialCells(4).Interior.Color = 65535 End Sub
115 名前:デフォルトの名無しさん [2012/02/08(水) 04:11:01.60 ] >>111 スレチの質問にヒントありがとうございます。 しかし実際は>>104 なので、"物"とすることができません。 具体的には2ちゃんのレス番、名前欄手前に3つ改行を入れたいのです。 Sub TEST() With Selection.Find .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True .Text = "[0-9]{1,3} :* ??:??:??.?? ID:????????" .Replacement.Text = vbCr & vbCr & vbCr & "ここに何か". .Execute Replace:=wdReplaceAll End With End Sub 検索結果をそのまま持ってくるような関数は無いでしょうか? 上記"ここに何か"部分にそれを入れれば上手く動きそうな気がします。
116 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 07:28:55.58 ] >>115 >>97
117 名前:デフォルトの名無しさん [2012/02/08(水) 16:02:40.64 ] >>113 ,>>114 ありがとうございます!
118 名前:デフォルトの名無しさん [2012/02/08(水) 16:14:10.84 ] >>116 ありがとうございます。>>111 さんに教えて頂いたmougにて有用な回答を得て解決出来ましたので エクセルでも応用が利くかもしれないので、方法を貼っておきます。 .Replacement.Text = "^p^p^p\1" とすることで、\1が置換後の文字列をそのまま使ってくれる事を教わりました。 これで解決することが出来ました。 以上です。ご回答頂き本当にありがとうございました。
119 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 23:04:47.66 ] お邪魔します。 OS:WinXP-SP2 Ver:Excel2002です 目的:シートAとBの特定範囲を一括して印刷プレビュー Sheets(Array("A", "B")).Select Range("A1:F59").Select Selection.PrintPreview Sheets("C").Select と入れてシートAとBのA1:F59の印刷プレビューを開きたいのですが この命令を実行するとシートAのA1:F59のプレビューしか開けません。 シートAとBを一括してプレビューさせるには何が足りないのでしょうか?
120 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 23:58:52.00 ] >>119 ActiveWindow.SelectedSheets.PrintPreview
121 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 00:17:23.02 ] >>119 Worksheet オブジェクト(普通のシート)には PrintPreview メソッドが存在する、よってシートを選択してプレビューできる sheets オブジェクト(複数のシートを保持できる)には PrintPreview メソッドが存在する、よって複数のシートを選択してプレビューできる range オブジェクトには PrintPreview メソッドが存在する、よって範囲を選択してプレビューできる range オブジェクトは同一シート内なら複数の範囲を保持できる、よって同一シート内なら複数の範囲をプレビューできる ただし、Excel には複数のシートをまたがる複数の Range を保持できるオブジェクト自体が存在しない そのため、それに対応する PrintPreview メソッドも存在しない たぶん
122 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 00:36:45.70 ] >>119 PageSetupを変更して良いなら ↓はどう? Sheets("A").PageSetup.PrintArea = "A1:F59" Sheets("B").PageSetup.PrintArea = "A1:F59" Sheets(Array("A", "B")).PrintPreview
123 名前:119 mailto:sage [2012/02/09(木) 11:32:11.25 ] >>120-122 ありがとうございました。 最終的にこうなりました。 Sub 印刷プレビュー() 'セルB55の数値からシート印刷か部分印刷かを判断 If Range("B55") <> "" Then 'B55に数値が存在するならばシート印刷 Sheets(Array("請求書", "見積書")).PrintPreview Else 'B54に数値が存在しなければ部分印刷 Sheets("請求書").PageSetup.PrintArea = "A1:F59" Sheets("見積書").PageSetup.PrintArea = "A1:F59" Sheets(Array("請求書", "見積書")).PrintPreview '印刷範囲を初期化 Sheets("請求書").PageSetup.PrintArea = "A1:F119" Sheets("見積書").PageSetup.PrintArea = "A1:F119" End If End Sub
124 名前:デフォルトの名無しさん [2012/02/09(木) 17:07:00.03 ] Dim 変数 as Range このようにオブジェクト変数を使いセルを代入すると その情報の中にそのセルの上位のシートやブックも一緒に保存されてるんですか?
125 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 18:46:47.98 ] >>124 たしかParentプロパティとかに入ってたと思う。
126 名前:124 [2012/02/09(木) 19:08:28.56 ] Parentプロパティって何でしょうか? つまりそのRange型変数には入ってるってこと? その特定のセルの場所を保存するには ブック型変数(Dim〜as Workbook)、シート型変数(Dim〜as Worksheet)、セル型変数(Dim〜as Range)の3つが必要かと思ってたけど セル型ひとつで済むならかなり楽だけど、違うのかな?
127 名前:125 mailto:sage [2012/02/09(木) 19:41:53.50 ] たとえば、こんな風にやってみると レンジ型変数からシート名とブック名も取得できる でもこんなことするより シートやブックもオブジェクト変数に代入しちゃう方が早くないか? Sub test() Dim Rng As Range Set Rng = ThisWorkbook.Sheets(1).Cells(1, 1) Debug.Print Rng.Parent.Name Debug.Print Rng.Parent.Parent.Name End Sub
128 名前:125 mailto:sage [2012/02/09(木) 19:49:11.26 ] >>126 ごめん、後半読んでなかった セル範囲の指定をRange型変数ひとつでできないか、という話だったのね。 Range型変数に代入されたセル範囲はRange型変数だけで特定できるから そういう意味ではWorkBook型やWorkSheet型の変数は不要だよ。 てっきりブックやシートの指定もレンジ型一つで全部済ませたい ってことかと思ってたよ (>>127 で書いたとおりそれもできることはできるけど、 記述が長くなるからあんまりメリットを感じない。)
129 名前:デフォルトの名無しさん [2012/02/09(木) 22:17:32.76 ] バイナリファイルを読み込んでデータの中の文字列を探したいと思ってます。 バイト配列と文字列を比較するためにしなくてはいけないのですが、 型を合わせる方法がわかりません。 バイト配列から文字列、また 文字列からバイト配列に変換する方法を教えてください。 よろしくお願いします。
130 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 23:42:11.88 ] >>129 バイナリファイルを文字列に変換して処理する例(すべてのバイトをを &H0000〜&H00FF のUnicode文字として変換) Const adTypeBinary = 1 Sub Foo() bin = LoadBin("D:\misc\a.txt") n = GetBinSize(bin) Text = "" For i = 0 To n - 1 Text = Text + ChrW(CodeAt(bin, i)) Next index = InStr(Text, ChrW(&HFF)) MsgBox "最初に見つけた &HFF の位置: " + CStr(index) index = InStr(Text, "hello") MsgBox "最初に見つけた hello の位置: " + CStr(index) End Sub Function LoadBin(path) Set stm = CreateObject("ADODB.Stream") stm.Type = adTypeBinary stm.Open stm.LoadFromFile (path) LoadBin = stm.Read() stm.Close End Function Function GetBinSize(bin) GetBinSize = LenB(bin) End Function Function CodeAt(bin, index) CodeAt = AscB(MidB(bin, index + 1, 1)) End Function
131 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 23:44:26.34 ] >>129 >ANSI 形式のバイト型配列を文字列に変換する場合は、StrConv 関数を使用してください。 >Unicode 形式の配列を変換する場合は、代入式を使用してください。 以上 StrConv 関数のヘルプから それ以外の文字コードだった場合はVBAだけで簡単にやる方法は多分ない
132 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 00:19:32.83 ] 文字コードによるけど、バイナリファイルだって最初っからテキストモードでオープンすりゃええがな
133 名前:126 [2012/02/10(金) 00:29:11.59 ] >>127 >>128 すばらしい解説ありがとうございます。 なるほど、Rangeでもシートやブックの情報を裏で持ってたんですね。 頭スッキリしました。 こういうスッキリ感がプログラムという複雑化しやすいことを扱うにはものすごく重要ですしね。 ということはRangeのオブジェクト変数はものすごく便利ですね。
134 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 00:53:51.04 ] 間違ってた ○ChrW ×Chr
135 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 00:55:28.19 ] >>134 は>>130 についてです
136 名前:129 [2012/02/10(金) 01:23:07.49 ] >>130 >>134 >>135 具体的なサンプルありがとうございます。 SJISの場合はChrでUTFの場合はChrW を使えばよいのでしょうか? >>131 たしかSJISだったと思うのでStrConvを使えば 比較できるということですね。 ヘルプを確認してみます。 >>132 テキストモードでオープンすると正しく取得できない 値があるのでバイナリモードでオープンする方法を検討しています。
137 名前:130 mailto:sage [2012/02/10(金) 01:44:11.61 ] >>136 >SJISの場合はChrでUTFの場合はChrW 違う ChrWは単なる間違い 130の例で Shift_JIS の "あ" を検索したいなら、 Chr(&H82) + Chr(&HA0) を検索する必要がある 面倒だけど、その代わりバイト並びさえ分かっていれば変換による情報落ちの心配なしにどんなコードでも処理できる、という例
138 名前:デフォルトの名無しさん [2012/02/10(金) 11:13:23.28 ] VBAの基本的な文法はマスターしたのですが Error処理のしかた プロシージャのCallの呼び方 きれいなコードの書き方 イミディエト窓の使い方 バグフィックスのしかた など、普通の入門書にはほとんど書かれていないこともマスターしたいです そのためのいい本はありますか?
139 名前:デフォルトの名無しさん [2012/02/10(金) 13:05:03.46 ] これは正しいですか↓ ------------------------------------------------- LoadするとInitializeイベントが発生して、 ShowでActivateイベントが発生する。 HideするとDeactivateイベントが発生して、 UnloadでTerminateイベントが発生する。 LoadしないでShowすると自動的にLoadされてShowするし、 HideしないでUnloadしても自動的にHideされてUnloadする。
140 名前:デフォルトの名無しさん [2012/02/10(金) 13:07:14.91 ] >>139 神! こういう整理された情報こそ実用的であり非常に有用。 みんなも>>139 みたいな情報を共有しあうために貼り付けようじゃないか!
141 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 13:34:27.98 ] すくなくとも >ShowでActivateイベントが発生する。 >HideするとDeactivateイベントが発生して、 は正しくない Showした結果アクティブになればActivateイベントが発生するし Hideした結果アクティブじゃなくなればDeactivateイベントが発生する HideしたからってかならずDeactivateが発生するわけじゃない
142 名前:デフォルトの名無しさん [2012/02/10(金) 14:42:14.40 ] Workbooks(x)のxを そのworkbookの名前から取り出す方法を教えてください。
143 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 15:20:21.90 ] 取り出す必要なんてない。
144 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 16:14:52.80 ] >>142 WorkbookオブジェクトにはIndexプロパティがないので直接求めるのは無理 Workbooksコレクションをループで順番に見ていくしかない けど>>143 の言う通り、インデックス番号なんかわからなくてもプログラムは書ける 何がやりたいの?
145 名前:142 [2012/02/10(金) 16:31:35.11 ] 長いコードを短くしたいの。
146 名前:デフォルトの名無しさん [2012/02/10(金) 16:33:32.37 ] コピペをVBAコードて書く場合、 なぜ対象オブジェクトはシートなんですか? 普通に考えてセルであるべきだ。 納得される説明・理由が聞きたいのですが。
147 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 17:11:39.81 ] >>145 短くしたいなら、 dim book as workbook set book = workbooks("bookname.xls") '以降bookを使ってコードを書く の方が良くない?
148 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 17:34:20.86 ] >>145 それならオブジェクトを変数に入れた方がいい 短くなるだけでなく、処理も少し軽くなる 具体例は>>147 コードを短くする方法はいくつかあって、Withを使うのも効果的
149 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 19:10:47.12 ] >>146 そんなことをここで聞かれてもな マイクロソフトに聞け ただ、おまえが普段どんなコードでコピペしてるかしらんが 少なくとも俺はコピーするときはRangeが対象なことがほとんどだし Rangeに張りつけたければPasteSpecialも使えるぞ
150 名前:デフォルトの名無しさん [2012/02/10(金) 19:38:29.05 ] VBAでVLOOKUPのようなことをしたい場合どうしてますか?
151 名前:デフォルトの名無しさん [2012/02/10(金) 19:41:55.38 ] VBAで改行を文字列にするにはどうすればいいですか?
152 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 19:49:24.89 ] >>150 あなたはどうしてますか
153 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 19:50:09.64 ] >>151 ん?
154 名前:デフォルトの名無しさん [2012/02/10(金) 19:57:04.82 ] >>152 使い方をしらないからまだ使ったことない。 >>151 vbLINEかvbCRみたいなのなかったっけ? VBAでワークシート関数を使いたいとき、Application.WorkSheetFunctionを使えばいいと書いてあるけど どんな関数でもVBAでも使えるのですか? さらにWorkSheetFunctionのあとは単にワークシート関数の単語を書けばいいだけ?
155 名前:デフォルトの名無しさん [2012/02/10(金) 20:04:05.38 ] ワークシートとVBAで混乱するもの FindとInstr TextとFormat DateとToday その他多数 これみんなどうやって記憶してるの?
156 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:08:37.99 ] >>150 VBAでもVLOOKUP関数は普通に使える
157 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:09:39.85 ] >>154 オブジェクトブラウザで、WorksheetFunctionオブジェクトを見れば良い。 Application.WorksheetFunctionプロパティが返してくるのがこいつだから。 別にExcel固有の記述とかそういうものじゃない。
158 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:09:50.18 ] >>151 vbCr vbLf vbCrLf
159 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:09:57.92 ] なんだか真面目に質問しているようにみえないんだが 気のせい?
160 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:12:30.38 ] >>155 使ってれば自然に覚える 間違えばエラーが出るから、それを見て直す 忘れたらヘルプを見る、Googleで検索する せっかくコンピューターが色々と助けてくれるんだから 完璧に暗記することよりも、それを活用する方法を考えた方が応用範囲が広くなる
161 名前:デフォルトの名無しさん [2012/02/10(金) 20:20:58.66 ] >>156 ありがとう。それはWorksheetFunctionを使って? >>157 ありがとう。はじめオブジェクトブラウザを見てみた。たくさん入ってる関数は全部ワークシートの関数なんだね。 でも例えば単純なSum関数だとActivecell=Application.WorksheetFunction.Sum("A1:E5")と書けば そのセルに”=Sum("A1:E5")”と入力されるってことで合ってます? >>158 ありがとう。それだ。 >>159 今後仕事でVBA使うので復習中。 >>160 確かにそうですね。丸暗記はやめます。しかし例えば6か月くらいBAを全く使わないと基本機能すら忘れるね。 その忘れたときに思い出すための対策(例えば基本機能のメモと特殊的機能の一覧をノートにまとめるとか)は何かしといたほうがいいと感じてます。
162 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:25:47.45 ] >合ってます? 聞く前に試せば済むこった
163 名前:デフォルトの名無しさん [2012/02/10(金) 20:30:50.24 ] あなたの回答力も試したいと思って。
164 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:34:24.98 ] やはりそうでしたか
165 名前:デフォルトの名無しさん [2012/02/10(金) 20:34:45.43 ] >>162 試してもエラーが出るんですけど。エラいこっちゃ。
166 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:36:28.19 ] >>165 WorksheetFunction.Sum(Range("a1:e5"))
167 名前:デフォルトの名無しさん [2012/02/10(金) 20:37:47.13 ] Activecell=Application.WorksheetFunction.Sum(Range("A1:E5")) ならうまくいきました。 しかもセルには数式じゃなく結果の数値のみが表示されてる。 もしVBAでセルに数式そのものを入力したい場合はどうすればいいの?
168 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:38:30.47 ] >>167 ActiveCell.FormulaLocal = "=Sum(A1:E5)"
169 名前:デフォルトの名無しさん [2012/02/10(金) 20:38:34.59 ] >>166 1分19秒先を越された・・・・・・
170 名前:デフォルトの名無しさん [2012/02/10(金) 20:39:38.10 ] >>168 ありが十匹。 ところで単にActiveCell= "=Sum(A1:E5)"、または、ActiveCell.Value= "=Sum(A1:E5)"、でも問題ないですか?
171 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:41:56.18 ] >>170 試してみたらどうだ
172 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 21:32:09.71 ] あなたのVBA力と回答力を試しているんですが
173 名前:デフォルトの名無しさん [2012/02/10(金) 21:47:11.33 ] ワークシート関数のSumと VBaのApplication.WorksheetFunction.のあとのSumでは そのあとに続くコードが微妙に違うの? Vlookupの場合は? まさか関数ごとに全部覚えないといけないの? >>171 できた。
174 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 21:52:43.03 ] >>173 > Vlookupの場合は? 試してみたらどうだ
175 名前:デフォルトの名無しさん [2012/02/10(金) 22:03:27.91 ] VBAのコードを使って、ファイルやフォルダを自由自在に操ってみたいと思ってます。 [ファイル]と[フォルダ]のそれぞれ2つについて、 [移動][コピー][削除][名前の変更]の4つはどうコードで記述すればいいか(つまり2x4=8個について)、 どなたか教えていただけませんか? それが載ってあるサイトのURLでもいいです。 (*[フォルダ]の[削除]は、もしその中にファイルやフォルダがあったらそれも含めて全部削除するとします)
176 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 22:09:50.59 ] >>175 VBA力と回答力を試しているんですか
177 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 22:22:14.32 ] >>175 んなもん、それぞれぐぐっていけばいいだけの話だろうが Office TANAKA - トップページ officetanaka.net/ officetanaka.net/excel/vba/filesystemobject/index.htm あたり読めば?
178 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 07:56:33.53 ] あなたの検索力を試したんですよ まあまあですね
179 名前:デフォルトの名無しさん [2012/02/11(土) 17:49:13.59 ] >>178 くやしいのうwwwwwwwwwくやしいのうwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
180 名前:デフォルトの名無しさん [2012/02/11(土) 19:00:02.04 ] "w" も使い過ぎると逆効果だなあ。
181 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 22:54:53.04 ] 図形を含んだシートのコピーに関して教えてください。 セル範囲を指定してコピー、別シートに貼り付けをしているのですが、 コピー自体はできるのですが図形の大きさが変わったり、印刷した時の大きさが違ったり してしまいます。 全く同じにコピーするにはどうすればいいのでしょうか? シート自体のコピー挿入の方がいいのでしょうか? よろしくお願いします。
182 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 00:28:06.43 ] >>181 図形の生成はマクロでやってる? そうならコピペせなんでも生成時のアドレス変えてもう一つ作ればいいんじゃ? もし、マクロで生成したものでない図形を〜って話なら 図形のプロパティでセルの移動とかにあわせて大きさを変えないようにすればいけるかと。 ペースト先セルの列の幅やら行の高さやらがコピー元と違うと大きさ修正されちゃうし。
183 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 03:55:14.43 ] エスパー(マクロでやってないな)
184 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 14:52:49.17 ] こんにつわ、他人から貰ったExcelファイルがどういうコードで動いてるか見るにはどうすればいいのじゃ?
185 名前:デフォルトの名無しさん [2012/02/12(日) 14:59:31.37 ] >>184 Alt+F11
186 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 15:19:23.68 ] ありがとうちゃん
187 名前:129 [2012/02/12(日) 23:35:21.88 ] >>137 全角文字、たとえば”あ”を&H82 + &HA0に変換する場合は どうすればよいのでしょうか? 以下のように記述を比較してみましたが一致しませんでした ご教授おねがいします。 msg = Chr(Asc("あ")) msg2 = Chr("&H82") + Chr("&HA0")
188 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 23:40:08.67 ] >>187 MsgBox Hex(Asc("あ"))
189 名前:デフォルトの名無しさん [2012/02/12(日) 23:52:57.06 ] 他Bookに記述してるマクロを実行(あるいはSubやFunctionを呼び出し)することって できる? 頻繁にやるのは望ましくない?
190 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 00:22:53.83 ] >>189 たとえばBook1.xlsmのThisWorkbookにあるsub testを呼び出すなら Application.Run "Book1.xlsm!ThisWorkbook.test" でできる 頻繁どころか、アドインでもない限り他ブックのマクロ実行させるのはまったく好ましくない
191 名前:デフォルトの名無しさん [2012/02/13(月) 00:23:18.72 ] マクロでコントロールを状況に応じて増やしたいんだけど そういうことってできる? たとえば5と入力したら別Window(Form)を開いて そこに5つのラベルとテキストボックスを挿入したいの。
192 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 00:26:32.22 ] なんでマルチポストすんの?
193 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 00:57:04.90 ] >>189 もちろんできる 複数のブックから使用するマクロを別ブックにしたり、 複数のブックのマクロを呼び出すメニュー用のブックを作ったり、 xlsxのファイルで使用するためのマクロを別ブックにしたり、 いろいろ ExcelVBAの考え方としては、データを置くワークシートと、 プログラムを置く標準モジュールをどう配置するか
194 名前:187 [2012/02/13(月) 01:11:58.07 ] >>188 ありがとうございます。 MsgBox Hex(Asc("あ")) は 82A0と表示されましたが MsgBox Hex(Asc(Chr(&H82) + Chr(&HA0))) が 8145になってしまいましたが MsgBox Hex(Asc(Chr(&H82A0)) では 80A0と表示されたのでこちらとは一致させることができました。 全角文字の場合には &H80A0 のような書きかたが正しいのでしょうか? しかし >>130 のコードで ”あいうえお”を検索したく msg = Chr(&H82) + Chr(&HA0) + Chr(&H82) + Chr(&HA2) + Chr(&H82) + Chr(&HA4) + Chr(&H82) + Chr(&HA6) + Chr(&H82) + Chr(&HA8) InStr(Text, msg) とした場合には検索できるのですが msg = Chr(&H82A0) + Chr(&H82A2) + Chr(&H82A4) + Chr(&H82A6) + Chr(&H82A8) InStr(Text, msg) のような書きかたをした場合には検索できませんでした。 ”あいうえお” を検索する場合にはどういう書きかたをすればよいのでしょうか?
195 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 02:04:05.27 ] 「あいうえお」と書かれたテキストファイルを >>130 のコードに突っ込めば直ぐ解る。
196 名前:187 mailto:sage [2012/02/13(月) 02:53:20.17 ] >>195 きさま、舐めとんかゴルァ
197 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 19:33:16.74 ] 保存ダイアログが出たときに、特定のフォルダーが出るように下記の様に 書いたのですが、Win7 32bitでは希望通りの動きなのですが、64bitだと マイドキュメントが選択された状態で表示されてしまいます。 xlAPP.GetSaveAsFilename(InitialFileName:=SaveDir & FileName) 64bit版でも指定したフォルダーを選択状態にさせるにはどうすればいいですか? よろしくお願いします。
198 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 19:57:03.92 ] すみません。 コピーし忘れがありました。 一度保存すると、その時のフォルダーを保存しておいて、2回目からは SaveDirに記憶したフォルダーを選択するようにしています。 SaveaDir = CurDir そのために上記の様にして記憶するようにしています。 (このスレを読んで参考にしました。) 32bit版は変数の中身が変わるのですが、64bit版ではブックを読みだしたフォルダーから 変更されない感じです。 よろしくお願いします。
199 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 20:18:43.27 ] >>198 省略しすぎ。もう少しコードを見せられないの?
200 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 21:24:43.24 ] >>197 ディレクトリだけ? ファイル名は正しく表示されるの?
201 名前:デフォルトの名無しさん [2012/02/14(火) 15:30:51.13 ] VBAについて質問させてください! OS Windows7 2003使ってます。 下記のプログラムでYAHOO競馬からラップタイムって物だけをダウンロードしてきてるんですが、今は 1Rづつしか持って来れてないんで、これを全レース(最大で1日36R)一回の作業でダウンロードしてくる プログラムに直せませんか? 宜しくお願いいたします! Sub test() Dim ie As Object Dim elements As Object Dim i As Integer Cells.Clear Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ie.Navigate "keiba.yahoo.co.jp/race/result/1206010512/ " Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop Set elements = ie.Document.getElementsByTagName("div") For i = 0 To elements.Length - 1 If elements(i).innertext Like "ラップタイム*" Then Set elements = elements(i).getElementsByTagName("td") Exit For End If Next For i = 0 To elements.Length - 1 Range("B" & i + 1).Value = elements(i).innertext Next ie.Quit Set ie = Nothing End Sub
202 名前:デフォルトの名無しさん mailto:sage [2012/02/14(火) 17:43:32.49 ] >>197 & "\" &
203 名前:デフォルトの名無しさん mailto:sage [2012/02/14(火) 21:01:01.46 ] >>197 32ビット版なので確認できないが、 64ビット版だとSaveDirに関係なくいつもマイドキュメントが開くってことか Sub test() Const FileName = "test.xlsx" Const SaveDir = "C:\" Dim fname MsgBox CurDir fname = Application.GetSaveAsFilename(InitialFileName:=SaveDir & FileName) MsgBox CurDir End Sub
204 名前:197 mailto:sage [2012/02/14(火) 22:05:33.85 ] 皆さん、レスありがとうございます。 どうも、CurDirの返り値が32bit、64bitで違うみたいです。 32bitの時は保存したり、読み出したりした時のフォルダーが返ってくるのですが、 64bitの時は読み出したフォルダーが返ってくるみたいです。 '保存 Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name) '保存先フォルダー記憶 File_Name = Dir(Save_NAME) Save_dir = Replace(Save_NAME, File_Name, "") こんな感じでできるようになりました。
205 名前:デフォルトの名無しさん mailto:sage [2012/02/14(火) 22:07:08.20 ] × Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name) ○ Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_dir) です
206 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 00:10:13.68 ] >>201 いらん機能までゴテゴテ付けたら改行が多すぎるって怒られちったお Sub test() Dim ie As Object, elements As Object Dim i%, url$, n%, y%, m%, d%, r% Dim name As Variant Dim flg As Boolean Dim j As Variant name = Array("札幌", "函館", "福島", "新潟", "東京", "中山", "中京", "京都", "阪神", "小倉") url = "keiba.yahoo.co.jp/race/result/ " j = Application.InputBox("開催地、年月日をすべて2桁の数値で入力" & vbCrLf & _ "札幌=01,函館=02,福島=03,新潟=04,東京=05,中山=06,中京=07,京都=08,阪神=09,小倉=10", "下記の順にデータを入力してください", , , , , , Type:=2) If j = False Then Exit Sub If Len(j) <> 8 Then Exit Sub n = Left(j, 2): y = Mid(j, 3, 2): m = Mid(j, 5, 2): d = Mid(j, 7, 2) With ThisWorkbook.Sheets(1) .Cells.Clear .Cells(1, 1) = y & "年" & m & "月 " & name(n - 1) & d & "日目" For i = 1 To 11 .Cells(1, 1).Offset(i).Value = "^" & i * 200 Next i Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True
207 名前:206の続き mailto:sage [2012/02/15(水) 00:10:51.20 ] For r = 1 To 37 flg = False ie.navigate (url & y & Format(n, "00") & Format(m, "00") & Format(d, "00") & Format(r, "00") & "/") Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop Set elements = ie.document.getElementsByTagName("div") For i = 0 To elements.Length - 1 If elements(i).innerText Like "ラップタイム*" Then flg = True Set elements = elements(i).getElementsByTagName("td") Exit For End If Next i If Not flg Then .UsedRange.EntireColumn.AutoFit Exit For End If For i = 0 To elements.Length - 1 .Cells(1, 1).Offset(, r).Value = r & "R" .Cells(2, 1).Offset(i, r).Value = elements(i).innerText Next i Next r Set elements = Nothing ie.Quit Set ie = Nothing End With End Sub
208 名前:206 mailto:sage [2012/02/15(水) 00:15:06.33 ] 個人的には ie.visible=true はFalseのほうが画面の切り替えがなくて好きだけど、 非表示にしとくとIEのアクセスでエラーが出てるときの エラーメッセージも表示されなくなるんだっけ?
209 名前:206 mailto:sage [2012/02/15(水) 00:19:14.69 ] 連投スマソ 入力する年月日のうち、日は日付じゃなくて開催何日目かなので そこんとこよろしく (たとえば、06120105は中山競馬場、2012年1月の開催5日目の意味)
210 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 00:31:34.64 ] それだと一つの競馬場で36レースやらないと全レースのデータは拾えないんじゃね? 多分、一つの競馬場では1日に12レースしかやらないと思うよ。 同じ日に最大で3カ所開催するから3*12で36レースってことじゃないかな?
211 名前:206 mailto:sage [2012/02/15(水) 00:54:42.24 ] >>210 さん えーと、 ご指摘ありがとうございます・・・orz 私は競馬やったことないんで知りませんでした。 そうすると、開催地の変更もループ処理に掛けないといけないですね。 でも、ちょっと調べたところ、 keiba.yahoo.co.jp/schedule/list/2012/?month=1 ここを見たら同じ日でも場所によって開催何日目かがまちまちなので、 単純に場所だけを変えても上手くいかなそうです。 (データを取り込むURLが [年][場所][月][開催何日目][何レース]の組み合わせですので、 日付から開催日を知る方法がないとすべてのデータが取り込めません。) 同じ日に開催する場所や日数に何か規則性があるなら良いのですが、 私は競馬のことをよく知らないので見当も付きません。 力不足で申し訳ないです。
212 名前:デフォルトの名無しさん [2012/02/15(水) 02:52:59.70 ] 皆さんホントこんな初心者の為に考えてくださってありがとうございます! 何か別な方法考えてみます!
213 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 03:05:01.57 ] >>212 丸投げじゃなく自力でがんばってみる気があるなら keiba.yahoo.co.jp/schedule/list/2012/?month=1 ↑のページからURL情報を取得すればできると思うぞ 開催年と開催月 は↑のURL にあるし 開催日はページ内にあるから対象日の 開催名のリンク先URLを取得して レースNoを付加してやればいいと思う