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 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
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 ] つーか、好みどうこう言えるのは、自分で解決できる奴の特権 人に聞くなら実用上不都合が無ければ良しとするべき
332 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:02:37 ] 303です。 >>320 わざわざ修正後のコードをあげて下さりありがとうございました! おかげさまでファイル取得が楽になりました。 >>329 すみません…読解力が足りませんでした… 当初の処理だと既に開いているファイル名称を対象に ブック判断用文字列"]" ⇒"]"が見つかればシート判断用文字列"'"を直後から探す ⇒"'"が見つかれば直後からアドレス という風に左側から一文字ずつIFを階層にさせていたため、 最初に"'"があったとしても"]"が見つからない限りブック名称とする処理をしてました。 ファイル名で"]"は入力できなかったはずなので ブック名称は間違えようがないと思って作ってました。 …今考えると凄まじくめんどくさい処理ですね。 そんな感じなので"]"の前にある"'"は処理上認識しないからと頭の中で完結させてました。 ともあれ、アドバイスありがとうございました! もっと勉強しておきます…
333 名前:y mailto:sage [2008/07/08(火) 23:17:27 ] >>330 私の場合ですが、正規表現は何となく苦手なんです。 2〜3回のテストではうまくいくようでも、実際に いろいろな文字列を処理させてみると、どうやら論理的に 穴があるらしく、意図した結果が得られないことが よくあります。 表現が回りくどくなっても、文字数や位置をもとに単純な 条件分岐を積み重ねる作りにしておくと、事前チェックや デバッグの際に、各行をトレースして細かいレベルの動作を 明示的にチェックでき、個人的にはとても安心です。 向き不向きもあるようで、人によっては正規表現でひょひょいと 書いてしまう方もいます。「この式で大丈夫」と確信できるのは、 正規表現の動作を頭の中でシミュレートできるからなのでしょう。 とても羨ましいです。
334 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 01:56:20 ] 配列操作の練習を兼ね、CreateObjectで一時的に作成したシートに コンボボックスのデータを転記し、ソートした後に配列に書き戻す… といった事を考えたのですが、 Set myWorkbook = CreateObject("Excel.Sheet") とした途端、元ブックのウィンドウサイズが変わってしまいます。 Application.ScreenUpdating = False では防げないようなのですが、 どうすれば挙動が見えないようにできるでしょうか?
335 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 02:23:28 ] ボタンを押すと、変数にA3にある変数を1足したいのですが、 Cells(1, 3).Value = "Cells(1, 3).Value" + "1" とやっても、増えてくれません。 特に変数は使っていませんが、どのようにすれば、変数の値を増やすことができるのでしょうか?
336 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 02:59:18 ] >>335 " ← を取ってみ
337 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 03:03:43 ] >> 335 A3にある変数て何? セルA3の値なら Cells(3,1).Value Cells(1,3).Value だとセルC3だぞ
338 名前:335 mailto:sage [2008/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 mailto:sage [2008/07/09(水) 03:13:00 ] ちなみに、最初のifで日付が今日で無いときは処理がうまくいっています。 日付が今日なら、どうやらelse以降が実行されていないようです。 >>337 たしかに変数なんて使っていませんね、すいません。
340 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 07:24:02 ] なぜCells(1, 1).Valueを"で囲む?
341 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 07:39:37 ] >>338 >340の言うとおり。 Ifのすぐ後ろのCellsを""で囲んでいるのをとる。
342 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 10:13:44 ] コメントは適当に消してね
344 名前:304 mailto:sage [2008/07/09(水) 13:10:31 ] できました!ありがとうございます!
345 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:38:09 ] ぬお。エクセルで正則表現使えたのか! 恥ずかしながら知らなかった・・・。 横からマジ感謝。
346 名前:338 mailto:sage [2008/07/09(水) 18:09:41 ] >>340 >>341 くはー、できました! ダブルクォートで囲むと意味が変わるのですね。 連番で上がりました。 あとは、シート名に連番をつけていくのが目標です。 VBA楽しいですね、 手作業で面倒だった、EXCELが自分専用の便利ツールになりますね。
347 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:57:16 ] ExcelがEXILEにみえてきた
348 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:18:04 ] しばしディスプレイから目を離し、遠くの緑をみつめよう〜。
349 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:50:21 ] Excel2007 WindowsXPsp2 「ズームボタンが押された状態で」印刷プレビューを開くにはどうしたらいいですか?
350 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:31:43 ] Excel-VBA は楽しいだろうが、Excelそのものはあんまし 楽しいものじゃないと思う
351 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 09:29:53 ] ワードとかパワポなんて仕事でも使ったことねえ
352 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:17:53 ] 「Excelで文章書く奴は初心者」 ってのはよく言われる事だが実際には 全然そんなこと無いと思う。 寧ろWordで作る意味が分からない。
353 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/07/10(木) 11:39:56 ] age
355 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:47:56 ] >>352 だよな 会社で扱うファイルのうちワードなんて1割もない
356 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 12:02:41 ] 取り扱い説明みたいなものを書くのにはWordは楽だよ。 これで、アウトラインプロセッサ機能がもう少し使い易ければもっといいのだけれど。 まぁ、原稿用紙が美しいと思う日本人にはExcelで型に填めるのが好きな人が多いのは判らんでもないけど。 数式やコードが入るような文章書くときにも、レイアウトをそれほど意識しないでもいいのは助かるしね。 まぁ、よほどのことがない限りPowerPointは使わないけれど。
357 名前:y mailto:sage [2008/07/10(木) 17:44:33 ] >>353 並べ替えを記録する際、きちんと「昇順」を選択していたのなら、 Order1はxlDescendingではなくxlAscendingになっているはずです。 また、自動記録時にその結果になるためには、 「並べ替えの前に」ダイアログボックスで 「数値とテキスト形式の数値を分けて並べ替えを行う」を 選択しているはずです。 その場合、DataOption1はxlSortTextAsNumbersではなく、 xlSortNormalとして記録されるはずです。 以上から、記録したマクロではないマクロを実行している可能性 があります。もし、自動記録を何度か繰り返したのなら、 いくつか似たようなマクロができてしまっていると思いますので、 よく確かめてみてください。
358 名前:y mailto:sage [2008/07/10(木) 19:02:56 ] >>352 たぶん、この手の初心者のことを言っているのでは。 ttp://d.hatena.ne.jp/kagamihoge/20060427/1146130613 ...誰でも最初は初心者なので仕方ないですが... Excelは、横幅の描画単位がかなり曖昧です。 セルの書式設定を「折り返して全体を表示する」に したとき、編集画面ではきちんとセルの中におさまっていても、 プレビューで見るとはみ出て切れてしまったり、 セル幅とグラフオブジェクトの幅が、やはりプレビューで見ると だいぶ違ったりするのは、やはり文書向きのソフトではないと 感じてしまいます。 でも、Excelも便利だと感じるときもあって、その1つが 行間隔を直感的にリサイズできる点。 Wordにも、行間隔スライダーみたいなツールが実装されたら すごい便利なのに、といつも思います。
359 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:43:32 ] > 1つのシートに、縦に表1と表2が並べてあるドキュメントなのですが、 > 表1に列を追加しようとしたところ、当然ながら表2にも列が追加されてしまう これは当然じゃないだろ…
360 名前:y mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/07/10(木) 22:36:32 ] >>357 降順のコードからコピーしてました。 xlSortTextAsNumbers、xlSortNormal どちらで試しても日付順にはなりません。 自動記録でなパターンを順番に記録して 実際にマクロを実行しても一度も日付順にはならないのです。 EXCELの仕様(不具合)と見たほうがいいのかな?
362 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:05:54 ] バグだの仕様だの、ってのは簡単に言ってはいかんのだ。 それを言った時点で全てが終わりってくらい重く考えないといかんよ。 プログラムは言われた通りの事”しか”やらないんだからね。
363 名前:y mailto:sage [2008/07/11(金) 06:21:02 ] >>361 あ、すみません。>>357 の私のレスに間違いがありました。 DataOption1についてはxlSortTextAsNumbersでOKでした。 訂正します。 でも、それでもうまくいかないのですか。 (うちではうまくいくのですが...)
364 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 08:45:49 ] ちょっと訂正 この文字列の大小は9文字目以降の"日"と"7日"で比較されるから
366 名前:y mailto:sage [2008/07/11(金) 17:06:01 ] >>364 「数値に見えるものはすべて数値として並べ替えを行う」は 意外に賢くて、日付と解釈できる文字列はシリアル値として 解釈し、並べ替えてくれます。 "2008年12月6日" → 39788 "2008年6月30日" → 39629 と読まれて、きちんと6月が先頭に来ます。 ただし、"2008年0月4日"みたいな変なのは、日付を表す シリアル値として解釈できないので、昇順で並べ替えても 12月より後ろに来ます。 >>361 ...でも正直なところ、>>364 の意見に賛成です。 シート上の日付文字列を、どうしても文字列のままにしておかなければ ならない理由が特になければ、シリアル値に変換してしまった方が いいかと。日付文字列→シリアル値の変換は、DateValue関数 で簡単にできます。変換さえすれば、昇順の並べ替えも 全く問題なくできるようになるでしょう。
367 名前:364 mailto:sage [2008/07/11(金) 18:29:15 ] >>366 トンクス。 「数値に見えるものはすべて数値として並べ替えを行う」ってのがあるのか知らなかったよ。 俺の2007の並び替えのオプションじゃ見つからんのだが....。 VBAにはDataOption1とかあるから、ちゃんと実装してるんだろうけど。 それはおいといて>>353 のコードで降り順にソートすると、 "2008年6月2日" "2008年6月27日" これは>>353 のいうようにこの通りに並ぶね。 きちんとシリアル値に解釈できてたらそんなことないはずだけどね。 そんなおかしなオプションは使わないことだろうね。
368 名前:364 mailto:sage [2008/07/11(金) 19:00:54 ] 2007でいろいろ試してみたが、 "2008年6月2日"のような形式の文字列は、DataOption1:=xlSortTextAsNumbersで数値としてみてないらしいぞ。 "2008/6/2"というような形式の文字列なら、きちんとシリアル値と解釈して並び替えるようだが。 VBAでは"2008年6月2日"のようなローカルな形式はサポートしてないんじゃない?
369 名前:y mailto:sage [2008/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 mailto:sage [2008/07/11(金) 20:08:18 ] うーむ、2007ではセル書式が文字列になっててもそういうウィンドウは開かないみたいね。 それからMsgBox CLng(DateValue("2008年6月2日"))とすれば2007も39601が返るよ。 とにかく>>353 のいうように"2008年6月2日"って形式だと、あのコードではうまくいかないね。 昔、記録マクロが動かないことってNumberFormatで確かあったなぁ。 今回も似たようなことじゃないかな?
371 名前:y mailto:sage [2008/07/11(金) 21:22:09 ] >>370 参考までに、Excel2003ではこうなります。 ttp://www2.uploda.org/uporg1536890.avi.html >>349 2007の印刷プレビューについて、今日職場で試してみたら、2003以前とは 全然挙動が違うようですね。 2003以前ではプレビューを開くと必ず標準状態で開きましたが、 2007ではプレビュー画面を拡大状態で閉じると、次回表示したとき 拡大状態で開いてしまうようです。従って、お望みの動作は、残念ながら SendKeysステートメントを使っても得られないようです。
372 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 00:32:36 ] おれ、こういうの気持ち悪いので いったんテンポラリバリアントで取得してタイプネーム確認する 特に日付
373 名前:364 mailto:sage [2008/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 mailto:sage [2008/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 mailto:sage [2008/07/12(土) 08:09:14 ] 上の「期待したようには動かん」は、期待したようには並ばないって意味だから。
376 名前:ちはる mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/07/13(日) 11:18:51 ] Shellの挙動がおかしくなった。最近Windows Updateしたあたりからだと思う。 例えば、 Shell "C:\Documents and Settings\Ore\デスクトップ\hoge.bat" が、急に動かなくなった。 実行エラー5 プロシージャの呼び出し、または引数が不正です。だって。 7月のパッチをアンインストールしても直らない。 原因わかる人いますか?
378 名前:377 [2008/07/13(日) 11:21:12 ] 環境は、Xp + Excel 2003 です。
379 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 14:19:42 ] >Shell "C:\Documents and Settings\Ore\デスクトップ\hoge.bat" >が、急に動かなくなった。 うそこけ。動くわけなかろ
380 名前:デフォルトの名無しさん [2008/07/13(日) 15:23:02 ] > 379 そこは、動かない訳を書かないと。 Vista + Excel 2007で、 Shell "C:\Users\Ore\Desktop\hoge.bat" は、動くね。
381 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 16:42:04 ] WinXP(アップデート済) + Excel 2003 だと動かなかった。 C直下のものでも。exeファイルなら動くね。
382 名前:デフォルトの名無しさん [2008/07/13(日) 23:36:02 ] 377です。 381さん、ご協力ありがとう。 ちなみに、hoge.batの中身は、何か書いてないとダメなようです。 例えば、 dir pause のような感じです。念のため。 あと、別のPC Xp Sp2 + Excel 2003 では、動くのを確認しました。 やっぱり、今月のパッチかな?
383 名前:381 mailto:sage [2008/07/13(日) 23:43:52 ] ああ、確かに書けば動くね。
384 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 17:37:05 ] 質問です。1〜4の順にプログラムを進めたいと思っています。 1.メッセージボックス「セルを選んでください」。 2.メッセージボックスのOKボタンを押す。 3.シートに戻り、任意セルをクリックする。(セルが選ばれるまで先の処理に進まない) 4.選ばれたセルの情報を取得。 環境はExcel2000 WinXPです。 このような処理をしたいのですが、 どういう考え方で進めたらよいでしょうか? よろしくお願いします。
385 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 17:53:59 ] Sub test() MsgBox "セルを選んでください" End Sub
386 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 18:01:01 ] >>384 結構厄介だと思うので、もっと楽にできるU/Iで作ってみてから挑戦するといいと思う。 当然ではあるが、>385では2番までしか実装されていない。
387 名前:384 mailto:sage [2008/07/14(月) 18:09:53 ] >>385 書き方が悪くてすいません。でもちょっとワロタ メッセージボックスを出した時だけ、直後で選ぶセルの情報を取得したいんです。 >>386 厄介ですか。 Worksheet.SelectionChange やAPIでなんとか出来ないかなあと思っていたんですけど・・
388 名前:って書くと、知らないのに書くなとか書かれるんだろうなぁw mailto:sage [2008/07/14(月) 18:11:43 ] >Worksheet.SelectionChange やAPIでなんとか出来ないかなあと思っていたんですけど・・ それが判っていて、厄介じゃないと思うなら自分でやってみてくれ。 説明するのも厄介だぞ。
389 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 18:28:53 ] InputBoxメソッドで Typeを8でどうさ?
390 名前:384 mailto:sage [2008/07/14(月) 19:06:52 ] >>388 いえいえ。どうもありがとうございます。 知っているから厄介だと分かるのだと思います。 別の考え方や参考になる意見を聞けたらいいなあと思ってました。 説明も厄介であれば仕方ないです。 >>389 なんだかよさそうですね。 タイプ8にこんな機能があったとは・・ とりあえずそれでやってみます。 >>386 さんの言うとおりU/I使ってあんまり欲張らないで ちょっとずつやっていくほうがいいみたいですね。 みなさんホントどうもです。聞いてよかったです。
391 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 19:13:25 ] >385もあながち悪くないと思った暑い夕暮れ
392 名前:y mailto:sage [2008/07/14(月) 22:03:21 ] >>384 SelectionChangeイベントを使う場合の考え方: パブリック変数を用意し、イベント許可フラグとして用いる。 イベント発生時、イベントプロシージャの冒頭で イベント許可フラグが立っているか否かを判定し、 プロシージャの内容を実行するか、何もせずにプロシージャを抜けるか 分岐させるようにしておく。 こうしておけば、普段はSelectionChangeイベントが発生しても 何もせずに終わるが、「セルを選んでください」表示後にフラグを 立てれば、次のSelectionChangeイベントでプロシージャの内容が 実行される。 ここでセルの情報を取得し、最後にフラグを元に戻しておく。 --------- ここまで書いておいて何ですが、 明らかに>>389 のやり方のほうが優れています。
393 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 00:05:38 ] 1.メッセージボックス「セルを選びましたか?」 2.メッセージボックス「本当にいいんですか?」 3.メッセージボックス「いいんですね?」 1のところでなれたら使うボタンを追加しとくとか
394 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 00:29:36 ] 質問があります。 複数のワークシートにまたがった複数範囲の標準偏差を計算するため、最初はUnionでそれぞれの範囲のRangeを纏めて最後にWorksheetFunction.StDevで 計算するコードを書いてみたのですが、エラーが発生しました。 どうもUnionでは異なるワークシートのRangeは纏められないようで、何か別のいい方法は無いかと探しています。 例えば以下の例は、Sheet1の各列の中から、数値が10個以上ある列だけをUnionで纏めて標準偏差を求めるものです。 Dim myRange As Range, myMultipleRange As Range Set myMultipleRange = Nothing For Each myRange In Worksheets("Sheet1").Columns If WorksheetFunction.Count(myRange) >= 10 If myMultipleRange Is Nothing Then Set myMultipleRange = myRange Else Set myMultipleRange = Union(myMultipleRange, myRange) End If End If Next myRange If Not myMultipleRange Is Nothing Then MsgBox WorksheetFunction.StDev(myMultipleRange) End If このような標準偏差の計算を、1つのワークシートの列だけでなく、ワークブック内のワークシート全体から、 10個以上数値がある列を調べて標準偏差を計算するような方法を探しています。 ただしワークシートの個数は決まっていません。 どのような方法を使えば上手く計算することが出来るのでしょうか? 環境はWindows XP、Excel2003です。 よろしくお願いします。
395 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 08:48:16 ] >>394 作業シート作って(予め非表示で用意しておいても良いし、処理前に作成して処理後に削除しても良い) そこに必要な値を書きだして計算する またはワークシート関数を使わずに、普通に計算してもいいかもな 標準偏差関数のサンプルなんて腐るほどあるから、わざわざVBAから ワークシート関数(WorksheetFunction)呼ばなくてもどうにでもなる
396 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 12:45:01 ] ここで解説してくれる優しい方々は、やっぱりエクセル1級持ってるのかですな?
397 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 12:56:23 ] そんなもの持ってるやついるの?
398 名前:384 mailto:sage [2008/07/15(火) 13:02:18 ] >>392 レスどうもです。 「セルを選んでください」の表示前にあったセル位置の情報しか取得出来なくて、 >3.シートに戻り、任意セルをクリックする。(セルが選ばれるまで先の処理に進まない) この3番のユーザーの入力待ちがどうしても出来ません。 >>393 どうもです。 連続した作業になるので、メッセージボックスは1度だけにしたいんです。
399 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 15:42:46 ] VBAのソースコードをカラーで印刷する方法が判りません 印刷品質くらいしか選べなくてモノクロになっちゃいます 誰か教えてください・・・・
400 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 17:07:33 ] print screenで画像保存してそれをカラー印刷すれば良いじゃん
401 名前:デフォルトの名無しさん [2008/07/15(火) 17:39:35 ] VBA初心者の者ですが、 (A:B)列のセルがゼロか空白ならば、 (1:50)の行が削除される構文をどなたか教えて頂けますか。 If Then Else ステートメントを使ってやるのでしょうか。 お願い致します。
402 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 19:20:29 ] >>401 たとえばC51セルに =COUNTIF(A:B,"0")+COUNTIF(A:B,"") と式を打っておいて Sub セルクリア() If Range("C51") = 0 Then Else Range("1:1", "50:50").Clear End If End Sub これで一応できるよ
403 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 19:25:06 ] なんか間違えた 無かったことにしてW
404 名前:y mailto:sage [2008/07/15(火) 21:20:07 ] >>398 以下のコードを実装して、GetRangeを実行してみてください。 "セルを選んでください"が表示された直後に限り、 SelectionChangeイベントプロシージャの3行目以降が実行され、 さらにそこから"次の処理"プロシージャが呼ばれます。 ■Module1 Public evFlag As Boolean Public selectedRange As Range Public Sub GetRange() MsgBox "セルを選んでください" evFlag = True End Sub Public Sub 次の処理() MsgBox selectedRange.Address & "が選ばれました" End Sub ■Sheet1 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If evFlag = False Then Exit Sub Set selectedRange = Target evFlag = False Call 次の処理 End Sub
405 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 21:25:23 ] >>398 メッセージの表示と入力を分ける必要はあるの? これじゃダメなのか? Sub セル選択() Dim X As Range On Error Resume Next Set X = Application.InputBox(Prompt:="セルを選択して下さい", Title:="セルの選択", Type:=8) On Error GoTo 0 If Not X Is Nothing Then MsgBox "選択したセルは " & X.Address Else MsgBox "キャンセルしたよ" End If End Sub
406 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 21:28:08 ] >>399 そもそもVBEのカラー定義は貧弱だから その辺が強力かつ表示通りにカラー印刷出来るテキストエディタ使った方がいい
407 名前:y mailto:sage [2008/07/15(火) 21:31:21 ] >>398 念のためにまた書きますが、InputBoxメソッドを使った方が はるかに簡単です。ほぼ同じことが以下の5行でできます。 しかも、他シートのRangeも取得可能です。 Public Sub GetRange2() Dim selectedRange As Range Set selectedRange = Application.InputBox("セルを選んでください", Type:=8) MsgBox selectedRange.Address & "が選ばれました" End Sub >>404 の利点は、セルが選ばれた瞬間に次の処理を発動させられる 点ぐらいです。(上の例はOKボタンを押す必要があります)
408 名前:y mailto:sage [2008/07/15(火) 21:32:34 ] >>405 あ、かぶっちゃった。
409 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 21:34:37 ] Addressをデバッグ画面やmsgboxに表示させるときは Address(0, 0)とした方が解りやすいぞ 習慣にしておこう
410 名前:401 [2008/07/15(火) 21:47:30 ] >402 >403 ドンマイ w でも、ありがとうございます。 どなたか、わかる方いらっしゃいますか?
411 名前:353 [2008/07/15(火) 21:56:21 ] 並び替えのことで質問したものですが 結局シリアル値での日付列を追加して無事処理できました。 いろいろとありがとうございますorz
412 名前:y mailto:sage [2008/07/15(火) 22:51:16 ] >>410 ■初心者向け Public Sub Del1() Dim tmp As Range For Each tmp In Range("A:B") If tmp.Value <> "" Then If tmp.Value <> 0 Then Exit Sub End If End If Next Range("1:50").Delete End Sub
413 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 23:00:52 ] >>410 なんか質問がおかしいように思うよ。 >>412 さんの構文の通り、セルに名前を付けてあるの? 名前を付けたセルの値が・・・って事なら構わないんだけど、 何か勘違いしてるかな。 A:B列の、どのセルを対象にしたいの?範囲は無し? A列かB列の任意のセルに0か空欄があった場合、1行目から50行目までを削除するの?
414 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 23:35:23 ] VB6で質問があるのですが セルの値が分数で記述されているのを 隣のシートに小数点表記で表示させる方法ってありますか? 隣のシートには表示出来るのですが、小数点にならなくて
415 名前:y mailto:sage [2008/07/15(火) 23:59:33 ] >>410 ■玄人向け(処理が速い) Public Sub Del2() Dim rg As Range, tmp As Range With Range("A:B") On Error GoTo err1 Set rg = .SpecialCells(xlCellTypeFormulas) For Each tmp In rg If tmp <> 0 Then Exit Sub Next err1: On Error GoTo 0 On Error GoTo err2 Set rg = .SpecialCells(xlCellTypeConstants) For Each tmp In rg If tmp <> 0 Then Exit Sub Next err2: Range("1:50").Delete End With End Sub -------- >>413 たぶん>>410 さんは、A:B列の「すべての」セルが0または""なら 1:50行を削除したい、という意図だろうと受け取っています。 ちなみに>>412 では、名前は使っていないつもりですが、 どの部分のことですか?
416 名前:y mailto:sage [2008/07/16(水) 00:12:24 ] >>414 小数点表記させたいセルの書式を"標準"または"数値"にしてください。 "数値"にした場合は、小数点以下何桁まで表示させるかを指定してください。 VBAで処理したい場合は、NumberFormatプロパティで操作できます。 それをキーワードに検索してみてください。
417 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 00:39:04 ] >>410 WorksheetFunctionを使った場合もどうぞ Sub 削除() With Application.WorksheetFunction If (.CountIf(Range("A1:B50"), 0) <> 0) Or (.CountIf(Range("A1:B50"), "") <> 0) Then Range("1:50").Delete End If End With End Sub だけど範囲がAB列全部てどうなのさww いや、AB列全部に0もしくは空白が無いならいいけどさ End(xlUp)とかを使ってデータの最終行を取得するとかをした方が いいんじゃない?
418 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 00:57:59 ] もう1つFindを使った場合もどうぞ Sub 削除2() Dim X(1) As Variant With Range("A1:B50") Set X(0) = .Find(0) Set X(1) = .Find("") If Not (X(0) Is Nothing) Or Not (X(1) Is Nothing) Then Range("1:50").Delete End If End With End Sub あと、テストするのに範囲をA1:B50に指定してるから
419 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 01:31:40 ] >>401 念のため補足しておくと、 >>412 , >>415 は、範囲内のすべてのセルの値が(空白または0)なら削除を行う処理 >>417-418 は、範囲内に(空白または0)のセルが1個でも含まれていたら削除を行う処理 をアドバイスしている。 これは>>410 の質問の仕方が曖昧だから。
420 名前:y mailto:sage [2008/07/16(水) 02:43:27 ] >>394 StDev関数は、Rangeオブジェクトだけでなく、配列変数も引数として 受け取ることができます。次のコードを試してみてください。 Sub t() Dim args As Variant args = Array(1, 2, 3, 4, 5) Debug.Print WorksheetFunction.StDev(args) End Sub つまり、各シートに散らばっている数値を、いったん 配列変数にまとめ、配列ごとStDev関数に渡すやり方が可能です。 (Unionでやろうとしたことと考え方は同じです)
421 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 08:27:19 ] 確かに、慣れてない奴にウェブで調べさせた怪しげな標準偏差関数を自作させるよりは、 >420の方が余程まともだな。