1 名前:デフォルトの名無しさん [2008/06/04(水) 22:56:59 ] すまんが2の人テンプレやって ExcelのVBAに関する質問スレです 質問前に 【 >>2-3 】 あたりを良く読むこと 前スレ pc11.2ch.net/test/read.cgi/tech/1205231499/l50 ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
231 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 17:57:33 ] >>219 > "プログラマ"として食って行けるでしょうか? > VBAオンリーのプログラマでデスマ(すなわち残業)を避けて生きていくことは > 可能でしょうか? 無理、世の中そんなに甘くない 事務職で"ちょこっと重宝"されるくらいで"優遇"すらされない VBAは君ごときでも使えることからも解るように、使える奴は婦女子の中にも腐るほど居る 他言語一切ダメで、基礎から学んだわけではなく行き当たりばったりで覚えたような奴なら尚更 まぁ、OfficeはOfficeでもVSTOを完璧に使いこなせたら、それだけで食っていけるけどな それこそ残業云々どころか出社すらせず在宅労働で食っていける とはいえ、身に付けるだけで食っていけるような技術は、君ごときが容易に手に出来るものじゃないけどな
232 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 19:13:55 ] >>230 ありがとうございます!
233 名前:デフォルトの名無しさん [2008/06/27(金) 20:16:03 ] Userformから呼び出したSubプロシージャ内で 処理を終わらせるにはどうしたらいいですか? 今は戻り値で判定するのに functionで呼び出しています。 イベントプロシージャに戻らない方法を 教えてください。
234 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 21:41:24 ] > 今は戻り値で判定するのに > functionで呼び出しています。 その方法で良いわけだが > イベントプロシージャに戻らない方法を > 教えてください。 無いけど なんでそんなことをしたがるのかねぇ 初心者の考えることはわからん
235 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 21:44:31 ] Endじゃないの?
236 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 22:04:52 ] 233の説明通りならEndは違う
237 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 23:49:12 ] XPとWin2000でexcel2000を利用しています。 ユーザーフォームのcommandbuttonではあまりに味気ないので マウスクリックやエンターキーの両方でフォーカスを取得して操作できる 画像で出来たボタンを作りたいと考えています (マウスオーバーで色が変わり、クリック時にボタンを押したような画像に差し換わる) 使えるイベントの都合的にframeに背景画像を指定するなどいろいろ考えたのですが どうもうまくいきません(画像が切り替わらない・エンターキーを押しても他のコントロールに抜けられない等) 何かよい知恵もしくはもっと適切なコントロールオブジェクトはないでしょうか?
238 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 00:30:05 ] >>224 ならよかったよ。 処理が最大値検索になってるのは意地悪したわけじゃないよ…。 最小値を勘違いして最大値で作っちゃった。ごめん。
239 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 04:03:14 ] >>219 単価が安いのを我慢できるんなら。 >>231 のように、必死で新規参入を妨害しないとやっていけないくらい、 誰にでもできるし、実際たいしたことない。
240 名前:デフォルトの名無しさん [2008/06/28(土) 05:59:40 ] >>234 初心者ですみません。 代替案など教えて頂けないでしょうか? よろしくお願いします。
241 名前:デフォルトの名無しさん [2008/06/28(土) 18:22:42 ] H段の階段を「1段」あるいは「1段飛ばし」で上る。上り方は何通りあるか? これはどのような構文を使ったらいいんでしょう?
242 名前:デフォルトの名無しさん [2008/06/28(土) 18:52:01 ] VBAはプログラムじゃないだろ
243 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 18:52:27 ] 6段の階段なら 1−6段飛ばしの6通りってことか
244 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 00:15:51 ] >>242 うん、VBAはプログラムそのものではなくプログラム"言語"だね 更に言えばプログラム言語の中のマクロ言語に該当するものだな
245 名前:デフォルトの名無しさん [2008/06/29(日) 08:06:57 ] >>241 一段飛ばしする回数をnとすると (n+H-n*2)!/(n!*(H-n*2)!) 通りになる nを0からH\2までループして結果を足す
246 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 10:55:55 ] >>243 アホスwwwwww
247 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:20:05 ] >>233 呼び出された処理の最後で Application.Quitすればいいと思う。 初心者のうちはけっこうこの命令を 知らないからね。入門書にも出てこないし。
248 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:53:22 ] いいわけないだろ ApplicationをQuitしてどうするよw
249 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:00:48 ] >>248 IF文などの中で強制的に処理を打ち切るには Application.Quitしかないと思う。 ExitSubだと呼び出し元に戻ってしまうからね。
250 名前:デフォルトの名無しさん [2008/06/30(月) 02:02:31 ] マクロを編集する時に、例えば赤のフォントにしろと言われても色番号が分からないの ですが、どうしたらいいでしょうか? どなたか教えてください。
251 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 04:12:46 ] >>250 例えば、A1を赤に塗ってみてイミディエイトウィンドに ?range("A1").interior.color 又は、 ?range("A1").interior.colorindex などと打ち込んでEnterキーを押してみる
252 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 11:03:07 ] 誰から赤のフォントにしろって言われるの?
253 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 11:47:58 ] 色の設定画面のトコをプリントスクリーン>ペイントに貼り付けて切り取って拡大してA4に印刷 手持ちの教本にあった番号表を直接マジックで書き込んで目に付くとこに張ってるアナログ最強 以外と見つからないんだよ色番号表。これは下の二段が無い www.geocities.jp/chiquilin_site/data/files/color_number.html
254 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 16:06:37 ] >>250 マクロ記録使って実際にその色でセルに色をつければいいだけ。 そしたら番号なんかすぐに分かる。
255 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:24:11 ] >>249 だからってApplicationをQuitしちゃだめだろ 処理を終わらせたいのであってApplicationを終わらせたいわけじゃないんだからw
256 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:26:41 ] だからEndでいいんじゃないの?
257 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:28:20 ] ┐(゚〜゚)┌
258 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:30:31 ] だからExit Subの代わりにEndを使えばそこで処理は終わるだろ。 変数は初期化されるがな。
259 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:57:57 ] >>258 EndってEnd Subのことでしょ? それだと処理は終わるけど呼び出し元に制御が戻ってしまう。 >>233 は呼び出し元に戻らずに終わりたいって言ってるんだからさ。 そのためにはApplication.Quitしかないって。
260 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:26:56 ] >>259 そのEndじゃないよ でもEndもApplication.QuitもNGだけどな
261 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:43:22 ] >>259 違うって。End知らないの? Exit Subの代わりにEndを書いてみなよ。 そこで処理が終わるから。 ただPublic変数も含めて初期化されるけどね。 セルにでも値を置いておけばいいんじゃないの?
262 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:52:18 ] 戻ってもいいようなプログラムにすればいいのに
263 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:54:02 ] 戻った後でfunctionの返す値によってExit Subするのが普通だろうね。 Endとかは他の処理にも影響が出てくるからあまり使うものじゃない。
264 名前:デフォルトの名無しさん [2008/07/01(火) 00:00:49 ] すみません リストの入力規則で リストを指定するのですが、 リストのまん中ぐらいを最初に表示したいので す どうすればよいでしょうか。
265 名前:デフォルトの名無しさん [2008/07/01(火) 00:50:47 ] VBAの課題が全くわからないので教えてください。 はじめて質問させていただきます。 課題1:国語、数学、理科、社会の50人分の点数が掲載してあります。このデータを用いて次の処理をするプロシージャを完成させなさい。国語、数学、理科、社会の50人分のデータの平均点、偏差値を画面上に表示する。 課題2:出席番号が変化するデータに対して、国語、数学、理科、社会の平均点、偏差値を画面上に表示する。 ちなみにデータは b2に出席番号 c2に国語 d2に数学 e2理科 f2社会と入力されてます。 次にb3〜b52にNo.1〜No.50の出席番号 c3〜c52に国語の点数 d3〜d52に数学の点数 e3〜e52に理科の点数 f3 〜f52に社会の点数が入力されています。 点数は問題に関係ないと思うのでここでは書きません。 また、表示にはメッセージボックスを使うようです。 この2つの問題のプロシージャを教えていただきたいです。 どうかよろしくお願いします。 できれば、プロシージャ1行ごとに簡単な解説も付けてもらえたら嬉しいです。
266 名前:デフォルトの名無しさん [2008/07/01(火) 01:26:46 ] >また、表示にはメッセージボックスを使うようです。 ゲラゲラ
267 名前:デフォルトの名無しさん [2008/07/01(火) 03:34:26 ] >>251 ,>>253 ありがとうございます。 >>252 FOM出版に言われましたW
268 名前:デフォルトの名無しさん [2008/07/01(火) 07:13:09 ] >>266 わからないから笑って誤魔化すんですね(^-^;) >>265 お願いします。
269 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 07:44:27 ] 宿題(しゅくだい)は自分(じぶん)でやりましょう。
270 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 07:50:32 ] >>265 >>1 ★5
271 名前:デフォルトの名無しさん [2008/07/01(火) 08:11:00 ] 実際なんとなくやったのがこれです。 Sub 国語平均() Dim 平均 As Single Dim 偏差値 As Single 和 = Application.WorksheetFunction.Sum(Range("c3:c52")) 数量 = "50" 平均 = 和 / 数量 MsgBox 平均 End Sub 偏差値は定義してますが、計算式がわからないので入力していません。 50人分の偏差値はどうだせばいいのでしょうか? いろいろ失礼なことを言って申し訳ございませんでした。 明日までの課題ですから焦っていました・・・
272 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 09:22:30 ] >>264 「入力規則のリスト」はドロップダウンリストという分類の物で ドロップダウンリストには入力規則のリスト、フォームツールのコンボボックス、 オブジェクトのコンボボックスなどいろいろあるが 手軽な代わりにあまり弄れないのが入力規則のリスト、 多少面倒はあるがいろいろ弄れるのがオブジェクトのコンボボックス 入力規則のリストでは君の望むことは基本的に出来ないから オブジェクトのコンボボックスを使いましょう DropButtonClick イベントで ListIndex プロパティを (ListCount \ 2) にしてやれば 全項目中の真ん中が、表示されるリストのトップにくるようになる >>271 > 偏差値は定義してますが、計算式がわからないので入力していません。 > 50人分の偏差値はどうだせばいいのでしょうか? 「計算式」というのは数学の問題であって、Excelの問題でもVBAの問題でもない つーか、ワークシート関数として用意されてるわけだが… それにしても酷いコードだな 最近では小学校でも算数ではなく数学なんだっけ?
273 名前:デフォルトの名無しさん [2008/07/01(火) 10:19:42 ] >>272 酷いコードですか…ならどういう風なコードにすればいいか教えていただけないでしょうか? まず自分はコードがわからないんですけどね…
274 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:51:49 ] >>271 WorkSheet関数を使うのなら、averageとstdevを使えばOK. >>273 例えば数量に文字列をセットするなんて、論外だ。
275 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 11:02:37 ] >>274 なるほど。 つまり、出席番号の1〜50も数式?を使ってやった方がいいんですね。 そのやり方も考えてみます。 関数も今は学校なので家に帰ったら試してみます。
276 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:36:30 ] 小学校からやり直した方がいいよ
277 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 21:38:04 ] >>250 >>251 >>253 でOKだと思いますが、私からも補足。 Range("a1").Font.Color = vbRed という書き方もできます。 vbRedは、カラー定数(ColorConstants)と呼ばれるもの。 他にvbBlack、vbBlueなど基本的な8色がカラー定数として 定義されているので、赤青黄ぐらいの区別なら、 これを使ってコーディングするのが楽だと思います。 8色の内容については、 VBAEditorから[表示]→[オブジェクトブラウザ]で オブジェクトブラウザを開き、"ColorConstants"で 検索してみてください。
278 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 21:47:52 ] カラー定数はVBではいいがVBAでは罠がある 人には奨めない方がよろし
279 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 22:19:02 ] >>278 横からすんませんが、「VBAでは罠がある 」というのは何でしょう?
280 名前:y mailto:sage [2008/07/01(火) 22:27:26 ] >>237 CommandButtonの背景画像を切り替えてみてはどうでしょうか? CommandButton1.Picture = LoadPicture("画像ファイルのパス") で、指定した画像に変わります。 画像を3つ用意して、 (1.通常時 2.マウスオーバー時 3.クリック時) 以下のイベントのタイミングで切り替えます。 初期設定 →1 CommandButton1.MouseMove →2 CommnadButton1.MouseDown →3 CommandButton1.MouseUp →2 UserForm1.MouseMove →1
281 名前:277 mailto:sage [2008/07/01(火) 22:30:01 ] >>278 えっ、何ですかそれ!? 私も知りたいので、教えてくれませんか。 バージョンによって定数が示す値が違うとか?
282 名前:237 mailto:sage [2008/07/02(水) 15:46:14 ] >>280 ありがとうございます 実はCommandButtonコントロールを使う方法は真っ先に思いついたのですが 背景画像を変えても「四角い輪郭」までは消えないせいでどうにも残念な外観になってしまい 意味がありませんでした。 試行錯誤しましたが最終的にlabelコントロールを4つCommandButtonの輪郭の上に貼って 隠すことにしました(環境の違い等でズレたりしないかが一番心配)
283 名前:y mailto:sage [2008/07/02(水) 22:27:45 ] >>282 私もPictureコントロールで試してみましたが、 確かにうまくいかないですね。 MouseDownイベントプロシージャ内で、 LoadPictureメソッドが正しく機能しないようですが、 こういう仕様なんでしょうかね。 Labelで輪郭消しとは、すごい力技!
284 名前:デフォルトの名無しさん [2008/07/03(木) 12:55:09 ] >>281 俺はエクセルVBAを趣味で使ってるだけだから断定できないが エクセルは2003まで56色しか使えなかったからカラー定数使っても 56色の中の似た色に変換されてしまうからではないかと思う (カラーパレット変えれば対応できると思うが同時に使えるのは56色って事かな・・・)
285 名前:デフォルトの名無しさん [2008/07/03(木) 20:27:16 ] 6行目中ほどに配置したコマンドボタンが、左右への列移動に伴って、同様にして左右に移動 =画面の中ほどにコマンドボタンがいつもあるようにする。 には、どう書いたらいいですか? 今は、検索して探したものを元に、 commandbottun1 bottun=1 bottun=2で移動するだけで画面からすぐ、隠れてしまう状態です。 よろしく、お願いします。
286 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 21:47:25 ] >>285 >画面の中ほどにコマンドボタンがいつもあるようにする。 コマンドボタンがD列にあるとして range("D6").select activewindow.freezepanes = true
287 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 23:09:38 ] >>286 レス、サンクス。 ただ、それは、「ウィンドウ枠の固定」のことですよね。 説明が拙かったですが、求めているのは、例えば、アクティブセルが右に5列移動したら、 コマンドボタンも同様に5列移動するという内容のものです。
288 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 08:31:48 ] >>287 SelectionChangeイベントでActiveCellからOffset指定でコマンドボタンの移動位置を決めれば良い でもツールバーをフロートで使った方がスマートだな
289 名前:y mailto:sage [2008/07/04(金) 21:14:06 ] >>287 >>288 さんの言うようなやり方もありますが、 CommandButtonを貼り付けたUserFormを表示させておく方法もあります。 (この場合UserFormのShowModalプロパティはfalseにしておくこと) どちらがいいかは場合によりけりだと思います。 ユーザー定義のツールバーを使うやり方は、Excel自体の環境を 変えてしまうので、他人に配布したりする場合には検討の余地が あります。でも個人で使う分には、コンパクトだし、 好きな場所にドッキングできるので、とてもスマートです。
290 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 07:52:39 ] 2007でツールバーなくなっちゃったしねー
291 名前:デフォルトの名無しさん [2008/07/05(土) 15:12:18 ] しねとはどういう事だ
292 名前:y mailto:sage [2008/07/06(日) 00:04:10 ] >>290 職場の機種更新で、私も2007を使い始めたばかりですが、 ツールバーが使えなくなっちゃったんですか... 日本語の音声読み上げもオミットされたみたいで ちょっぴり残念。 脱線ごめんね
293 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 01:55:10 ] VBAからCommandBarオブジェクト等は使えるんだけど、 実際に表示されるのはツールバーじゃなくてリボンのアドインタブなんだー タブを切り替えて使わなきゃいけないから面倒なんだよねー
294 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 02:38:55 ] それを手でクイックアクセスツールバーへ追加ってできなかったっけ?
295 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 07:41:46 ] うん、個人使用でPersonal.xlsbに登録する類のマクロならそれでいいんだけどねー
296 名前:デフォルトの名無しさん [2008/07/06(日) 19:11:47 ] VBAの初心者で 困っています。 どなたか教えて頂けるとありがたいのですが ユーザーインターフェースで 西暦(1900年から2100まで) 月(1から12月) 日(1から31日) をそれぞれテキストボックスに入力し ボタンを押したら 曜日を表示させる(テキストボックス?) というのを作ろうとしているのですが よく分かりません。 具体的には 西暦 月 日 を入力して そこから曜日を割り出す計算式(プログラム)と うるう年の場合の計算式(プログラム) が分かりません。 あと 入力するテキストボックスに 規定値いがいの値を入力した場合のエラー表示 もよく分かりません...。 すいません くだらない質問で...m(_ _)m ただ 本当に困っています。 どなたかアドバイス、参考例など教えて頂けるとありがたいのですが よろしくお願いしますm(_ _)m
297 名前:デフォルトの名無しさん [2008/07/06(日) 19:21:32 ] エクセルならWEEKDAY関数で曜日返してくれなかったっけ???
298 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 21:11:04 ] 曜日によって処理を変えるとかではなく 曜日を表示させるならWeekday関数+WeekdayName関数だな ついでに年月日を別々のテキストボックスに入力させるならDateSerial関数も必要かな > あと 入力するテキストボックスに 規定値いがいの値を入力した場合のエラー表示 > もよく分かりません...。 いろんな手法があるので「プログラム 入力制限」とか「VB 入力規制」とかでググろう アルゴリズムの話なので、VBA以外での話でも応用出来るからね でも、年、月、日くらいなら、コンボボックスをリスト選択のみの設定で使う方法もある
299 名前:y mailto:sage [2008/07/06(日) 22:02:51 ] >>296 年・月・日から、曜日を求める方法はいくつかありますが、 大筋は>>298 です。まずは次の関数について調べてみてください。 ・DateSerial関数 ・Format関数 これらの機能が理解できたら、次のコードが何をしているかわかるはずです。 (うるう年でも問題ありません) Sub youbi() Dim year As Integer Dim month As Integer Dim day As Integer Dim theDate As Date Dim youbi As String year = 2008 month = 7 day = 1 myDate = DateSerial(year, month, day) youbi = Format(myDate, "aaa") MsgBox youbi End Sub (続く)
300 名前:y mailto:sage [2008/07/06(日) 22:03:31 ] (続き) UserForm上のTextBoxに入力されるべき値の範囲を制限する方法について ですが、まずは新しくUserFormを作って、必要なTextBoxやCommandButtonを 配置するところまではできていますか。 TextBoxに値が入力された時点で値をチェックしたいなら TextBoxコントロールのChangeイベントを、 CommandButtonが押された時点で値をチェックしたいなら CommandButtonコントロールのClickイベントを調べて、 イベントプロシージャについて理解してください。 あとは、"TextBoxの値が規定範囲内かどうか調べて、範囲外ならエラー 処理をする"コードを、イベントプロシージャ内に記述するだけです。
301 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 14:50:44 ] 数値データから多項式係数を割り出すのにLINEST関数を使ってます。 でもExcelの仕様で、16項までしか対応しないみたいですよね。 VBA使えば255項とか分析できるのかな? ググったけど、そういうニーズは無いみたい…。
302 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 15:44:22 ] そもそも16項もできたっけ? 最近のはできるのかな。 いずれにしても、多項式係数の意味が判っているなら自分で実装できるでしょ。
303 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 18:39:24 ] 質問させて下さい。 OS:winXP SP2 EXCEL ver:2003 【質問内容】 数式1〜3からVBAを使用して ファイル名、シート名、セルをそれぞれ分割し変数に格納したいです。 どんな方法が適切でしょうか? 数式1⇒=[ブック]シート!$A$1 数式2⇒=[ブック]シート!'!$A$1 数式3⇒=[ブック]シート!!!'!$A$1 現在の処理はDoとMidを使用して左3文字目からIfを使って 1文字ずつ文字判断させています。 "]"がでたら3文字目から"]"の手前までブック名称⇒変数Aへ "!"がでたら"]"の直後から"!"の手前までシート名称⇒変数Bへ "!"の直後からはセル⇒変数Cへ 数式1では問題ないのですが、数式2、3みたいに シート名称に"!"が含まれている場合にシート名称が正常に変数Bに格納されません。 Midを使って"'!"の場合にシート名称を読み込んだとしても、 数式2、3はそれで回避出来ても今度は数式1が認識できなくなってしまいます。 他に良い方法があるのかもしれませんが、全く思いつきません。 わかりにくい文章で申し訳ありませんが、 どうか、ご教授の程よろしくお願いします。
304 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 18:52:31 ] こちらのスレにて質問させて下さい。 ログファイルから各種括弧(または類するもの)→ () [] 【】 <> 《》 「」 で囲まれた文字列を取り出したいのですが、どのように処理すれば よいのでしょうか?ログなので、取り出すのは任意の文字列です。 例: ***(aaa)** → aaa [warning]*** → warning 月火【水】木金土 → 水
305 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 19:12:21 ] 1 FINDで”(”の位置を検索する 2 FINDで”)”の位置を検索する 3 MIDで”(”と”)”の間を抜く 4 かっこの種類だけ繰り返す
306 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 19:47:05 ] >>303 $で判定するとか
307 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 20:40:17 ] >>304 regexp
308 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 20:50:48 ] シート名には「!」だけじゃなくて「$」や「'」、おまけに「[」や「]」も使える。 しかも、それはブック名にも当てはまる。 その辺は考慮しなくていいのかな?
309 名前:303 mailto:sage [2008/07/07(月) 20:57:11 ] >>306 "$"で判別しても大丈夫だとは思うのですが… "$"も"!"もシート名称で使えてしまうので、 誰かがそんなシート名称を指定してしまった場合に 対処出来ない様な気がして敬遠してたのですが… じゃあ…"'!"で存在しない場合に"!$"で判別すれば大丈夫かもですね… なんだかわかった気がします! ありがとうございました!
310 名前:308 mailto:sage [2008/07/07(月) 21:03:49 ] あーでも「[」とか「]」を使ったら参照できないな > じゃあ…"'!"で存在しない場合に"!$"で判別すれば大丈夫かもですね… 「'!」とか「!$」を含む事もできるけどね・・・
311 名前:303 mailto:sage [2008/07/07(月) 21:58:56 ] >>308 、310 あれ?"'"ってシート名称に使えましたっけ…じゃあ駄目じゃん俺_| ̄|○ ブック名称を格納するときは"!"を見ておらず"]"しか見ていないので 大丈夫かと思ってたんですが…やっぱ駄目ですか? シート名称は"!"を名称として使用すると"'"が繋ぎ部分に加えられる為、 その辺りで判別しようかなと思ったのですが…どうすればよいのやら… なにはともあれ、お答え下さってありがとうございました!
312 名前:y mailto:sage [2008/07/07(月) 22:39:46 ] >>303 数式1〜3がセル参照として成り立っており、かつ 参照先のブックが開いているという前提なら、 単純な方法があります。 (なお、参照先のブックが閉じられた状態では、>>303 の 数式1〜3のようなセル参照は普通はありえません。 普通は保存して閉じるだろうし、保存して閉じれば 数式は絶対パスを含む形に自動的に置き換わるからです。) ■考え方 数式1〜3はいずれもセル参照なので、 参照先のRangeオブジェクトを得ることができます。 そこから、Parentプロパティを使って、 親シートおよび親ブックを割り出します。 ■具体例 Book1とBook2が開いていて、 Book1のセルA1に =[Book2]Sheet1!$A$1 という式が設定されているとします。 Dim rg as Range Dim adr as String, sh as String, bk as String Set rg = Range(Thisworkbook.Sheets("Book1").Formula) adr = rg.Address sh = rg.Parent.Name bk = rg.Parent.Parent.Name
313 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 22:51:52 ] Nameと同一かどうかはわからないけどな
314 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 23:17:54 ] >>311 "'"は繋ぎ部分だけじゃなくて先頭にも加えられない?っていうかつまり"'"で囲まれない?
315 名前:303 mailto:sage [2008/07/07(月) 23:41:30 ] >>312 仰る通り、現在開いているブック対象にしています。 後々、フォームに組み込もうと思ってまして… アドインにせずに単体ツールとして運用する予定なので、 必要なファイルは予め開いていて貰うつもりで作っています。 教えて頂いたコードですが、何故か上手く動きませんでした… Formulaの記述でストップしてしまいます… (当方2003を使用しています。) Formuraってバージョン依存ありましたっけ…? もっとよく調べてみます… >>314 シート名称からの指定ですと、確かに先頭に"'"は付きますが、 ブック名称からの指定や、フルパス指定だと先頭には"'"はつかないようです。
316 名前:303 mailto:sage [2008/07/08(火) 00:06:35 ] >>312 サンプルが動きました! 一度Variantで取り出してからRange指定しなきゃ駄目だったみたいです。 これがあればいちいち変なループ処理を組み込まずとも、 それぞれの名称を獲得できますね! いやはや勉強不足でご迷惑をおかけしました… 皆さん、本当にありがとうございました!!
317 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:36:50 ] regexp使えば楽だったね。
318 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:47:39 ] >>302 >>301 です。 VBAでworksheetfunction.linestってのがあった。 これで実装してみたけど、やっぱり16項までが限界だったみたい。 バージョンは2003です。 以上、報告まで
319 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 15:37:59 ] 初歩的な質問なのですが、ブックを超えて操作をさせようとするとどうしても上手く動きません。 book2.xlsを開き book1.xls の sheet2 A1 の内容を book2.xls の sheet1 A1 に書き込む とするにはどう書けば良いのか教えて下さい。 どなたかお願いします。 OS XP EXCEL2000
320 名前:y mailto:sage [2008/07/08(火) 16:17:05 ] >>303 ごめんね。>>312 のコードはだいぶ変でした。 Rangeオブジェクトを取得する行は正しくは Set rg = Range(ThisWorkbook.Sheets("Sheet1").Range("a1").Formula) でした。でも、自分なりに解決できたとのこと、何よりです。
321 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:23:58 ] emoji1 = InStr(ActiveCell, "か") emoji = Mid$(ActiveCell, emoji1, 3) emojip = Worksheets(2).Cells.Find(emoji).Offset(, -1) ActiveCell.Replace what:=emoji, Replacement:=emojip このようなマクロで activecell="あかきくお" emoji="かき"だった場合に 置換した後はactivecvell="かきこ" となってemoji以前がそっくり削られてしまいます どのように書けばactivecellの中のemojiだけを置換できるのでしょうか?
322 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:28:48 ] >>319 ヒント。 Workbooks.Open ("C:\2.xls") Workbooks("2.xls").Sheets("sheet1").Range("A1").Value = Workbooks("1.xls").Sheets("sheet2").Range("A1").Value 後は自分で考えれ。
323 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:42:09 ] >>321 それだけじゃ emojiip に何が代入されてるのかも分からないよ。 察するに sheets(2) にデータテーブルを持たせてるのかな。 "かきこ" も、何故でしょうか。 ちょっと頭がボーっとしてるんで、私が読みきれてないだけだったらごめんね。 それと、位置を代入してる変数に emoji1 だと訳が分からなくなるから気をつけた方がいいかも。
324 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:57:17 ] >>323 ありがとうございます、やはりポイントだけ書き込んでも分かりづらいですよね; そしてすみません、"かきこ"ではなく"かきお"でした; sheets(2)はおっしゃる通りで絵文字変換表があります。 A列絵文字を入力して B列絵文字に変換しようと考えたコードなのですが A>Bはうまくいったものの、戻すのも作ろうとコード丸写しから改編しB>Aのものを動作させると 代入したい部分だけでなくセルの前半ごと変換されてしまいました。 自分用の小さなものなので、変数名は手抜きしています;
325 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:38:48 ] うーん。先ずはもっと小さく組んで、それが上手く行ったら大きくして行かないとデバッグ出来ないかもなぁ。 具体的に言うと、変数には予め代入してしまう。 ActiveCellじゃなくて、変数で文字列を代入しておくといいね。 あと、findする列が決まってるならば、cellsで全体から検索ではなくて、columnsで指定した方がスマートです。 dim hoge as string dim emoji as string dim emojiip hoge = "あかきくお" emoji = "かき" emojiip = sheets("sheet2").columns(2).find(emoji).offset(0,-1) まず、ステップインでF8を押しつつ1行ずつ実行して行って、emojiipに目的の物が代入されたかをチェック。 その後で、 hoge.replace what:=emoji , replacement:=emojiip こんな感じで、どこにおかしい部分があるかを少しずつ調べて行くと良いですよ。
326 名前:321 mailto:sage [2008/07/08(火) 18:06:54 ] >>324 済みませんでした B>A 変換は置換対象の頭に"*"が含まれていて、ワイルドカード扱いになっていたみたいです。 なので前半がそっくり削れていたんですね;; こういう場合は*以前を別変数に収めておいて、変換後くっつけると言うようにするしかないのでしょうか?
327 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 18:08:37 ] もう面倒だからRegExpでreplaceしちゃいなYO!!
328 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 18:09:11 ] うそです
329 名前:314 mailto:sage [2008/07/08(火) 19:17:00 ] >>315 ああ、うん、ブック名込みで囲まれるみたいだからシート名だけ見ると後ろだけだね まあもうどうでもいいね
330 名前:67 mailto:sage [2008/07/08(火) 21:43:58 ] inStrとmidで出来るからやってるんだろうけど、 個人的には正規表現使った方がスマートだと思うんですわ。 あまり正規表現が好まれない理由って何なんでしょうか。
331 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 21:52:46 ] つーか、好みどうこう言えるのは、自分で解決できる奴の特権 人に聞くなら実用上不都合が無ければ良しとするべき