1 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 15:42:51 ] ExcelのVBAに関する質問スレです 前スレ pc11.2ch.net/test/read.cgi/tech/1219673793/ ★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 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
552 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 10:08:15 ] シートをそれぞれ別ブックに保存する方法教えて。 保存名はシートの名前で。
553 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 11:38:51 ] それを手動でやる方法すら思いつかないの? 思いつくならそれをマクロの記録で録ることすら 思いつかないの?馬鹿なの?死ぬの?
554 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 11:44:17 ] >>552 ワークシートコレクションに対するループの中で (1) シートが1枚のブックを新規作成 (2) そこへシートをコピペ (3) 名前を付けて保存 (4) 新規ブックを閉じる を繰り返す とりあえず>>1 の★5の理由によりまずは自分で作ってみれ。方法は★6で。
555 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 13:44:33 ] >>551 ありがとうござました。 しかし各クラスごとに生成用のメソッドが必要とは... これがなければ理想的なんですが。
556 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 17:44:47 ] >>555 オブジェクト指向ではコンストラクタとデストラクタもクラスライブラリで用意することになってる。 というか勝手にインスタンス化するのは不可能だろ。どんだけメモリが必要かもわからんのに。
557 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 17:49:40 ] >>556 おまい判ってない。 ↓ではコンストラクタでなはく生成用のグローバルなメソッドを クラスの外に定義しろっていってんだよ。 オブジェクト指向以前の問題。 ttp://support.microsoft.com/?scid=kb%3Ben-us%3B555159&x=14&y=9
558 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 18:00:01 ] シートの表示倍率の値は取得できます?
559 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 18:44:18 ] >>556 Excelのclassのインスタンス化プロパティがPrivateかPublicNotCreatebleしか選べないから 外部から直接インスタンス化できないという仕様なのが問題で、コンストラクタは関係ない。
560 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 19:30:45 ] Withっていいな。Withでネストしまくったコード見ると癒される。
561 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 20:43:17 ] >>558 出来ますよ
562 名前:デフォルトの名無しさん [2009/01/18(日) 11:40:34 ] すみません、質問です。 エクセル2003のVBAについてです。 フォーム内に、セル(もしくは、エクセルのセルと同様の働きをするもの) の貼りつけることってできるのでしょうか?
563 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 12:15:21 ] >>562 ググれカス q.hatena.ne.jp/1148568634 これで良い?
564 名前:デフォルトの名無しさん [2009/01/18(日) 13:52:10 ] withを使った方が処理の速度は速くなりますか?
565 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 13:54:43 ] はい
566 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 13:59:02 ] EXCEL2003です。 VBAの処理の中でハイパーリンクをセルの書式設定にてロックを解除したセルに貼り、 その後シート全体をセルの選択が出来ない形で保護する つまりハイパーリンクのあるセル以外は押しても反応が無いよう保護する処理を作ったのですが、 ハイパーリンク以外のセルを押すとリンク先の画面が立ち上がってしまいます。 ハイパーリンクのあるセル以外は選択することも出来ないような画面を作りたいのですが、 何故上のような画面が出来てしまうのでしょうか?
567 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 14:34:48 ] > 何故上のような画面が出来てしまうのでしょうか? 保護により選択出来ないセル上で行ったクリック動作は 現在選択状態にあるセル上で行ったものとして扱われる 故に選択できるセルが1セルなら、どこをクリックしようとそのセルをpクリックした扱いになる 君の要望を実現するには、セル上のハイパーリンクではなく、 ボタンコントロールなどを使ってリンク先に飛ぶのが適切だろうな まあガンバレ
568 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 15:07:11 ] うん!僕がんばるよぉぉぉおおお!!
569 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 16:35:58 ] WindowsXP上でEXCEL2003を使用してます。 フォームに入力した内容を編集してシートに反映させるマクロを作成しているのですが、 マクロ実行中はシートをアクティブに出来ないのでマクロを終了させないと シートの変更内容の確認が出来ません。(テスト作業+デバッグの効率が悪い…) マクロ実行中(フォーム表示中)でも、シートのウィンドウをアクティブにしてシート選択が 可能になる方法はあるのでしょうか? よろしくおねがいします
570 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 17:58:08 ] >>569 VBEのウィンドウを最大化しなければいい
571 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 18:31:58 ] >>569 普通に見れるだろ
572 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 19:46:29 ] マクロを手動で実行ではなく、 (例)表列A1、A2に数値を入力したらリアルタイムに(マクロ側に計算式記述。例えば A1*A2)A3に結果を表示させようとする場合どうすればいいでしょう? 解説サイト見てもブック起動時実行ってのばかりしか見つからない…
573 名前:569 mailto:sage [2009/01/18(日) 19:48:39 ] もう少し作成しているマクロを説明すると、 ・マクロはsheet1上に置いたコマンドボックスから開始する(フォームが表示される) ・フォームに入力した内容が反映されるのはsheet2・sheet3 で、 ・フォームが表示されている状態ではExcelのウインドゥをアクティブにすることが出来ない ・なので、マクロで変更されている筈のsheet2・sheet3を開くことが出来ない という状態です。 >>570 VBEのウインドゥについては開いている状態でも閉じている状態でも上記の現象に変わりありません。 >>571 マクロがsheet1を編集しているなら普通に見れるとは思いますが、 編集しているのは背面にある他のシートなので…
574 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 19:48:44 ] >>572 ワークシート関数と同じ感覚? それならSelectionChangeで出来る。 シートごとに設定しないといかんけどね。
575 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 20:11:43 ] >>569 ,573 Modelessで呼べば良いだけでは? >>574 SelectionChangeではなくChangeだろ SelectionChangeは選択セルが変更されたとき Changeはセルの値が変更(入力、削除など)されたとき それと対象セルと処理内容が同じならシート毎に設定する必要も無い ブック単位、あるいは全ブックを対象に一括処理する方法もある
576 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 20:20:07 ] >>575 vbModelessを付けてフォームを開いたところ上手くいきました、 ありがとうございます。
577 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 21:34:00 ] >>574 多分functionとrangeを使ってどうにかこうにか書くのだと思うのですが上手くいかない
578 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 21:36:51 ] >>577 ヒント Workbook_SheetChange Application.EnableEvents = False
579 名前:教えてください [2009/01/20(火) 00:51:55 ] 質問です。初心者です。 複数のブックに散らばっている同じ名前のシートを、1ブックの1シートにまとめたいのですがうまくいきません。 msgbox "5"までは表示されるので、次の行がおかしいのだと思います。 「motosheet.」の記述を消すとマクロ自体は動作するのですが、コピー元のブックではなくてコピー先のブックを参照してしまいます。 なぜか、rangeの親オブジェクトを記述すると「実行時エラー 1004 アプリケーション定義またはオブジェクト定義エラー」となります。 1行前はrangeの親オブジェクトを記述しても問題ないのに・・・ 本当に困っています。よろしくお願いします。
580 名前:教えてください [2009/01/20(火) 00:52:34 ] Private Sub CommandButton2_Click() Application.ScreenUpdating = False Dim motobookspath As Variant Dim motobookpath As Variant Dim 先ブック入力済み最終行番号 As Long Dim データ貼り付け開始行番号 As Long Dim sakirange As Range Dim motorange As Range Dim motobook As Workbook Dim motosheet As Worksheet Dim 入力済み最終行番号 As Long motobookspath = Application.GetOpenFilename(filefilter:="Exclブック,*.xls", MultiSelect:=True) MsgBox "1"
581 名前:教えてください [2009/01/20(火) 00:53:00 ] For Each motobookpath In motobookspath 先ブック入力済み最終行番号 = ThisWorkbook.Worksheets("データ").Range("i1").End(xlDown).Row データ貼り付け開始行番号 = 先ブック入力済み最終行番号 + 1 MsgBox "2" Set sakirange = ThisWorkbook.Worksheets("データ").Cells(データ貼り付け開始行番号, 1) MsgBox "3" Set motobook = Workbooks.Open(Filename:=motobookpath) Set motosheet = motobook.Worksheets("データ") MsgBox "4" 入力済み最終行番号 = motosheet.Range("i1").End(xlDown).Row MsgBox "5" Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19)) motorange.Copy Destination:=sakirange motobook.Close savechanges:=True Next Application.ScreenUpdating = ture End Sub
582 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 01:06:50 ] Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19)) → Set motorange = motosheet.Range("a2", motosheet.Cells(入力済み最終行番号, 19))
583 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 06:51:42 ] 巷ではこういうコードが普通にあんのかね。
584 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 11:38:28 ] 誰もがプログラミングの専門家じゃないからね。 入門書を斜め読みして断片的な知識で「動けばいい」程度のコードを書いてる人のが圧倒的に多いよ。
585 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 19:28:45 ] 超初心者で申し訳ありませんが・・・ エクセルのシートにある数字と文字列をCSVファイルに下記のように出力したいです。 (エクセル) 123,鈴木 1013,田中 (出力) 番号,名前 0123,鈴木 1013,田中 自分で作ってみたところ、下記のように文字列になってしまいます。 (出力) ”番号”,”名前” ”0123”,”鈴木” ”1013”,”田中” となってしまいます。 どのようにすれば良いのでしょうか。 よろしくお願い致します。
586 名前:579 [2009/01/20(火) 21:14:18 ] >>582 うぉー!! ありがとうございます!!!! 2日悩み続けてました。CellsオブジェクトもThisworkbookの子オブジェクトとして認識されて しまっていたのですね。 でも悩みに悩んでいるといろんなことを考えるから、勉強にはなりますよね。 >>583 もっと違った記述方法があるんですかね?教えてください。
587 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 21:48:51 ] >>585 どんなプログラムを作ったの?
588 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:07:54 ] >>579 まず変数名に日本語を使うところからダメだわ。
589 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:14:47 ] >>588 それは場合によりけりだな
590 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:21:17 ] 場合というか,使われ方とか規模とか書く人とかによるな どちらかに決めて使い分けはしない
591 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 00:29:10 ] 俺も変数名に日本語使うの抵抗あるけど 日本語使うとコードが分りやすくなるような気もするから 使おうかなとも思うけど… でも抵抗あるんだよなー
592 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 00:39:52 ] 英語だと既存の関数名、メソッド、プロパティ、その他予約後などと被る時、 ローマ字で書くのは嫌いだから日本語で書いちゃう
593 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 01:02:53 ] >>592 確かに! 日本語で書けば被らないな てことは日本語で書いたほうが合理的だな
594 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:44:10 ] ActiveXコントロールのテキストボックスをワークシート上で使う場合、 Heightを文字の大きさの2倍以上にしないと、文字が崩れますが 解決法はありますか?
595 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 07:15:08 ] 日本語は入力が面倒臭いのが難点。
596 名前:デフォルトの名無しさん [2009/01/21(水) 20:02:04 ] Excel2003にて、インターネット上からXMLを取得して利用するツールをつくって いるところなのですが、文字化けを起こします。 Dim get_xml As Object Set get_xml = CreateObject("MSXML2.DOMDocument.3.0") get_xml.async = False get_xml.Load (src_url) 抜粋するとこのようなコードです。 このときに、 ‖ この文字だけが、半角?に変換されてしまいます。get_xml.Load した直後で既に?に変わってしまっているのですが、どうすれば解消するでしょうか? 取得するxmlはUTF-8で、IE等のブラウザから見ると正常に‖と見えます。 よろしくおねがいします。
597 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 20:23:54 ] >>596 >>1 ★3,★4
598 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 22:56:21 ] >>597 失礼しました。。。
599 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 17:46:03 ] 日本語の変数名に関しては、漢字のみの送り仮名無し。って条件ならOKにする事が多いなぁ。 送り仮名が入ると面倒だよね。 あとは、変数名一覧表を作っておく事が絶対条件かも・・・。
600 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 18:10:08 ] >>599 Option Explicitは必須だね。 なまじわかりやすすぎて、同じ意味の別の熟語に無意識に脳内変換しちゃうことがある。
601 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 19:03:30 ] 質問です。宜しくお願いします セルA1には、「8:00」がはいっているとして、 Option Explicit Sub test1() UserForm1.TextBox1 = Range("a1").Value UserForm1.Show End Sub これで、テキストボックスに「0.33333333」じゃなく、 きちんと時刻を表示させるにはどうすればよいですか。
602 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 19:27:06 ] 右辺をRange("A1").TextとかFormat$(range("A1").Value,"h:mm") など。 TextはA列のセル幅が狭いと##とかなるけど。
603 名前:質問です [2009/01/22(木) 20:03:19 ] Sub test() Cells(1, 1).Activate Do Until ActiveCell = "" 入力値 = ActiveCell If 入力値 Like "*[C,CX*,O,OX*,O2,O2X*,Fe]" = True Then If 入力値 Like "*[O,OX*]" = True Then If 入力値 Like "*O" = True Then 処理 = 1 ElseIf 入力値 Like "*X2" = True Then 処理 = 2 End If ElseIf 入力値 Like "*[Fe,Fe*]" = True Then If 入力値 Like "*Fe" = True Then 処理 = 3 ElseIf 入力値 Like "*X2" = True Then 処理 = 4 End If Else If 入力値 Like "*[O2,C]" = True Then 処理 = 5 ElseIf 入力値 Like "*X2" = True Then 処理 = 6 End If End If
604 名前:質問です [2009/01/22(木) 20:04:18 ] ElseIf 入力値 = "*[Au,AuX*,Ag,AgX*,Pt,PtX*,Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then If 入力値 Like "*[Au,AuX*,Ag,AgX*,Pt,PtX*]" = True Then If 入力値 Like "*[Au,Ag,Pt,]" = True Then 処理 = 7 ElseIf 入力値 Like "*X2" = True Then 処理 = 8 End If ElseIf 入力値 Like "*[Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then If 入力値 Like "*[Au1,Ag1,Pt1]" = True Then 処理 = 9 ElseIf 入力値 Like "*X2" = True Then 処理 = 10 End If Else 処理 = 11 End If Else 処理 = 12 End If ActiveCell.Offset(0, 1).Activate ActiveCell = 処理 ActiveCell.Offset(1, -1).Activate Loop End Sub どうも分岐がうまくいかないのですが。
605 名前:質問です [2009/01/22(木) 20:05:07 ] 以下、その処理文字列です。 対象に[*]があることで違う分岐を選んでいそうですが、 ほかのものも予想外の分岐をするのですがなぜでしょうか。 (説明が下手ですいません) J0015-1*2 J0015-2*2 J0235-2PtAuX10 H0053-1PtX2 H0036-2C H0037-1CX2 J0004-1*2-O J0004-1*3-O1X2 J0004-1*3-OX2 H0053-1Pt1X2
606 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 21:16:29 ] NAMAE = Cells(1, 1) KUMI = Cells(2, 1) If NAMAE = "" Then NAMAE = "*" End If If KUMI = "" Then KUMI = "*" End If row1 = 3 Do While Cells(row1, 1).Value = "" Set aaa = Cells(row1, 2).Find(What:=NAMAE, LookAt:=xlPart) Set bbb = Cells(row1, 3).Find(What:=KUMI, LookAt:=xlPart) If Not aaa Is Nothing And Not bbb Is Nothing Then '条件が合ったときの処理 End If row1 = row1 + 1 Loop 変数のNAMAEとKUMIを検索項目にして目当ての行を見付けるプログラムを作ってます。 例えばNAMAEに入力があればKUMIがスペースでもNAMAEが一致する行をすべて検索できるようにしたいのですが、 上のようにすると検索対象の一覧の中で名前(row1, 2)が一致しているのに、組(row1, 3)がスペースの行が検索に引っかかりません。 一覧の中で検索対象セルの入力有無に関わらず、検索に引っ掛けるようにするにはどうしたらいいでしょう? 質問がわかりにくいとは思いますがお願いします。
607 名前:606 mailto:sage [2009/01/22(木) 21:23:56 ] すいませんまちがえました。 上の Do While Cells(row1, 1).Value = "" は Do While Cells(row1, 1).Value <> "" の間違えでした。
608 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:23:09 ] 読む気になれない・・・。
609 名前:606 mailto:sage [2009/01/22(木) 23:37:24 ] すいません。 最善の処置かはわかりませんが、自己解決しました。 スレ汚し失礼しました。
610 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:05:26 ] 特定のEXCELシートが開いている時にはそのシートを閉じ、 開いていなければ何もしないという処理って可能ですか?
611 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:08:50 ] >>610 ブックじゃなくてシート?
612 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:28:23 ] >>610 ブックなら可能 やりかたは自分で調べろ
613 名前:610 mailto:sage [2009/01/23(金) 00:29:16 ] >>611 間違えました。 シートではなくブックです。 失礼しました。
614 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:04:27 ] >>613 Workbooks( ).Close
615 名前:610 mailto:sage [2009/01/23(金) 01:16:51 ] >>614 それって全部閉じませんか? ブックAでマクロを起動するとブックAはそのままでブックBを閉じる機能なんですが。 そしてブックBが閉じている状態で起動してもエラーがおきないようにしたいです。
616 名前:603 [2009/01/23(金) 01:22:49 ] 長かったので問題の箇所まとめました。 If 入力値 Like "*[C,O,O2,Fe]" = True Or 入力値 Like "*[CX,OX,O2X]*" = True Then この分岐で(入力値) J0235-2PtAuX10 H0053-1PtX2 を拾ってしまうんですが、何が原因でしょうか。
617 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:25:39 ] >>615 Workbooks( ブックB ).Close エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ 調べても考えてもわからなかったら、そこで始めて人に聞け
618 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:37:15 ] XP SP3 Excel 2002 SP3 ユーザフォームのShowModalをFalseに設定しています。 ユーザーフォームには、複数のテキストボックス、チェックボックス コマンドボタンを配置しています。 ユーザフォームとワークシート間を移動した時の イベントを教えて下さい。 Activate,Deactivateを試しましたが、該当しないようです。 宜しくお願いします。
619 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:47:47 ] >>616 色々な文字列のうち、どれがLikeの条件にヒットするか試してみたけど、法則が見えない ttp://momoiro.s4.x-beat.com/up/img/momoiro08659.png
620 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:54:13 ] >>618 該当するイベントは存在しないので、何か別の方法を考えるしかない。 例えばタイマーで一定時間ごとにアクティブなウィンドウを調べるとか、 はっきり言ってかなり面倒な方法しかなかったと思う。
621 名前:618 mailto:sage [2009/01/23(金) 02:06:26 ] >>620 有難う御座います。 やはりそうですか。ほかに力技でも考えてみます。 長いこと調べていたんで、これですっきりしました。
622 名前:デフォルトの名無しさん [2009/01/23(金) 02:11:43 ] >>619 そうですね。いろいろ試しているんですが、きびしいです。 Likeにクセあるんだろうと思いながら使えない気がしてます。 入力値をもっと制限する方法も検討しながらもう少し探ってみます。
623 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:17:18 ] あのさ、偶に勘違いしてる人が居るけど、Like演算子の文字クラスで [AB,CD,EF]とした場合、AB CD EF のどれかに一致するものではなく A B , C D E F のどれかに一致するものという意味になる つまり「 , 」は区切り文字ではなく検索文字のひとつに過ぎない >>619 の記述だと、B1のは「末尾が C , O S F e のどれかで終わるもの」という意味で C1の記述だと「C X , O 2 のどれかが含まれるもの」という意味になる その正しい仕様を理解していれば、○の付いてるものは正しく仕様法則に従っていることが解る AB CD EFのどれかで終わる場合にマッチさせたければ、"*AB"、"*CD"、"*EF"の3条件をOrで重ねるか Like演算子ではなく正規表現で"(AB|CD|EF)$"とするべきだ
624 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:19:54 ] >>622 こうなったらRightとInstrで1個ずつ調べるしかないと思う
625 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:25:34 ] >>619 たとえば、"*[CX,OX,O2X]*"は、 CかXか,かOか2を最低一つ含むという意味では?
626 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:26:37 ] >>623 なるほど、つまり "*[C,O,O2,Fe]" → "*[,2CeFO]" "*[CX,OX,O2X]*" → "*[,2COX]*" ということか。納得いった。 VBAの解説してる某有名サイトは間違ってんだな
627 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:28:49 ] >>617 ありがとうございます。 その.closeでエラー回避する方法あるんですね。 調べてみます。
628 名前:デフォルトの名無しさん [2009/01/23(金) 02:33:57 ] >>625 >>626 そうなのですか。 確かにそれなら納得がいきます。 参考にしたサイトを間違えたかも。 ありがとうございます。 長いコードを書くことが確定した。
629 名前:623 mailto:sage [2009/01/23(金) 02:40:06 ] >>626 ,>>628 OfficeTANAKAかな? まあ解説サイト作ってるからといって全てを熟知してるわけじゃないし レベルも様々だから仕方ないさ まあ、あの人レベルはそんなに低くもなく高くもなくだが もっとレベルの低い人がデタラメばかり書いてる解説サイトもあるから過信は禁物
630 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:51:41 ] >>615 プログラムってのはひとつの発想に固執せず、 いろんな角度から発想を転換してみるのが上達のコツ こういう時はエラーが起きないよう注意するより、 エラーを無視すればいいんだよ on error resume next workbooks("B.xls").close on error goto 0
631 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:24:46 ] 出来るなら 一度保存して閉じるけど
632 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:26:53 ] そういうことじゃなくて、そもそも目的のブックが開いてない可能性があるのよ。
633 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:46:04 ] もし 開いていたら 閉じる
634 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 09:08:26 ] >>602 ありがとうございます
635 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:32:21 ] A1とA2セルの書式設定の表示形式をyy.mm.ddにして A1セルに文字列で「09.08.07」と入力して a = Cells(1, 1) Cells(2, 1) = Mid(a, 1, 2) & "/" & Mid(a, 4, 2) & "/" & Mid(a, 7, 2) 上のような処理を実行すると何故かA2セルに「07.09.08」と順番が入れ替わって表記されてしまいます。 何故なんでしょう? EXCELは2000です。
636 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:32:44 ] >>610 開いている全てのワークブックの名前をDoで回し取得、 該当ブックが有れば.close
637 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:39:01 ] >>635 年/月/日が月/日/年になってしまう時は、コントロールパネルかツール/オプションで地域の設定を見直す
638 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:43:34 ] >>636 全ブック回すならFor Eachの方がコードがシンプルになるけど負荷が大きくなる。 エラーを無視するのは行儀は悪いが一番処理は速い。 エラー処理をきちんと書く、例えばエラーメッセージを出すとか実行結果をエラーコードとして返すのが王道だけど 片手間で作る小規模なコードでは大げさすぎる。 どの方法を使うかはケースバイケースだ。
639 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:58:53 ] >>637 地域と言語のオプションやEXCELのツール→オプションを見ましたが不自然な場所は内容に見えるのですが。 もう少し詳しくお願いします。
640 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:06:36 ] >>639 ExcelじゃなくてWindowsのコントロールパネルの地域と言語のオプションだよ。 どこかのセルに「9/8/7」ってキーボードから入れたらどうなる? 「2009/8/7」になるか「9/8/2007」になるか。
641 名前:630 mailto:sage [2009/01/24(土) 22:09:05 ] >>638 >エラーを無視するのは行儀は悪い エラー処理って大そうに考えてる人多いみたいだけど、 俺はエラー処理ってのはプログラムの効率化を図る手段だと思ってる 実際にErrorステートメントなんか存在しなくても、 厳密なプログラムを書けば99.9%(経験上100%)同じことはできる Errorステートメントってのは、あらゆる場面を想定した厳密なプログラムを 書かなくてもいいように効率化(手抜き)をするためのモンじゃないの?
642 名前:635 mailto:sage [2009/01/24(土) 22:15:04 ] >>640 639の地域と言語のオプションというのはもちろんコントロールパネル内のやつの一項目です。 変なところは無いみたいですし、そもそも購入してからいじった覚えもありません。 現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。
643 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:19:03 ] >>642 A1セルに09.08.07じゃなくて、9/8/7っていれてみ
644 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:22:37 ] 確認するんならA2セルに9/8/7と入れてみるべきじゃないかな 書式の問題かもしれないし
645 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:11:33 ] >>643 >>644 A1A2セル共に9/8/7と入れれば09.08.07に自動で置き換わりますので書式には問題は無い様に思えます。 ちなみにA1セルに9/8/7と入力して635の処理を走らせると2009/8/7が20/9//8/に置き換わるだけでした。 それとMid関数を利用してピリオドをスラッシュに置き換えても結果は同じ07.09.08でした。 この処理の目的としては日付欄なのに入力の際にピリオドを直接入力している間違った記述を一括で直したいというのがあるのですが どうしてこんな順番入れ替わりがおこるのかが本気で謎です。
646 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:48:18 ] >>645 DateSerialをかますんだ! Dim s As String If TypeName(Range("A1").Value) = "String" Then s = Range("A1").Value Range("A1").Value = DateSerial(Left(s, 2), Mid(s, 4, 2), Right(s, 2)) End If
647 名前:635 mailto:sage [2009/01/25(日) 07:49:29 ] >>646 確認しましたが、それで大丈夫みたいですね。 ありがとうございました。
648 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 17:56:18 ] Open ファイル名 For 開き方 As #ファイル番号 というコマンドの「#」の意味を調べてみたんですが 言及されてなくてわかりません。 この#にはどんな意味があるのでしょうか?
649 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:08:33 ] あるブックをアクティブにすると同時にマクロを走らせることって可能ですか?
650 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:25:52 ] >>648 「#」は「ナンバーサイン」とも言う。そして、例えば「2番目のvoid」を「void#2」とも書く。 その意味を込めてMS-BASICで採用された仕様だ。
651 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:55:24 ] >>649 Workbook_WindowActivate
652 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:04:08 ] >>650 ほえー!ずぅっとシャープだとばかり思ってました。 番号を表す「ナンバーサイン」という記号だったんですね。 勉強になりました。ありがとうございます。 >>649 そのブックに、Auto_Open()のモジュール名で記述されたプログラムは ブックを開くと同時に実行されます。