Excel VBA質問スレ Part7
at TECH
[前50を表示]
250:デフォルトの名無しさん
08/06/30 02:02:31
マクロを編集する時に、例えば赤のフォントにしろと言われても色番号が分からないの
ですが、どうしたらいいでしょうか?
どなたか教えてください。
251:デフォルトの名無しさん
08/06/30 04:12:46
>>250
例えば、A1を赤に塗ってみてイミディエイトウィンドに
?range("A1").interior.color
又は、
?range("A1").interior.colorindex
などと打ち込んでEnterキーを押してみる
252:デフォルトの名無しさん
08/06/30 11:03:07
誰から赤のフォントにしろって言われるの?
253:デフォルトの名無しさん
08/06/30 11:47:58
色の設定画面のトコをプリントスクリーン>ペイントに貼り付けて切り取って拡大してA4に印刷
手持ちの教本にあった番号表を直接マジックで書き込んで目に付くとこに張ってるアナログ最強
以外と見つからないんだよ色番号表。これは下の二段が無い
URLリンク(www.geocities.jp)
254:デフォルトの名無しさん
08/06/30 16:06:37
>>250
マクロ記録使って実際にその色でセルに色をつければいいだけ。
そしたら番号なんかすぐに分かる。
255:デフォルトの名無しさん
08/06/30 19:24:11
>>249
だからってApplicationをQuitしちゃだめだろ
処理を終わらせたいのであってApplicationを終わらせたいわけじゃないんだからw
256:デフォルトの名無しさん
08/06/30 19:26:41
だからEndでいいんじゃないの?
257:デフォルトの名無しさん
08/06/30 20:28:20
┐(゚〜゚)┌
258:デフォルトの名無しさん
08/06/30 20:30:31
だからExit Subの代わりにEndを使えばそこで処理は終わるだろ。
変数は初期化されるがな。
259:デフォルトの名無しさん
08/06/30 20:57:57
>>258
EndってEnd Subのことでしょ?
それだと処理は終わるけど呼び出し元に制御が戻ってしまう。
>>233は呼び出し元に戻らずに終わりたいって言ってるんだからさ。
そのためにはApplication.Quitしかないって。
260:デフォルトの名無しさん
08/06/30 21:26:56
>>259
そのEndじゃないよ
でもEndもApplication.QuitもNGだけどな
261:デフォルトの名無しさん
08/06/30 21:43:22
>>259
違うって。End知らないの?
Exit Subの代わりにEndを書いてみなよ。
そこで処理が終わるから。
ただPublic変数も含めて初期化されるけどね。
セルにでも値を置いておけばいいんじゃないの?
262:デフォルトの名無しさん
08/06/30 21:52:18
戻ってもいいようなプログラムにすればいいのに
263:デフォルトの名無しさん
08/06/30 21:54:02
戻った後でfunctionの返す値によってExit Subするのが普通だろうね。
Endとかは他の処理にも影響が出てくるからあまり使うものじゃない。
264:デフォルトの名無しさん
08/07/01 00:00:49
すみません リストの入力規則で
リストを指定するのですが、 リストのまん中ぐらいを最初に表示したいので
す どうすればよいでしょうか。
265:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/01 01:26:46
>また、表示にはメッセージボックスを使うようです。
ゲラゲラ
267:デフォルトの名無しさん
08/07/01 03:34:26
>>251,>>253
ありがとうございます。
>>252
FOM出版に言われましたW
268:デフォルトの名無しさん
08/07/01 07:13:09
>>266
わからないから笑って誤魔化すんですね(^-^;)
>>265お願いします。
269:デフォルトの名無しさん
08/07/01 07:44:27
宿題(しゅくだい)は自分(じぶん)でやりましょう。
270:デフォルトの名無しさん
08/07/01 07:50:32
>>265
>>1★5
271:デフォルトの名無しさん
08/07/01 08:11:00
実際なんとなくやったのがこれです。
Sub 国語平均()
Dim 平均 As Single
Dim 偏差値 As Single
和 = Application.WorksheetFunction.Sum(Range("c3:c52"))
数量 = "50"
平均 = 和 / 数量
MsgBox 平均
End Sub
偏差値は定義してますが、計算式がわからないので入力していません。
50人分の偏差値はどうだせばいいのでしょうか?
いろいろ失礼なことを言って申し訳ございませんでした。
明日までの課題ですから焦っていました・・・
272:デフォルトの名無しさん
08/07/01 09:22:30
>>264
「入力規則のリスト」はドロップダウンリストという分類の物で
ドロップダウンリストには入力規則のリスト、フォームツールのコンボボックス、
オブジェクトのコンボボックスなどいろいろあるが
手軽な代わりにあまり弄れないのが入力規則のリスト、
多少面倒はあるがいろいろ弄れるのがオブジェクトのコンボボックス
入力規則のリストでは君の望むことは基本的に出来ないから
オブジェクトのコンボボックスを使いましょう
DropButtonClick イベントで ListIndex プロパティを (ListCount \ 2) にしてやれば
全項目中の真ん中が、表示されるリストのトップにくるようになる
>>271
> 偏差値は定義してますが、計算式がわからないので入力していません。
> 50人分の偏差値はどうだせばいいのでしょうか?
「計算式」というのは数学の問題であって、Excelの問題でもVBAの問題でもない
つーか、ワークシート関数として用意されてるわけだが…
それにしても酷いコードだな
最近では小学校でも算数ではなく数学なんだっけ?
273:デフォルトの名無しさん
08/07/01 10:19:42
>>272
酷いコードですか…ならどういう風なコードにすればいいか教えていただけないでしょうか?
まず自分はコードがわからないんですけどね…
274:デフォルトの名無しさん
08/07/01 10:51:49
>>271
WorkSheet関数を使うのなら、averageとstdevを使えばOK.
>>273
例えば数量に文字列をセットするなんて、論外だ。
275:デフォルトの名無しさん
08/07/01 11:02:37
>>274
なるほど。
つまり、出席番号の1〜50も数式?を使ってやった方がいいんですね。
そのやり方も考えてみます。
関数も今は学校なので家に帰ったら試してみます。
276:デフォルトの名無しさん
08/07/01 19:36:30
小学校からやり直した方がいいよ
277:デフォルトの名無しさん
08/07/01 21:38:04
>>250
>>251 >>253 でOKだと思いますが、私からも補足。
Range("a1").Font.Color = vbRed
という書き方もできます。
vbRedは、カラー定数(ColorConstants)と呼ばれるもの。
他にvbBlack、vbBlueなど基本的な8色がカラー定数として
定義されているので、赤青黄ぐらいの区別なら、
これを使ってコーディングするのが楽だと思います。
8色の内容については、
VBAEditorから[表示]→[オブジェクトブラウザ]で
オブジェクトブラウザを開き、"ColorConstants"で
検索してみてください。
278:デフォルトの名無しさん
08/07/01 21:47:52
カラー定数はVBではいいがVBAでは罠がある
人には奨めない方がよろし
279:デフォルトの名無しさん
08/07/01 22:19:02
>>278
横からすんませんが、「VBAでは罠がある 」というのは何でしょう?
280:y
08/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
08/07/01 22:30:01
>>278
えっ、何ですかそれ!?
私も知りたいので、教えてくれませんか。
バージョンによって定数が示す値が違うとか?
282:237
08/07/02 15:46:14
>>280
ありがとうございます
実はCommandButtonコントロールを使う方法は真っ先に思いついたのですが
背景画像を変えても「四角い輪郭」までは消えないせいでどうにも残念な外観になってしまい
意味がありませんでした。
試行錯誤しましたが最終的にlabelコントロールを4つCommandButtonの輪郭の上に貼って
隠すことにしました(環境の違い等でズレたりしないかが一番心配)
283:y
08/07/02 22:27:45
>>282
私もPictureコントロールで試してみましたが、
確かにうまくいかないですね。
MouseDownイベントプロシージャ内で、
LoadPictureメソッドが正しく機能しないようですが、
こういう仕様なんでしょうかね。
Labelで輪郭消しとは、すごい力技!
284:デフォルトの名無しさん
08/07/03 12:55:09
>>281
俺はエクセルVBAを趣味で使ってるだけだから断定できないが
エクセルは2003まで56色しか使えなかったからカラー定数使っても
56色の中の似た色に変換されてしまうからではないかと思う
(カラーパレット変えれば対応できると思うが同時に使えるのは56色って事かな・・・)
285:デフォルトの名無しさん
08/07/03 20:27:16
6行目中ほどに配置したコマンドボタンが、左右への列移動に伴って、同様にして左右に移動
=画面の中ほどにコマンドボタンがいつもあるようにする。
には、どう書いたらいいですか?
今は、検索して探したものを元に、
commandbottun1 bottun=1 bottun=2で移動するだけで画面からすぐ、隠れてしまう状態です。
よろしく、お願いします。
286:デフォルトの名無しさん
08/07/03 21:47:25
>>285
>画面の中ほどにコマンドボタンがいつもあるようにする。
コマンドボタンがD列にあるとして
range("D6").select
activewindow.freezepanes = true
287:デフォルトの名無しさん
08/07/03 23:09:38
>>286 レス、サンクス。
ただ、それは、「ウィンドウ枠の固定」のことですよね。
説明が拙かったですが、求めているのは、例えば、アクティブセルが右に5列移動したら、
コマンドボタンも同様に5列移動するという内容のものです。
288:デフォルトの名無しさん
08/07/04 08:31:48
>>287
SelectionChangeイベントでActiveCellからOffset指定でコマンドボタンの移動位置を決めれば良い
でもツールバーをフロートで使った方がスマートだな
289:y
08/07/04 21:14:06
>>287
>>288さんの言うようなやり方もありますが、
CommandButtonを貼り付けたUserFormを表示させておく方法もあります。
(この場合UserFormのShowModalプロパティはfalseにしておくこと)
どちらがいいかは場合によりけりだと思います。
ユーザー定義のツールバーを使うやり方は、Excel自体の環境を
変えてしまうので、他人に配布したりする場合には検討の余地が
あります。でも個人で使う分には、コンパクトだし、
好きな場所にドッキングできるので、とてもスマートです。
290:デフォルトの名無しさん
08/07/05 07:52:39
2007でツールバーなくなっちゃったしねー
291:デフォルトの名無しさん
08/07/05 15:12:18
しねとはどういう事だ
292:y
08/07/06 00:04:10
>>290
職場の機種更新で、私も2007を使い始めたばかりですが、
ツールバーが使えなくなっちゃったんですか...
日本語の音声読み上げもオミットされたみたいで
ちょっぴり残念。
脱線ごめんね
293:デフォルトの名無しさん
08/07/06 01:55:10
VBAからCommandBarオブジェクト等は使えるんだけど、
実際に表示されるのはツールバーじゃなくてリボンのアドインタブなんだー
タブを切り替えて使わなきゃいけないから面倒なんだよねー
294:デフォルトの名無しさん
08/07/06 02:38:55
それを手でクイックアクセスツールバーへ追加ってできなかったっけ?
295:デフォルトの名無しさん
08/07/06 07:41:46
うん、個人使用でPersonal.xlsbに登録する類のマクロならそれでいいんだけどねー
296:デフォルトの名無しさん
08/07/06 19:11:47
VBAの初心者で 困っています。
どなたか教えて頂けるとありがたいのですが
ユーザーインターフェースで
西暦(1900年から2100まで) 月(1から12月) 日(1から31日)
をそれぞれテキストボックスに入力し
ボタンを押したら
曜日を表示させる(テキストボックス?)
というのを作ろうとしているのですが よく分かりません。
具体的には 西暦 月 日 を入力して そこから曜日を割り出す計算式(プログラム)と
うるう年の場合の計算式(プログラム)
が分かりません。
あと 入力するテキストボックスに 規定値いがいの値を入力した場合のエラー表示
もよく分かりません...。
すいません くだらない質問で...m(_ _)m
ただ 本当に困っています。
どなたかアドバイス、参考例など教えて頂けるとありがたいのですが
よろしくお願いしますm(_ _)m
297:デフォルトの名無しさん
08/07/06 19:21:32
エクセルならWEEKDAY関数で曜日返してくれなかったっけ???
298:デフォルトの名無しさん
08/07/06 21:11:04
曜日によって処理を変えるとかではなく
曜日を表示させるならWeekday関数+WeekdayName関数だな
ついでに年月日を別々のテキストボックスに入力させるならDateSerial関数も必要かな
> あと 入力するテキストボックスに 規定値いがいの値を入力した場合のエラー表示
> もよく分かりません...。
いろんな手法があるので「プログラム 入力制限」とか「VB 入力規制」とかでググろう
アルゴリズムの話なので、VBA以外での話でも応用出来るからね
でも、年、月、日くらいなら、コンボボックスをリスト選択のみの設定で使う方法もある
299:y
08/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
08/07/06 22:03:31
(続き)
UserForm上のTextBoxに入力されるべき値の範囲を制限する方法について
ですが、まずは新しくUserFormを作って、必要なTextBoxやCommandButtonを
配置するところまではできていますか。
TextBoxに値が入力された時点で値をチェックしたいなら
TextBoxコントロールのChangeイベントを、
CommandButtonが押された時点で値をチェックしたいなら
CommandButtonコントロールのClickイベントを調べて、
イベントプロシージャについて理解してください。
あとは、"TextBoxの値が規定範囲内かどうか調べて、範囲外ならエラー
処理をする"コードを、イベントプロシージャ内に記述するだけです。
301:デフォルトの名無しさん
08/07/07 14:50:44
数値データから多項式係数を割り出すのにLINEST関数を使ってます。
でもExcelの仕様で、16項までしか対応しないみたいですよね。
VBA使えば255項とか分析できるのかな?
ググったけど、そういうニーズは無いみたい…。
302:デフォルトの名無しさん
08/07/07 15:44:22
そもそも16項もできたっけ? 最近のはできるのかな。
いずれにしても、多項式係数の意味が判っているなら自分で実装できるでしょ。
303:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/07 18:52:31
こちらのスレにて質問させて下さい。
ログファイルから各種括弧(または類するもの)→ () [] 【】 <> 《》 「」
で囲まれた文字列を取り出したいのですが、どのように処理すれば
よいのでしょうか?ログなので、取り出すのは任意の文字列です。
例:
***(aaa)** → aaa
[warning]*** → warning
月火【水】木金土 → 水
305:デフォルトの名無しさん
08/07/07 19:12:21
1 FINDで”(”の位置を検索する
2 FINDで”)”の位置を検索する
3 MIDで”(”と”)”の間を抜く
4 かっこの種類だけ繰り返す
306:デフォルトの名無しさん
08/07/07 19:47:05
>>303
$で判定するとか
307:デフォルトの名無しさん
08/07/07 20:40:17
>>304
regexp
308:デフォルトの名無しさん
08/07/07 20:50:48
シート名には「!」だけじゃなくて「$」や「'」、おまけに「[」や「]」も使える。
しかも、それはブック名にも当てはまる。
その辺は考慮しなくていいのかな?
309:303
08/07/07 20:57:11
>>306
"$"で判別しても大丈夫だとは思うのですが…
"$"も"!"もシート名称で使えてしまうので、
誰かがそんなシート名称を指定してしまった場合に
対処出来ない様な気がして敬遠してたのですが…
じゃあ…"'!"で存在しない場合に"!$"で判別すれば大丈夫かもですね…
なんだかわかった気がします!
ありがとうございました!
310:308
08/07/07 21:03:49
あーでも「[」とか「]」を使ったら参照できないな
> じゃあ…"'!"で存在しない場合に"!$"で判別すれば大丈夫かもですね…
「'!」とか「!$」を含む事もできるけどね・・・
311:303
08/07/07 21:58:56
>>308、310
あれ?"'"ってシート名称に使えましたっけ…じゃあ駄目じゃん俺_| ̄|○
ブック名称を格納するときは"!"を見ておらず"]"しか見ていないので
大丈夫かと思ってたんですが…やっぱ駄目ですか?
シート名称は"!"を名称として使用すると"'"が繋ぎ部分に加えられる為、
その辺りで判別しようかなと思ったのですが…どうすればよいのやら…
なにはともあれ、お答え下さってありがとうございました!
312:y
08/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:デフォルトの名無しさん
08/07/07 22:51:52
Nameと同一かどうかはわからないけどな
314:デフォルトの名無しさん
08/07/07 23:17:54
>>311
"'"は繋ぎ部分だけじゃなくて先頭にも加えられない?っていうかつまり"'"で囲まれない?
315:303
08/07/07 23:41:30
>>312
仰る通り、現在開いているブック対象にしています。
後々、フォームに組み込もうと思ってまして…
アドインにせずに単体ツールとして運用する予定なので、
必要なファイルは予め開いていて貰うつもりで作っています。
教えて頂いたコードですが、何故か上手く動きませんでした…
Formulaの記述でストップしてしまいます…
(当方2003を使用しています。)
Formuraってバージョン依存ありましたっけ…?
もっとよく調べてみます…
>>314
シート名称からの指定ですと、確かに先頭に"'"は付きますが、
ブック名称からの指定や、フルパス指定だと先頭には"'"はつかないようです。
316:303
08/07/08 00:06:35
>>312
サンプルが動きました!
一度Variantで取り出してからRange指定しなきゃ駄目だったみたいです。
これがあればいちいち変なループ処理を組み込まずとも、
それぞれの名称を獲得できますね!
いやはや勉強不足でご迷惑をおかけしました…
皆さん、本当にありがとうございました!!
317:デフォルトの名無しさん
08/07/08 09:36:50
regexp使えば楽だったね。
318:デフォルトの名無しさん
08/07/08 11:47:39
>>302
>>301です。
VBAでworksheetfunction.linestってのがあった。
これで実装してみたけど、やっぱり16項までが限界だったみたい。
バージョンは2003です。
以上、報告まで
319:デフォルトの名無しさん
08/07/08 15:37:59
初歩的な質問なのですが、ブックを超えて操作をさせようとするとどうしても上手く動きません。
book2.xlsを開き
book1.xls の sheet2 A1 の内容を
book2.xls の sheet1 A1 に書き込む
とするにはどう書けば良いのか教えて下さい。
どなたかお願いします。
OS XP
EXCEL2000
320:y
08/07/08 16:17:05
>>303
ごめんね。>>312のコードはだいぶ変でした。
Rangeオブジェクトを取得する行は正しくは
Set rg = Range(ThisWorkbook.Sheets("Sheet1").Range("a1").Formula)
でした。でも、自分なりに解決できたとのこと、何よりです。
321:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/08 16:42:09
>>321
それだけじゃ emojiip に何が代入されてるのかも分からないよ。
察するに sheets(2) にデータテーブルを持たせてるのかな。
"かきこ" も、何故でしょうか。
ちょっと頭がボーっとしてるんで、私が読みきれてないだけだったらごめんね。
それと、位置を代入してる変数に emoji1 だと訳が分からなくなるから気をつけた方がいいかも。
324:デフォルトの名無しさん
08/07/08 16:57:17
>>323
ありがとうございます、やはりポイントだけ書き込んでも分かりづらいですよね;
そしてすみません、"かきこ"ではなく"かきお"でした;
sheets(2)はおっしゃる通りで絵文字変換表があります。
A列絵文字を入力して B列絵文字に変換しようと考えたコードなのですが
A>Bはうまくいったものの、戻すのも作ろうとコード丸写しから改編しB>Aのものを動作させると
代入したい部分だけでなくセルの前半ごと変換されてしまいました。
自分用の小さなものなので、変数名は手抜きしています;
325:デフォルトの名無しさん
08/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
08/07/08 18:06:54
>>324 済みませんでした
B>A 変換は置換対象の頭に"*"が含まれていて、ワイルドカード扱いになっていたみたいです。
なので前半がそっくり削れていたんですね;;
こういう場合は*以前を別変数に収めておいて、変換後くっつけると言うようにするしかないのでしょうか?
327:デフォルトの名無しさん
08/07/08 18:08:37
もう面倒だからRegExpでreplaceしちゃいなYO!!
328:デフォルトの名無しさん
08/07/08 18:09:11
うそです
329:314
08/07/08 19:17:00
>>315
ああ、うん、ブック名込みで囲まれるみたいだからシート名だけ見ると後ろだけだね
まあもうどうでもいいね
330:67
08/07/08 21:43:58
inStrとmidで出来るからやってるんだろうけど、
個人的には正規表現使った方がスマートだと思うんですわ。
あまり正規表現が好まれない理由って何なんでしょうか。
331:デフォルトの名無しさん
08/07/08 21:52:46
つーか、好みどうこう言えるのは、自分で解決できる奴の特権
人に聞くなら実用上不都合が無ければ良しとするべき
332:デフォルトの名無しさん
08/07/08 22:02:37
303です。
>>320
わざわざ修正後のコードをあげて下さりありがとうございました!
おかげさまでファイル取得が楽になりました。
>>329
すみません…読解力が足りませんでした…
当初の処理だと既に開いているファイル名称を対象に
ブック判断用文字列"]"
⇒"]"が見つかればシート判断用文字列"'"を直後から探す
⇒"'"が見つかれば直後からアドレス
という風に左側から一文字ずつIFを階層にさせていたため、
最初に"'"があったとしても"]"が見つからない限りブック名称とする処理をしてました。
ファイル名で"]"は入力できなかったはずなので
ブック名称は間違えようがないと思って作ってました。
…今考えると凄まじくめんどくさい処理ですね。
そんな感じなので"]"の前にある"'"は処理上認識しないからと頭の中で完結させてました。
ともあれ、アドバイスありがとうございました!
もっと勉強しておきます…
333:y
08/07/08 23:17:27
>>330
私の場合ですが、正規表現は何となく苦手なんです。
2〜3回のテストではうまくいくようでも、実際に
いろいろな文字列を処理させてみると、どうやら論理的に
穴があるらしく、意図した結果が得られないことが
よくあります。
表現が回りくどくなっても、文字数や位置をもとに単純な
条件分岐を積み重ねる作りにしておくと、事前チェックや
デバッグの際に、各行をトレースして細かいレベルの動作を
明示的にチェックでき、個人的にはとても安心です。
向き不向きもあるようで、人によっては正規表現でひょひょいと
書いてしまう方もいます。「この式で大丈夫」と確信できるのは、
正規表現の動作を頭の中でシミュレートできるからなのでしょう。
とても羨ましいです。
334:デフォルトの名無しさん
08/07/09 01:56:20
配列操作の練習を兼ね、CreateObjectで一時的に作成したシートに
コンボボックスのデータを転記し、ソートした後に配列に書き戻す…
といった事を考えたのですが、
Set myWorkbook = CreateObject("Excel.Sheet")
とした途端、元ブックのウィンドウサイズが変わってしまいます。
Application.ScreenUpdating = False では防げないようなのですが、
どうすれば挙動が見えないようにできるでしょうか?
335:デフォルトの名無しさん
08/07/09 02:23:28
ボタンを押すと、変数にA3にある変数を1足したいのですが、
Cells(1, 3).Value = "Cells(1, 3).Value" + "1"
とやっても、増えてくれません。
特に変数は使っていませんが、どのようにすれば、変数の値を増やすことができるのでしょうか?
336:デフォルトの名無しさん
08/07/09 02:59:18
>>335 " ← を取ってみ
337:デフォルトの名無しさん
08/07/09 03:03:43
>> 335 A3にある変数て何?
セルA3の値なら Cells(3,1).Value Cells(1,3).Value だとセルC3だぞ
338:335
08/07/09 03:11:38
変化がありませんでした、私の条件式に問題があると思います。
Sub 今日の日付()
' A1が今日の日付で無ければ、通し番号を1にして、A1値を今日の日付にする
If "Cells(1, 1).Value" <> Date Then
Cells(1, 3).Value = 1
Cells(1, 1).Value = Date
ActiveSheet.Name = Format(Date, "yyyymmdd")
' 今日の日付であれば通し番号を増やす
Else
Cells(1, 3).Value = Cells(1, 3).Value + 1
End If
End Sub
こんな感じです、ボタンを押したら、今日か過去か日付を判断して、
過去なら(つまりはテンプレシートをコピーした直後)
通し番号を1にして、A1の日付を今日に、
すでに今日作っているなら、
通し番号を2にして、シート名を「20080709-2」と「ハイフンと通し番号」を付け加えたかったのです
(ここはまだまだ難しくて未実装)
339:335
08/07/09 03:13:00
ちなみに、最初のifで日付が今日で無いときは処理がうまくいっています。
日付が今日なら、どうやらelse以降が実行されていないようです。
>>337
たしかに変数なんて使っていませんね、すいません。
340:デフォルトの名無しさん
08/07/09 07:24:02
なぜCells(1, 1).Valueを"で囲む?
341:デフォルトの名無しさん
08/07/09 07:39:37
>>338
>340の言うとおり。
Ifのすぐ後ろのCellsを""で囲んでいるのをとる。
342:デフォルトの名無しさん
08/07/09 10:06:13
>>304
Sub test()
Dim hoge, hogematch, piyo, hitpat, moji As String
Set hoge = CreateObject("VBScript.regexp")
moji = "月火【水】木金土"
hitpat = "【.*】"
'hitpat = "\(.*?\)" '最小マッチ、\(でエスケープ
'hitpat = "\[.*\]" 'メタ文字でググるとgood
With hoge
.Pattern = hitpat
.ignorecase = True
.Global = True
End With
Set hogematch = hoge.Execute(moji)
piyo = hogematch(0)
piyo = Replace(piyo, "】", "") '加工例1
piyo = Replace(piyo, "【", "")
'piyo = Mid(piyo, 2, 1) '加工例2
Debug.Print (piyo)
End Sub
343:デフォルトの名無しさん
08/07/09 10:13:44
コメントは適当に消してね
344:304
08/07/09 13:10:31
できました!ありがとうございます!
345:デフォルトの名無しさん
08/07/09 16:38:09
ぬお。エクセルで正則表現使えたのか!
恥ずかしながら知らなかった・・・。
横からマジ感謝。
346:338
08/07/09 18:09:41
>>340
>>341
くはー、できました!
ダブルクォートで囲むと意味が変わるのですね。
連番で上がりました。
あとは、シート名に連番をつけていくのが目標です。
VBA楽しいですね、
手作業で面倒だった、EXCELが自分専用の便利ツールになりますね。
347:デフォルトの名無しさん
08/07/09 18:57:16
ExcelがEXILEにみえてきた
348:デフォルトの名無しさん
08/07/09 19:18:04
しばしディスプレイから目を離し、遠くの緑をみつめよう〜。
349:デフォルトの名無しさん
08/07/09 22:50:21
Excel2007
WindowsXPsp2
「ズームボタンが押された状態で」印刷プレビューを開くにはどうしたらいいですか?
350:デフォルトの名無しさん
08/07/10 00:31:43
Excel-VBA は楽しいだろうが、Excelそのものはあんまし
楽しいものじゃないと思う
351:デフォルトの名無しさん
08/07/10 09:29:53
ワードとかパワポなんて仕事でも使ったことねえ
352:デフォルトの名無しさん
08/07/10 11:17:53
「Excelで文章書く奴は初心者」
ってのはよく言われる事だが実際には
全然そんなこと無いと思う。
寧ろWordで作る意味が分からない。
353:デフォルトの名無しさん
08/07/10 11:38:39
winXP。EXCEL2003
並び替えでの質問ですが、
2008年6月30日
2008年6月2日
2008年6月27日
の文字列としてあるデータを並び替えで昇順にしたいんですが
マクロの自動記録時には正確に
2008年6月30日
2008年6月27日
2008年6月2日
となりますがそのマクロを実行すると
2008年6月30日
2008年6月2日
2008年6月27日
となってしまいます。
コードは
Columns("B:H").Select
Selection.Sort Key1:=Range("B1"), Order1:=xlDescending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortTextAsNumbers
どこをどうやればうまく行くのでしょうか?
354:デフォルトの名無しさん
08/07/10 11:39:56
age
355:デフォルトの名無しさん
08/07/10 11:47:56
>>352
だよな
会社で扱うファイルのうちワードなんて1割もない
356:デフォルトの名無しさん
08/07/10 12:02:41
取り扱い説明みたいなものを書くのにはWordは楽だよ。
これで、アウトラインプロセッサ機能がもう少し使い易ければもっといいのだけれど。
まぁ、原稿用紙が美しいと思う日本人にはExcelで型に填めるのが好きな人が多いのは判らんでもないけど。
数式やコードが入るような文章書くときにも、レイアウトをそれほど意識しないでもいいのは助かるしね。
まぁ、よほどのことがない限りPowerPointは使わないけれど。
357:y
08/07/10 17:44:33
>>353
並べ替えを記録する際、きちんと「昇順」を選択していたのなら、
Order1はxlDescendingではなくxlAscendingになっているはずです。
また、自動記録時にその結果になるためには、
「並べ替えの前に」ダイアログボックスで
「数値とテキスト形式の数値を分けて並べ替えを行う」を
選択しているはずです。
その場合、DataOption1はxlSortTextAsNumbersではなく、
xlSortNormalとして記録されるはずです。
以上から、記録したマクロではないマクロを実行している可能性
があります。もし、自動記録を何度か繰り返したのなら、
いくつか似たようなマクロができてしまっていると思いますので、
よく確かめてみてください。
358:y
08/07/10 19:02:56
>>352
たぶん、この手の初心者のことを言っているのでは。
URLリンク(d.hatena.ne.jp)
...誰でも最初は初心者なので仕方ないですが...
Excelは、横幅の描画単位がかなり曖昧です。
セルの書式設定を「折り返して全体を表示する」に
したとき、編集画面ではきちんとセルの中におさまっていても、
プレビューで見るとはみ出て切れてしまったり、
セル幅とグラフオブジェクトの幅が、やはりプレビューで見ると
だいぶ違ったりするのは、やはり文書向きのソフトではないと
感じてしまいます。
でも、Excelも便利だと感じるときもあって、その1つが
行間隔を直感的にリサイズできる点。
Wordにも、行間隔スライダーみたいなツールが実装されたら
すごい便利なのに、といつも思います。
359:デフォルトの名無しさん
08/07/10 19:43:32
> 1つのシートに、縦に表1と表2が並べてあるドキュメントなのですが、
> 表1に列を追加しようとしたところ、当然ながら表2にも列が追加されてしまう
これは当然じゃないだろ…
360:y
08/07/10 21:15:15
>>349
私の知る限り、プレビュー画面を拡大するメソッドはVBAには
実装されていません(というより、プレビューが開いている間は
VBAの実行が一時的に停止しています)。
力技ですが、ショートカットコマンドを利用する方法があります。
普段はショートカットコマンドを使っていますか?
例えば、[Alt][W][F]の順でポンポンポンとキー入力すると、
ウィンドウ枠の固定ができる、といったような機能です。
うちのExcelは2003なのですが、[Alt][F][V][Z]でプレビュー画面が
ズームされます。これをVBAでは、
SendKeys "%fvz"
と表現できます。詳しくはSendKeysステートメントを調べてみてください。
ただしこれは、Excel2003までの場合です。
2007でも2003以前のショートカットの大部分は生きているので、
このステートメントをそのまま使えるかもしれませんが、
できれば2007のショートカットコマンドを調べて実装したほうがいいでしょう。
なお、SendKeysはアクティブなアプリケーションに対して有効です。
マクロをVBAEditorから実行すると、VBAEditorに対してSendKeyしてしまうので、
実行するときは必ずExcelから実行してください。
361:デフォルトの名無しさん
08/07/10 22:36:32
>>357
降順のコードからコピーしてました。
xlSortTextAsNumbers、xlSortNormal
どちらで試しても日付順にはなりません。
自動記録でなパターンを順番に記録して
実際にマクロを実行しても一度も日付順にはならないのです。
EXCELの仕様(不具合)と見たほうがいいのかな?
362:デフォルトの名無しさん
08/07/10 23:05:54
バグだの仕様だの、ってのは簡単に言ってはいかんのだ。
それを言った時点で全てが終わりってくらい重く考えないといかんよ。
プログラムは言われた通りの事”しか”やらないんだからね。
363:y
08/07/11 06:21:02
>>361
あ、すみません。>>357の私のレスに間違いがありました。
DataOption1についてはxlSortTextAsNumbersでOKでした。
訂正します。
でも、それでもうまくいかないのですか。
(うちではうまくいくのですが...)
364:デフォルトの名無しさん
08/07/11 08:27:27
俺はDataOption1とかの使い方は知らないが、そこを無視すると
"2008年6月2日"
"2008年6月27日"
この文字列の大小は9文字目の"日"と"7で"比較されるから、上の方が大きくなるのは当然じゃないのか?
バグでも何でもないと思うんだが。
文字列を日付として大小比較するなら
"2008年06月02日"
"2008年06月27日"
という形の文字列にしないとまずいんじゃないのか?
"2008年12月6日"
"2008年6月30日"
これだと下の方が大きくなるからね。
文字列の大小比較するより、データ、区切り位置、日付でシリアル値に変換した方がいいと思うがね。
365:デフォルトの名無しさん
08/07/11 08:45:49
ちょっと訂正
この文字列の大小は9文字目以降の"日"と"7日"で比較されるから
366:y
08/07/11 17:06:01
>>364
「数値に見えるものはすべて数値として並べ替えを行う」は
意外に賢くて、日付と解釈できる文字列はシリアル値として
解釈し、並べ替えてくれます。
"2008年12月6日" → 39788
"2008年6月30日" → 39629
と読まれて、きちんと6月が先頭に来ます。
ただし、"2008年0月4日"みたいな変なのは、日付を表す
シリアル値として解釈できないので、昇順で並べ替えても
12月より後ろに来ます。
>>361
...でも正直なところ、>>364の意見に賛成です。
シート上の日付文字列を、どうしても文字列のままにしておかなければ
ならない理由が特になければ、シリアル値に変換してしまった方が
いいかと。日付文字列→シリアル値の変換は、DateValue関数
で簡単にできます。変換さえすれば、昇順の並べ替えも
全く問題なくできるようになるでしょう。
367:364
08/07/11 18:29:15
>>366
トンクス。
「数値に見えるものはすべて数値として並べ替えを行う」ってのがあるのか知らなかったよ。
俺の2007の並び替えのオプションじゃ見つからんのだが....。
VBAにはDataOption1とかあるから、ちゃんと実装してるんだろうけど。
それはおいといて>>353のコードで降り順にソートすると、
"2008年6月2日"
"2008年6月27日"
これは>>353のいうようにこの通りに並ぶね。
きちんとシリアル値に解釈できてたらそんなことないはずだけどね。
そんなおかしなオプションは使わないことだろうね。
368:364
08/07/11 19:00:54
2007でいろいろ試してみたが、
"2008年6月2日"のような形式の文字列は、DataOption1:=xlSortTextAsNumbersで数値としてみてないらしいぞ。
"2008/6/2"というような形式の文字列なら、きちんとシリアル値と解釈して並び替えるようだが。
VBAでは"2008年6月2日"のようなローカルな形式はサポートしてないんじゃない?
369:y
08/07/11 19:54:57
>>368
「数値に見えるものはすべて数値として並べ替えを行う」オプションは、
2003以前のバージョンでも、普段のソートダイアログには出てきません。
セル書式が文字列になっているセルを含むセル範囲を基準に並べ替えを
行う場合に限り、「並べ替えの前に」ウィンドウが開き、その中にあります。
うちのはExcel2003ですが、上記の方法でうまく並べ替えできます。
2007では何かが変わってしまったのでしょうか...
"yyyy年m月d日"の形の文字列は、少なくとも2003のVBAでは解釈可能です。
たとえばDateValue("2008年6月2日")とすると、
正しく39601が返されます。
ひょっとして2007では、これもエラーになってしまいますか?
だとすればサポートされなくなったのかも...
職場のPCにExcel2007が入ったので、今度自分でも試してみます。
何にしても、Excel的にはシリアル値+書式指定にしておくのが
一番ですね。
370:364
08/07/11 20:08:18
うーむ、2007ではセル書式が文字列になっててもそういうウィンドウは開かないみたいね。
それからMsgBox CLng(DateValue("2008年6月2日"))とすれば2007も39601が返るよ。
とにかく>>353のいうように"2008年6月2日"って形式だと、あのコードではうまくいかないね。
昔、記録マクロが動かないことってNumberFormatで確かあったなぁ。
今回も似たようなことじゃないかな?
371:y
08/07/11 21:22:09
>>370
参考までに、Excel2003ではこうなります。
URLリンク(www2.uploda.org)
>>349
2007の印刷プレビューについて、今日職場で試してみたら、2003以前とは
全然挙動が違うようですね。
2003以前ではプレビューを開くと必ず標準状態で開きましたが、
2007ではプレビュー画面を拡大状態で閉じると、次回表示したとき
拡大状態で開いてしまうようです。従って、お望みの動作は、残念ながら
SendKeysステートメントを使っても得られないようです。
372:デフォルトの名無しさん
08/07/12 00:32:36
おれ、こういうの気持ち悪いので
いったんテンポラリバリアントで取得してタイプネーム確認する 特に日付
373:364
08/07/12 07:59:20
>>371の動画はダウンローダー使ってるせいか見れなかったが、2007でもオプションで「ふりがなを使わない」にしたらやっと「数値に見えるものはすべて数値として並べ替えを行う」のウィンドウが出たよ。
aaa bbb
2008年6月3日 2
2008年6月30日 1
2008年6月28日 3
A列の書式が文字列のこのようなデータで記録マクロをとってみたが、下のような今まで全然見たこともないようなコードだった。
Sub Macro1()
' Macro1 Macro
Range("A1:B4").Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A2:A4"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:B4")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlStroke
.Apply
End With
End Sub
これはきちんと動くようだ。
374:364
08/07/12 08:00:09
続き
そこで2003用の下のようなコードを書いて走らせてみたが、全然期待したようには動かんね。
Sub foo()
With Range("A1").CurrentRegion
.Sort Key1:=.Range("A1"), Order1:=xlDescending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortTextAsNumbers
End With
End Sub
>>353は2003で作ったマクロを2007で走らせたんじゃないの?
375:364
08/07/12 08:09:14
上の「期待したようには動かん」は、期待したようには並ばないって意味だから。
376:ちはる
08/07/12 18:44:39
regexpも良いけど、like演算子も状況によっては悪くないのよ!!!!
ぷんぷん!!!!!
Sub aho()
'3の倍数と3の付く行はアホになります。
Dim i
For i = 1 To 1000
If i Like "*3*" Then
Cells(i, 1).Value = "アホ"
ElseIf i Mod 3 = 0 Then
Cells(i, 1).Value = "アホ"
End If
Next
End Sub
もうジメジメして嫌になっちゃうわ。
377:デフォルトの名無しさん
08/07/13 11:18:51
Shellの挙動がおかしくなった。最近Windows Updateしたあたりからだと思う。
例えば、
Shell "C:\Documents and Settings\Ore\デスクトップ\hoge.bat"
が、急に動かなくなった。
実行エラー5
プロシージャの呼び出し、または引数が不正です。だって。
7月のパッチをアンインストールしても直らない。
原因わかる人いますか?
378:377
08/07/13 11:21:12
環境は、Xp + Excel 2003 です。
379:デフォルトの名無しさん
08/07/13 14:19:42
>Shell "C:\Documents and Settings\Ore\デスクトップ\hoge.bat"
>が、急に動かなくなった。
うそこけ。動くわけなかろ
380:デフォルトの名無しさん
08/07/13 15:23:02
> 379
そこは、動かない訳を書かないと。
Vista + Excel 2007で、
Shell "C:\Users\Ore\Desktop\hoge.bat"
は、動くね。
381:デフォルトの名無しさん
08/07/13 16:42:04
WinXP(アップデート済) + Excel 2003 だと動かなかった。
C直下のものでも。exeファイルなら動くね。
382:デフォルトの名無しさん
08/07/13 23:36:02
377です。
381さん、ご協力ありがとう。
ちなみに、hoge.batの中身は、何か書いてないとダメなようです。
例えば、
dir
pause
のような感じです。念のため。
あと、別のPC Xp Sp2 + Excel 2003 では、動くのを確認しました。
やっぱり、今月のパッチかな?
383:381
08/07/13 23:43:52
ああ、確かに書けば動くね。
384:デフォルトの名無しさん
08/07/14 17:37:05
質問です。1〜4の順にプログラムを進めたいと思っています。
1.メッセージボックス「セルを選んでください」。
2.メッセージボックスのOKボタンを押す。
3.シートに戻り、任意セルをクリックする。(セルが選ばれるまで先の処理に進まない)
4.選ばれたセルの情報を取得。
環境はExcel2000 WinXPです。
このような処理をしたいのですが、
どういう考え方で進めたらよいでしょうか?
よろしくお願いします。
385:デフォルトの名無しさん
08/07/14 17:53:59
Sub test()
MsgBox "セルを選んでください"
End Sub
386:デフォルトの名無しさん
08/07/14 18:01:01
>>384
結構厄介だと思うので、もっと楽にできるU/Iで作ってみてから挑戦するといいと思う。
当然ではあるが、>385では2番までしか実装されていない。
387:384
08/07/14 18:09:53
>>385
書き方が悪くてすいません。でもちょっとワロタ
メッセージボックスを出した時だけ、直後で選ぶセルの情報を取得したいんです。
>>386
厄介ですか。
Worksheet.SelectionChange やAPIでなんとか出来ないかなあと思っていたんですけど・・
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4635日前に更新/336 KB
担当:undef