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)
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()のモジュール名で記述されたプログラムは ブックを開くと同時に実行されます。
653 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:08:00 ] 開くときではなくアクティブにしたときでしょ?
654 名前:652 mailto:sage [2009/01/25(日) 19:12:30 ] 確かに。読み間違えました。 どうもすみません。
655 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:40:49 ] >>651 ありがとうございます。 もう一つ質問です。 非アクティブ状態のシートのアクティブセルの参照はどうすればいいでしょうか? 現在ブックBがアクティブ状態で Cells(1, 1) = Workbooks("A.xls").Worksheets(1).ActiveCell.Offset(0, 1) のような処理はオブジェクトはプロパティ・メソッドをサポートしてないと言われました。 ブックAをアクティブにしたくないのですけど、やはりブックAをアクティブにしてからでないと無理ですかね?
656 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 20:29:26 ] そもそも、ちょっと考えてみれば当然のことだが アクティブじゃないシートにはアクティブなセルなど存在しない それにActiveCellはWorksheetオブジェクトのメンバではなくExcelオブジェクトのメンバなので 上位オブジェクトを指定するならExcel.ActiveCellのようになり、Excel以外は指定できない つまり、「(A):非アクティブなシートのアクティブセル」って概念自体が間違いであり 君がやりたいことは「(B):非アクティブなシートが最後にアクティブだったときにアクティブだったセルの取得」 と表現するのが正しい というわけで、存在しないもの(A)は取得できないので、(B)を取得するには 任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、 アクティブセルの移動を監視記録するのどちらかだな 表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない
657 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 21:02:48 ] うぜーよ
658 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 22:30:01 ] べつにうざくはないが、よくそこまで親切にレスできるのかと関心する 職場で部下に教えるならまだしも、2ちゃんで赤の他人に教えるだけで
659 名前:デフォルトの名無しさん [2009/01/25(日) 23:23:32 ] EXCEL97です ActiveSheet.PageSetup.LeftHeader = "&18 1月12日 &A" このなかの1月12日の部分をnow()+2かstring型の変数を使いたいのですが方法はありますか
660 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 23:36:15 ] ActiveSheet.PageSetup.LeftHeader = "&18 " & Format(Now() + 2, "m月dd日") & " &A"
661 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 23:51:02 ] >>656 丁寧にありがとうございます。 >アクティブじゃないシートにはアクティブなセルなど存在しない これが確認できれば出来れば十分です。
662 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 16:18:41 ] ActiveとSelectを混同してると見た 俺がちょっと前までそうだったから
663 名前:デフォルトの名無しさん [2009/01/26(月) 19:12:35 ] 質問です。 データをシステムから取り込んだエクセルファイルなんですが、 セル内の数値の先頭に半角スペースがついてしまいます。 たぶんこれが原因で、数値の大小がおかしくなります。 例えば 変数=20.222 if 変数>10.333 then これで =falseとなるんですが何か対処法はないでしょうか。 セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。 セルの書式は未選択状態です。 ファイルがで手元にないので詳しいことはすいません。
664 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 19:51:29 ] >>663 変数="20.222 " if value(trim(変数)) > 10.333 then
665 名前:664 mailto:sage [2009/01/26(月) 19:58:01 ] すまん、ワークシート関数と勘違いしました。 val(trim(変数))
666 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 20:58:54 ] >>663 元のデータは変えちゃいけなくて、VBAでなんとかするなら上のレスのとおり。 修正してもいいんならシート全体を選択してコピー→そのまま貼り付けして、 黄色いびっくりマークをクリックして「数値に変換」
667 名前:デフォルトの名無しさん [2009/01/26(月) 20:58:56 ] 質問よろしいでしょうか。 乱数を生成させて、結果によって単純な算術演算を行うプログラムで統計を取っています。 会社のPCで結果が出るまでに2時間はざらなのですが、 会社のCPUがpen4 3Ghz 自宅のCPUがcore i7 940 2.93Ghz 単純なプログラムなので、劇的にはかわらないまでもすこしは早くなるかと思ったんですが、 逆に遅くなりました。 8コア中 1コアしか使用率があがらなかったので、単純にクロック数の問題だと思うのですが、 VBAで8コアフルに稼動させるようなソースは書けるんでしょうか? しかし、前の乱数値の結果が次に影響するような演算なので、 追い越してなにかを処理しておくというのは意味なさそうです。
668 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:00:29 ] >>663 csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?
669 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:04:13 ] >>667 そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。 まさかとは思うが、シートの更新を止めてないとか言わないよな。
670 名前:667 [2009/01/26(月) 21:10:32 ] >>669 ですよね;−; シートの更新は止めています。 シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。 実行時間は単純に量の問題です、10億試行とかそういう回数なので…
671 名前:デフォルトの名無しさん [2009/01/26(月) 21:11:18 ] www.nicovideo.jp/watch/sm5947975
672 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:14:15 ] >>668 単純なcsvの読み込みなら、たとえ " 123 " みたいにダブルクォートで囲ってあっても 強制的に数値化されてしまうので逆に困るくらい。
673 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:17:18 ] >>670 そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。 必要ならそいつをVBAで起動すればいいんだし。
674 名前:デフォルトの名無しさん [2009/01/26(月) 21:18:21 ] 664-666 ありがとうございます。 明日試してみます。
675 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:23:52 ] >>670 10億回程度のループならそんなに多いとは思わんけどな。 無駄に時間のかかるプログラムって、アルゴリズムやコーディングに問題があることが多いけど、 誰か詳しい人には相談した? それから基本的なこととしては、Variant型の変数は使ってないよな? あとは乱数の発生を別のプロセスにやらせてファイルにどんどん書き出していくとか、 そもそも数値計算にVBAを使うこと自体が疑問なので、全体をコンパイラで書き直すとか。
676 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:26:21 ] 675の言うことには耳を貸さないのが吉
677 名前:667 [2009/01/26(月) 21:43:17 ] いろいろアドバイスありがとうございます。 すいません統計などと洒落たことを言ってしまいましたが、 プログラム自体はパチスロ機のシミュレータです。 自分ひとりでつかうならいいんですが、 プログラム知識0の人へのインターフェイスや出力、視覚化も兼ねているので…。 そして残念なことに、このシミュレータの作成は片手間でやらないといけないので、 うまいこと作り直す時間も知識もありません…。 同じ課でたまたまプログラムの知識があった私が任されています… ので同じ課にはわかる人はいません…。 もちろん実機担当に質問はできますが、手一杯だとは思います…。 アルゴリズムはやりようがあると思いますがなるべく実機に近くなるようにしています。 実機はもちろん人の操作によって一連の流れになるので、 アルゴリズムも単純な上から下です。 実行時間は現状でそれなりに満足しています。 10億試行は最終的段階なので、普段は5分とかそういうレベルです。 ただ、環境(CPU)による違いがなかったので質問した次第です。 気遣いありがとうございました。