[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 04/03 17:04 / Filesize : 336 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part7



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 ]
つーか、好みどうこう言えるのは、自分で解決できる奴の特権
人に聞くなら実用上不都合が無ければ良しとするべき






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<336KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef