1 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 01:05:30 ] Excelの「VBA」に関する質問スレです 前スレ pc12.2ch.net/test/read.cgi/tech/1235332603/ ★1 質問をするときはOSとExcelのバージョンを必ず書きましょう ★2 わからなければとりあえず「マクロの記録」をしてみましょう ★3 丸投げのプログラム作成依頼は受け付けていません ★4 VBAを使わない、Excelの使い方に関する質問はスレ違いです Excel総合相談所 82 pc11.2ch.net/test/read.cgi/bsoft/1241825062/
2 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 01:06:41 ] 過去スレ 01 pc11.2ch.net/test/read.cgi/tech/1054356121/ 02 pc11.2ch.net/test/read.cgi/tech/1168308855/ 03 pc11.2ch.net/test/read.cgi/tech/1180192018/ 04 pc11.2ch.net/test/read.cgi/tech/1189814602/ 05 pc11.2ch.net/test/read.cgi/tech/1197448064/ 06 pc11.2ch.net/test/read.cgi/tech/1205231499/ 07 pc11.2ch.net/test/read.cgi/tech/1212587819/ 08 pc11.2ch.net/test/read.cgi/tech/1219673793/ 09 pc11.2ch.net/test/read.cgi/tech/1228372971/ 10 pc12.2ch.net/test/read.cgi/tech/1235332603/
3 名前:デフォルトの名無しさん [2009/05/10(日) 02:30:44 ] 卒研でVBAを使用することになったんですがお勧めの初心者向けのテキスト(教科書)教えてくれませんか? 当方一年授業で学んでオセロつくったくらいです
4 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 05:12:26 ] ★5 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分野の話ではないので、ここでは聞かないでください。 ★6 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
5 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 05:27:12 ] >>4 は同意されたものではないので、無視してかまいません。
6 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 07:23:15 ] >>4 に同意する
7 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 08:46:57 ] ★7は必須だろ
8 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 09:03:06 ] >>4 ExcelVBAからADOを使ってmdbのデータを読む、なんてのは含まないんだね
9 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 09:20:46 ] APIの話も、Excelから呼び出すなら良いと思うけどな。 具体的なAPI詳細とかなら、専用スレに誘導すりゃ良いし。
10 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 19:54:55 ] EXCEL2003とXPを使用しています デバッグのステップインでF8を押して進めるとすべて問題なく処理が完了するのですが マクロの実行でやると 実行時エラー424オブジェクトが必要です という物が表示されてしまいます 何処の変数がオブジェクトにしないといけないとか判断する方法はないでしょうか?
11 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 22:15:31 ] 「実行時エラー424オブジェクトが必要です」 って表示された時に処理止まっているんじゃないの?
12 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 23:04:45 ] デバッグのF8連打のステップインの時は全く問題なく終了(ループ)するんですよ、、、、 実行でもたまに上手くいくんですが大半がエラー424になって なんでデバックだと上手くいくのに実際だとエラーが出るんだろ、、、、と思いまして
13 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 23:27:43 ] ブレイクポイント入れてないのに勝手に止まったりすることあるよ こまかいことは(ry
14 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 23:44:49 ] スクリプトうpれ
15 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 03:27:13 ] 通信に関係あるプログラムじゃね?WEBとかデータベース鯖とか。 相手の準備が出来たかどうか、データの取得が完了したかどうか ちゃんとステータスチェックせずに次に進むと成功したり失敗したりするし、 F8連打だとそれだけで時間稼ぎになるから失敗しにくくなる。
16 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 04:58:31 ] 処理が止まった行の xxx.Value = yyy または yyy = xxx.Value のxxxに問題あり?
17 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 07:31:15 ] >>10 あるねぇ >>15 の通り、相手の準備が出来てないっての。通信に限らずオブジェクトの描画か何かでも起こった気がする ループ使ってるならloopやnextの上の行辺りに Sleep 100 とか入れて見ると解決した気がする ループじゃなければちとわからん
18 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 10:23:34 ] 初心者丸出しのコードでもいいでしょうか?
19 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 10:46:03 ] Sleep 100とか入れちゃう初心者じゃなければいいよw
20 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 10:46:06 ] 友人の持って来たノートPC、XP,Office2000だと 実行を40回ループさせても実行時エラー424オブジェクトが必要です って表示されない、、、、 OFFICE2003が何か悪さしてるのかな、、、、
21 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 10:46:22 ] >>18 = >>10 か? どんな行で止まったかだけでも分からないと推測で答えるしかない
22 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 11:13:53 ] >>21 はい昨日424エラーが出ると言った者です 皆さんの予想通りWEBにアクセスしてデータを持ってくるという物を作ろうとしています エラーが出るところは行はランダムなのですが Set IE = CreateObject("InternetExplorer.Application") 'ココ IE.Visible = False 'ココ If CODE = "" Then MsgBox "コードがありません" Exit Function Else TARGETURL = "stocks.finance.yahoo.co.jp/stocks/detail/?code= " & CODE IE.Navigate TARGETURL While IE.busy = True Or IE.readyState <> 4: DoEvents: Wend 'ココ Set objTableItem = IE.document.GetElementsByTagName("TABLE") CLOSEPRICE = objTableItem.Item(0).innertext AccessYahoo = GetCloseData(CLOSEPRICE) 'Debug.Print CLOSEPRICE End If 'ココと書いてある IEオブジェクトを触ろうとすると出るということがわかりました
23 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 11:24:34 ] あー自分も同じような事をしてるよ!w うちはXPでOffice2000なんだけど・・・ Officeのバージョンとかは特に関係なくてIEが立ち上がりきっていない場合にそういうエラーでますよ。 自分はエラーハンドラで回避しているけどね。
24 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 12:40:48 ] OfficeよりもIEのバージョンのほうが問題か? IE7だと重くて起動遅いとか
25 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 16:47:43 ] IE7というより自マシンの環境によるんじゃないのか?
26 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 17:02:44 ] >>23 ありがとうございます エラーハンドラーっていうのがあるんですね ちょっと調べてみようと思います 512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて 友人の2GBでは何もエラーをはかずに処理が終わる 1GB借りて512MB→1GBにしてみるとなぜか424エラーは出なくなった、、、、 気持ち悪いけどメモリ増やすと問題なく動くみたいです
27 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 17:13:16 ] >512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて 424はよく分からんがメモリ不足は後始末がちゃんとできてないと起こりやすいな Set XXX = ○○と書いたらSet XXX = Nothing で開放しとかないとだめ 同じ変数にSetしなおしても上書きはされずにメモリを掴んだままになるらしい やってるよな?
28 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 18:05:50 ] Set XXX = Nothingって処理が終了すれば自動解放されるからなくても大丈夫だけどね
29 名前:デフォルトの名無しさん [2009/05/11(月) 18:10:04 ] 起動時に全シートの固定行数(SpritRowプロパティ)を求めているのですが、 グラフ等がアクティブになっているとプロパティ無しエラーになります。 On Error 以外で シートがアクティブになっているかどうかを判定する方法が ありますでしょうか?
30 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 18:14:19 ] >>28 そう思って書かないことが癖になると危ないと思うんだがw っていうかあの時はマジでやばかった(謎
31 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 18:18:25 ] >>29 TypeName(Selection) でどうかな?
32 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 18:28:39 ] >>31 素早い対応、有難うございます。
33 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 18:59:21 ] >>27 確かに Set IE = CreateObject("InternetExplorer.Application") のあとに解放せずに 何十回もAccessYahoo(コード番号)で呼びまくってました よくない癖は早めに直さないといけないですねありがとうございます
34 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:46:02 ] IEをCreateObjectしてURLを開くのと Workbook.Open Filename:=URLで開くのは どこが違うんだろうか
35 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 21:40:54 ] IEはQuitしてやらんと、終了しないだろ 非表示のIEがいっぱい残ってるんだろ ttp://www.forest.impress.co.jp/article/2006/02/06/okiniiri.html これで一覧してみな
36 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 21:52:38 ] >>35 XP,Office2003で確認してみたのですが 2003はIE.quitをしなくても 自動的に消えてくれるようです 2000でも使う可能性があるのででIE.quitをAccessYahoo(コード番号)の最後に追加しました ありがとうございます IE.Quitはvisible をFalseにしたら不必要だと思ってました
37 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 22:12:19 ] >>36 ウィンドウを閉じる(終了する)のと見えなくするのは違うぞ。 プロセスはちゃんと終わらせなきゃいけない。
38 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 22:24:47 ] >>36 解放で自動的に消えてくれるかどうかは、officeやosのverより、 むしろieのverによると思うけど、うちのie8では消えないみたいよ 消えたかどうか何で確認してるの? >>37 ieはプロセスに同居するから、インスタンス
39 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 22:57:57 ] >>38 >>35 さんが教えてくれたMenuBar.HTAで確認してみました
40 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 12:55:01 ] VBAでフォームだけ入力することは可能でしょうか? やりたいと思っていることは ログイン、画面推移までは自分でIEを立ち上げて手入力でして チェックボックスやテキストボックスにはVBAの入力ボタンを押すと自動的に 入力されてsubmitし最終確認画面が出るようにしたいと思っています 現在IEで表示している画面の要素をIEオブジェクトに取り込むということはできるものでしょうか?
41 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 13:30:20 ] >>40 SendKeysとか使うくらいしか思いつかんな
42 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 13:30:46 ] 再読込するから無理だった気がする
43 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 14:07:50 ] ありがとうございます なさそうですか、、、 最初からVBAでIE立ち上げて ログインする際にID、PASSを入力待ちで手入力にして最終確認画面でmsgboxだして投稿するような方法の方が簡単そうですね
44 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 17:03:24 ] VBAじゃなくてVBScriptでIDとPWが入力された状態で表示させることもできるけどね
45 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 17:17:07 ] IDとパスワードはフォームに入力して、それをSendKeysで送ればいいと思う
46 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 17:43:25 ] ごめん 42 です。 できるかも! 参考までにソース挙げます。 Yahooページ立ち上げておいて・・・こんな感じで・・・ Dim objIE As Object 'IEオブジェクト参照用 Dim objShell As Object Dim strURL As String 'URLの文字列 'IEのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows If objWindow.LocationURL = "www.yahoo.co.jp/ " Then objWindow.document.sf1.p.Value = "VBA" End If Next Set objIE = Nothing Set objWindow = Nothing
47 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 17:55:25 ] もうちょっと推敲しろよ
48 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 21:28:22 ] 質問です。 shell関数でIEを全画面サイズで開く処理を行うと、 会社のPCだと、どうしても全画面で開けません。 最小化でも開けず、ただ適当なサイズで開いてしまうんですが、 何かサイズ指定が不可能になる条件ってPC側にあるんでしょうか? OSはXP、MSは2002です。
49 名前:デフォルトの名無しさん [2009/05/12(火) 21:57:36 ] 教えてください Excel2003で、セルを右クリックして出るポップアップメニューに 独自メニューを加えたいのですが、最初のシートには 追加できたのですが(下参照)、2枚目以降のシートのセル+右クリックでは 追加メニューが表示されません すべてのシートのセルの右クリックポップアップメニューに独自メニューを 追加する方法またはある特定のシートのセルの右クリックポップアップメニューに 追加する方法はありますでしょうか? よろしくお願いいたします Public Sub CreatePopUp() Dim fBar As CommandBar Dim fBtn As CommandBarButton Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell") fBar.Reset '初期化 Set fBtn = fBar.Controls.Add(msoControlButton, Temporary:=True) fBtn.BeginGroup = True '新しいグループにする fBtn.Caption = "変更" fBtn.OnAction = "Modify" Set fBtn = Nothing Set fBar = Nothing End Sub
50 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 22:22:39 ] 適当だけど 標準モジュールの一番上に記述 Public Declare Function GetAsyncKeyState Lib "User32.dll" ( _ ByVal vKey As Long _ ) As Long Public Const VK_RBUTTON = &H2 '[RightClick] Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 適応したいシートに記述 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If GetAsyncKeyState(VK_RBUTTON) Then Dim fBar As CommandBar Dim fBtn As CommandBarButton Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell") fBar.Reset '初期化 Set fBtn = fBar.Controls.Add(msoControlButton, Temporary:=True) fBtn.BeginGroup = True '新しいグループにする fBtn.Caption = "変更" fBtn.OnAction = "Modify" Set fBtn = Nothing Set fBar = Nothing End If End Sub
51 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 22:36:02 ] >>48 ie側の問題だと思う iexplore -nohome だと効くみたいだけど
52 名前:デフォルトの名無しさん mailto:sage [2009/05/12(火) 22:50:59 ] >>51 そうなんですか。。。 ありがとうございます。
53 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 12:54:29 ] msgboxのYES,NOをすべての最前面に出す方法はないでしょうか? VbMsgBoxSetForegroundが最前面表示とあるので MsgBox("確認", vbYesNo, vbMsgBoxSetForeground) としてみたのですが VBA実行→IEが立ち上がる→確認がIEの後ろに隠れてしまう (奥からエクセル、確認msgbox、IEの順になってしまう) VBA実行→IEが立ち上がる→確認がIEの手前で 奥からエクセル、IE、確認msgboxの順になるようにしたいと思っています
54 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 15:12:06 ] + vbSystemModal
55 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 15:31:48 ] >>53 APIでエクセルをアクティブにしてからメッセージボックスを出すとか
56 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 15:55:24 ] ★5 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分野の話ではないので、ここでは聞かないでください。
57 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 16:08:53 ] MsgBoxについての話はスレ違いか? vbSystemModal使うと「メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。」 だから都合悪いかもしれないと思ってAPI使うってアクティブにする案を出したんだが・・・ APIの使い方がわからないって言ってきたらググレカスとでも言っておくがなw
58 名前:57 mailto:sage [2009/05/13(水) 16:10:07 ] 訂正 × API使うってアクティブにする ○ API使ってアクティブにする
59 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 16:36:25 ] 要件満たさんだろ
60 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 19:39:10 ] そもそもアクティブにするのと最前面にするのは違うし。 おかげでボタンが押せなくて操作不能になるアプリがたまにある。
61 名前:デフォルトの名無しさん [2009/05/13(水) 21:37:14 ] >50 お返事ありがとう その方法でもメニューが追加されるのは一枚目のシートだけ見たいです 具具っても見当たらないんですよね
62 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 23:07:23 ] >>49 いま手元にExcelが無いのであれだが ' Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell") Set fBar = Application.CommandBars("Cell") で どうかな?
63 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 23:13:16 ] セルに色が設定されていない状態のcolorIndexは何でしょうか? If Worksheets("Sheet1").Cells(1, 1).Font.ColorIndex <> 2 Then MsgBox "color" End If みたいに書いているんですが、bookを作った最初の状態は、白ではなく、色が未設定の状態だと思うんですが。。。
64 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 23:16:58 ] xlColorIndexNone ですかね。
65 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 23:19:21 ] Interior.Colorindex= 0 fontではなくInteriorです!
66 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 23:23:50 ] ありがとうございます! 0でもxlColorIndexNoneでも同じって事ですか? fontとInteriorはコピーする箇所を間違えました;
67 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 23:49:08 ] 例えば、 Range("A1").Activate Activecell.Interior.Colorindex=0 Msgbox Activecell.Interior.Colorindex Activecell.Interior.Colorindex=xlNone Msgbox Activecell.Interior.Colorindex Activecell.Interior.Colorindex=xlColorIndexNone Msgbox Activecell.Interior.Colorindex Activecell.Interior.Colorindex=xlColorIndexAutomatic Msgbox Activecell.Interior.Colorindex とかすると面白い?
68 名前:デフォルトの名無しさん mailto:sage [2009/05/14(木) 01:13:52 ] xlNoneは-4142だから0とは違う
69 名前:デフォルトの名無しさん mailto:sage [2009/05/14(木) 12:35:39 ] -4142 -4142 -4142 -4105 になったぞ by Excel97
70 名前:デフォルトの名無しさん mailto:sage [2009/05/14(木) 19:53:45 ] スイマセン、ローカルにコピーしたロータスノーツのファイルにアクセスする方法について教えていただきたいのですが・・・ あと、VBAの設定で参照可能なライブラリファイルにチェックを入れとけばいいんですよね?
71 名前:デフォルトの名無しさん mailto:sage [2009/05/16(土) 19:47:16 ] オブジェクト型変数には、オブジェクト自身ではなく、オブジェクトの情報を呼び出す為の番号(参照)が入る。 って、要するにポインタのことですか?
72 名前:デフォルトの名無しさん mailto:sage [2009/05/16(土) 20:27:27 ] 参照です。
73 名前:デフォルトの名無しさん mailto:sage [2009/05/16(土) 20:34:09 ] 大まかには合ってるんじゃない? とりあえず、他の変数に代入してもオブジェクトそのものは 複製されない事だけ把握しとけばOK。
74 名前:デフォルトの名無しさん mailto:sage [2009/05/16(土) 20:46:14 ] 実態をコピーせずに何らかの番号で区別するって意味では合ってるかもしれないけど やっぱり参照とポインタは微妙に違う 狭い意味だとポインタはアドレスのことだったりもするし あとは実装次第だ
75 名前:71 mailto:sage [2009/05/16(土) 21:09:11 ] >>72-74 ありがとうございます。
76 名前: ◆aAB/3SgCFU mailto:sage [2009/05/17(日) 13:44:16 ] 自分が使っているテキストでは、下のプログラムを実行すると、 シートの行と列全てがアトランダムに塗りつぶされるはずなのですが、 実際にやってみても、全列の1行目しか塗りつぶされません。 どこかおかしいのか、教えていただけませんか? Option Explicit Sub 画面更新() Dim i As Integer Application.ScreenUpdating = False Rows.ColumnWidth = 1.75 For i = 1 To 6000 Cells(i).Interior.ColorIndex = Int(Rnd * 56) + 1 Next i MsgBox "これから更新します。" Application.ScreenUpdating = True MsgBox "更新終わりました。" End Sub
77 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 14:13:56 ] >>76 Office2007で利用可能な桁数が大幅に増えた(16384?)のが理由。 桁数が最大256桁とか決めうちしていると、こういうことになる。
78 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 14:14:38 ] Cells(i). が原因だね。 cells(row,column) で指定しないと。
79 名前: ◆aAB/3SgCFU mailto:sage [2009/05/17(日) 19:32:56 ] >>77-78 どうもありがとう
80 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 07:30:50 ] 質問です VBAで他のアプリケーションを開くまでは色々ググって出来たんですが そのアプリが閉じられたら、再びVBAに処理を戻したいんです。 今はファイル名のリストがフォーム上に有ってその名前で検索したファイルを開くという作業で一太郎やワード等を ShellExecuteで開くというの作ったんですが 開いたファイルが閉じられたら更新日時を調べて変化が有れば書類の板番号を更新したいんですが いつ閉じられたかも解らないし、ファイルを開いて処理が中断し閉じて再開すると言った事は不可能でしょうか?
81 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 09:09:25 ] >>80 それはアプリの終了よりもファイルの更新を調べた方がいいのでは。 VBAで1秒間隔のタイマーをセットして、ファィルのタイムスタンプを1秒おきに調べるみたいな方法なら すぐに思い付くけど。
82 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 12:00:46 ] >>81 わかりました それで行きます
83 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 13:17:19 ] えっ、それでいっちゃうの?
84 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 13:20:12 ] 行くって言ってるだろ
85 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 14:53:02 ] だって 思い付かないんだもん
86 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 16:03:24 ] OpenProcess()してWaitForSingleObject()するのは駄目なのか?
87 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 16:06:00 ] dirname/filea.ext dirname/fileb.ext があったときに、".ext"に関連づけられているsomeapp.exeを起動したとき、 fileb.extもsomeapp.exeで更新している可能性があるので、 プロセスの終了を待ち合わせて、dirname/*を全検索して情報を更新するのが一番。
88 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 17:00:13 ] ファイルを閉じて、アプリは閉じないかもしれない
89 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 17:19:47 ] ROTにファイルがあるかチェックすればよい
90 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 19:17:48 ] line input 命令で chr(&h0) の入ったレコードを読み込むと強制的に chr(&h20)に置き換えられるのでしょうか? もしそうでしたら、何らかの回避方法を教えていただきたいのですが・・・
91 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 20:21:34 ] バイナリで読め
92 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 11:12:20 ] >>86 試して見ましたが ファイルが開き終わるとwaitが終了し次の処理に移ってしまうようで上手くいきませんで filepath="sample.txt" CreateObject("WScript.Shell").Run FilePath, vbNormalFocus, True MsgBox FilePath & "が閉じられました。", vbInformation Or vbSystemModal これで済ませました お騒がせしました
93 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 12:11:15 ] ワークシートのmodと異なり、VBAのmodは小数点下が切り捨てられてしまいます。 小数点下を含む剰余を返すようにしたいのですが、ワークシートのmodは演算子だから application.mod()とは出来ない。 良い方法はありますでしょうか?
94 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 14:33:35 ] 小数点下は元の数と同じな気がする
95 名前:93 mailto:sage [2009/05/19(火) 15:32:48 ] >>94 分母が整数なら・・・。 x mod yの場合、x - Int(x / y) * yで良いのかなぁ。
96 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 22:18:52 ] x - (x \ y) * y だとどうだろう
97 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 22:45:17 ] 顔文字かと思った
98 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 22:52:54 ] >>96 たばこを吸うバルタン星人ですよね???
99 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:37:42 ] すいません、WindowsXP SP3、Excel2003での質問なんですが、 VBAを使って罫線ツールバーの「罫線を作成」機能(セルの枠線にそってクリック・ドラッグで罫線を引く) と同じことをするのは可能でしょうか?
100 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 17:04:50 ] >>99 罫線を引きたいセルを選んでVBA実行して罫線が引かれるっていうのならできるんじゃね
101 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 17:29:32 ] test
102 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 21:13:05 ] 以下のようなことをやりたいです。 XP、Excel2003です。 Excelファイルが2つある。1つは用語集ファイルと呼び、もう1つは作業ファイルと呼ぶ。 用語集ファイルには英単語とその対訳がリスト形式で保存されている。 作業ファイルには英文が書かれていて、知らない英単語が出てきたら用語集ファイルを検索して その意味を調べる。 具体的には 1.作業ファイル中の検索したい単語を反転表示させる。 2.右クリックのショートカットメニューから、独自に追加した「単語を検索」をクリックする。 3.用語集ファイルに、1で選択した単語の検索結果が表示される。(Ctrl+Fでの検索と同じ表示結果) ※ただし、作業ファイルにはマクロは記述しない。 作業ファイルにはマクロは記述しないので2が無理かと思うのですが、代替案として どのような方法を取ればいいでしょうか?(右クリックのショートカットメニューでなくてもいいので とにかく作業ファイルにはマクロは記述せずに、3と同じ結果を得たいのです) おおまかな手順でいいので、ヒントをお願いします。
103 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 21:26:28 ] personal.xlsに記述するのもだめ?
104 名前:102 mailto:sage [2009/05/20(水) 21:49:38 ] >>103 OKです。 personal.xlsが何なのか知らなかったので調べたのですが、どうやら自分の作ったマクロを まとめておくエクセルファイルのようですね(初心者ですみません)。 つまり、最終的には作業ファイル・用語集ファイル・personal.xlsという3つのファイルで作業する という認識で正しいですよね?
105 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 22:00:12 ] >>102 その程度のユーザビリティなら、そのままCtrl+Fで良いじゃん。 わざわざマクロを組む必要性がわからん。
106 名前:105 mailto:sage [2009/05/20(水) 22:01:04 ] >>105 あぁ、別ファイルか。 ごめん。
107 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 07:37:30 ] >>95 別に分母が正数じゃなくてもそれでいいんじゃない? むしろ分母が整数の必要があるのは>>96 だな。
108 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 08:20:20 ] 重複に関してちょっと質問します。 = IF(COUNTIF(B:B,B4) >1, "重複","") この関数でE4という条件をB列全てに適応できたらと 思っています。この関数ではB4のセルの内容が 他と重複してるかいないかのチェックだけになります。 B4セル エクセル B5セル ワード このような場合エクセルとワードという単語がB列で 重複してるかいないかのチェックになります。
109 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 09:31:14 ] これはVBAではないですよね?
110 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 11:00:14 ] エクセルだなw
111 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 20:18:50 ] あるセルにこんなSUMIF関数を入れたいんだけど、 Cells(r + 1, 4).FormulaArray = "=SumIf($O1:$O500,cells(r,3),#K1:$K500)" エラーになってしまうのは、検索条件がおかしい? (rはFOR〜Nextさせています)
112 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 20:32:10 ] Cells関数なんてあったか?
113 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 20:43:27 ] >>111 何で文字列に変数名が入ってるんだ。 ” ”で囲まれた中は文字列だから、rは文字のrでしか無い。 てか、SUMIFなんて使わずにVBAで構文書いた方がずっと楽だよ。
114 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 21:28:23 ] こうか? Cells(r + 1, 4).FormulaArray = "=SUMIF($O1:$O500," & Cells(r, 3) & ",#K1:$K500)"
115 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 01:11:16 ] >>111 そんなのはピボットでやれよ。 #は$の間違いか?
116 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 08:13:03 ] >>113 for文使ってるって言ってるんだからVBA使ってるいるんじゃないのか?
117 名前:デフォルトの名無しさん [2009/05/22(金) 11:29:40 ] >>4 replace ☆VBAはVisual BASIC For Applicationsの略だとされており、Visual BASIC Visual BASIC .NET VBScrptとは文法が異なる言語です。(ただし共通性は 概して高いです。) ☆制限はそれなりにありますが多くのVBA環境からもWindowsの共通ライブラリ を利用することが出来ます。(但しそれぞれのライブラリの個性に応 じた、専門知識は必須ですがそれが公開されている(=入手可能)とは限りま せん) ☆このスレではVBAを用いてExcelがインストールされている Windowsマシンでは、原則としてはプログラム言語の種類によらずに 使用可能なライブラリ「Excel オブジェクト」の公開部分の操作をし て目的の結果を得る(※)手段を考案する状況で発生した疑問、質問に対して 有志が答えるスレッドだと考えられます。Excelに付属のVBAエディター を使用してプログラミングを行っているという状況はまさにこの 状況になりますし、その状況以外で発生したものはスレ違いになる可能性 が濃厚です。 (※)この手段が邪道でExcel道に根本的に反するという意見も貴重 です。Excelは一元的かつ算術的な処理の為のソフトウェアであり、多元的 かつ手続き的な処理には向かないという考えに基づくものです。 本来VBAがもっとも効率的に活躍するのはAccess環境であるという考え方 を取りたいものです。
118 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 11:51:39 ] >>111 そもそもFormulArrayなら範囲に1個の配列数式だからループを回すのはおかしい。 式の入力範囲がD2:D100だったらD2:D100を選択して{=SUMIF(O1:O500,C2:C100,K1:K500)]だが Range("D2:D100").FormulaArray = "SUMIF(O1:O500,C2:C100,K1:K500)" と書けば配列数式が入力される。 配列数式じゃなければFormulaArrayじゃなくてFormulaだ。 どっちにしてもループは回す必要なし。 >>115 が言うようにおそらくピボットテーブルでできることだろうけどな。
119 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 11:52:34 ] Range("D2:D100").FormulaArray = "=SUMIF(O1:O500,C2:C100,K1:K500)" だった。
120 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 12:15:10 ] >>117 回答者側はその物言いで理解できるだろうけど 質問者側はそれじゃ理解できない奴多いだろうな
121 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 13:32:03 ] 世の中は即理解できる世界ばかりで出来ているわけじゃないことを 教えるのは重要
122 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 13:40:44 ] プログラムって、頭の良い人なら3日くらいで何でもできるようになるのだろうか? 自分は4月から勉強し始めたけど、やってもやっても、 分からないことや、知らなかったことが出てきてゴールが見えてこない。
123 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 13:48:57 ] 頭の良い人なら3日くらいで何でもできるようになるのだろうか? 3日くらいで何でもできるようになるのが頭の良い人
124 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 14:18:55 ] 試験勉強じゃないから暗記しなくてもいいし わからなかったら人に聞いてもいいし 本人に作る気があればプログラムなんかいくらでも作れるだろ
125 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 14:31:46 ] 俺は長い事ECMAやってからVBAを始めたんだけど、 ・言語体系を覚えるまで3か月 ・VBAで出来る事、向いてる事かが分かるまで更に3か月 ・調べながら自分で作れるようになるまで更に3か月 って感じで、かなり時間が掛かった記憶がある。 VBから始める人ならそれこそ3日で出来るとかあるだろうけど、 それ以外の言語からだときちいわ。 未だに分からん事の方が多い。 プログラムやったこと無い人だったら、変数って何?配列って何? って事から始まるんだし、もっと時間かかるんでないか?
126 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 14:34:59 ] ECMAって何だ?
127 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 14:36:41 ] まず、何でも出来るようにはならない。 出来るよ!って人でもその時々で調べながらプログラム組んでるものです。 暗記する必要もないし、調べながらでも出来れば問題ない。 大体、使うものって限られてるし、それが出来れば十分なわけです。
128 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 15:05:05 ] >>125 ECMAってJavaScriptだろ? そりゃきちいわ。同じ系統でもVBScriptからだと だいぶ違うと思うがどうかな。 だがVBA自体はかなりしっかりした 言語なんで半年以上かけて勉強したことに ついて損はしてないね。
129 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 17:25:31 ] OS:WindowsXP Excel2007 での質問です。 今までExcel2003で使っていたマクロの冒頭部分が以下のとおりです。 If Dir(OutPath & "\完成", vbDirectory) = "" Then MkDir OutPath & "\完成" ActiveWorkbook.SaveCopyAs FileName:=OutPath & "\Tmp.xls" Workbooks.Open FileName:=OutPath & "\Tmp.xls" Dim TmpWorkBook As String TmpWorkBook = "Tmp.xls" Workbooks(TmpWorkBook).Activate ここで作った一時ワークブックに、別に開いたCSVファイルをシートごとコピーするという命令が続くんですが、 Excel2007になってからCSVを開いた時勝手に巨大なシートサイズになる?のかどうかわかりませんが、 コピーの時点で「コピー先に対してシートサイズが大きすぎてコピーできません」となるようになってしまいました。 そこで上記マクロの"Tmp.xls"をすべて"Tmp.xlsx"にしてみたのですが、 今度はファイル拡張子とファイル内容が一致しませんと言われてOpenできませんでした。 原因と対処がわからないのですが、どのように改善したら良いでしょうか?
130 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 17:37:42 ] 追記:マクロ実行時点でのActiveWorkbookは本マクロが含まれてるファイルです。
131 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 18:15:34 ] すみません、自己解決しました。 大元のファイルをxlsmで保存しなおして、VBAの中もxlsmにすればいいんですね。
132 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 19:17:20 ] >>122 目的があれば、すぐに覚えられる 事務作業の自動化のために 表への入力、印刷設定→印刷の自動化、ファイルを正規化させたり、シートを一度に何個も作る・・ 等の作業をマクロの記録。そして改変。後はifやforを覚えたかな プログラムへのとっかかりとして、マクロの記録はとんでもなく優秀だと思うわ プロシージャやメソッド、その概念すら覚えて無くてもとりあえず動くマクロが作れるってところがね
133 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 19:48:19 ] >>127 確かに暗記しなくても書けるには書けるが、せめて 宣言系、制御系、演算子くらいは最低限暗記しないと、とても実用にはならないよ まあこのへんはまともなコード書けば必ず使う物だから、意識して覚えようとしなくても すぐに暗記しちゃうとは思うが
134 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 20:11:36 ] >>122 やりたいことが明確になればすぐにできるようになると思うよ わからないことが出たら調べてそれでもわからなければここで聞けばみんなが教えてくれるし 参考書読んでてもあまりできるようにはならないかな まず簡単な A1の値をA3にコピーするから A1の値をSHEET1のA3にコピーしてみる さらにA1の値を別BOOKのSHEET1のA3にコピーしてみる と言ったように自分でいろいろ弄って遊ぶような感覚でやっていかないと 覚えが悪いと思う
135 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 21:22:23 ] VBAを使ってツールバー上のコントロールを実行したいんですが、 ドロップダウンリストなどを項目を選択して実行するということは可能でしょうか? 例えば書式設定ツールバーのフォントを選択するリストでMS明朝を選んで実行、というようなことです。 普通のボタンをExecuteで実行するやり方は分かったんですが、リストの場合はどうすれば…
136 名前:デフォルト名無しさん mailto:sage [2009/05/22(金) 22:46:56 ] 学校の課題なんだけど、 ttp://www.hasimoto999.aki.gs/img-box/img/5764.jpg ttp://www.hasimoto999.aki.gs/img-box/img/5765.jpg が、5時間近く考えてもわからない 簡単過ぎる問題かもしれないけど、ご教授頼むorz ちなみに19の1は解けてる。
137 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 22:50:05 ] > ★3 丸投げのプログラム作成依頼は受け付けていません > ★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み > コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 > ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
138 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 22:55:09 ] >>136 そんなピラミッドを描いて何になる? って解答欄に書いて、相手にたたきつけろ!
139 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 22:58:13 ] For〜Next、二重ループ とまで書いてくれてるのに分からないとか
140 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:10:41 ] detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1411688549 やるだけ時間の無駄な問題だな
141 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:24:46 ] デバッグのことに関して質問したいです。 代入していない、宣言していない変数へアクセスしたときにエラーを出すにはどうすればいいですか? Option Explicitを指定すると 代入は検知できるんですが 宣言してない変数を読み出しても、Empty値が返ってくるだけで そのまま実行されてしまいます。
142 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:29:09 ] それともう一つ、 また、エラーが発生した箇所を調べることは出来ないのでしょうか? たとえば、オブジェクトをSetを使用しないで代入すると 「実行時エラー'91' オブジェクト変数またはWith(ry」と例外が発生して、ダイアログが出ますが この例外が発生した箇所を調べることは出来ないのでしょうか? 現在は地道にステップインでエラーが発生するまで追っていますが なんだかばからしくてやってられません。 また、例外構文もN88BASICを思い出させる、On Error〜割り込みしか無いのでしょうか? よくある、try〜finally 〜catch(Exception e) というような構文はないんですか?
143 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:30:44 ] >>142 >なんだかばからしくてやってられません それが自分の資質を示しているねw
144 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:34:47 ] >>136 辛口な事言うけど、論理的思考が全く出来てないでしょ。 ただ答えだけ貰ったって何も役に立たんのでは? 単位もらえりゃ良いって事なのかもしれんけどさ。 for i = 1 to 9
145 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:36:34 ] >>136 途中送信しちまった。 for i = 1 to 9 for j = 1 to 9 cells(i,j).value = i*j next next つーか、こんな問題も解けない生徒がいるのに良く授業だなんて言えるわな。
146 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:38:30 ] >>142 エラー吐いた部分で黄色く反転して中断されないか?
147 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:43:47 ] これでも別に不正解ではないな。プログラムサイズに制限もないみたいだし。 二重ループは最後に空ループでも置いとけばいい。 Range("A2")=1 Range("A3")=2 Range("A4")=3 Range("A5")=4 : 以下略 ちなみに、文句言ってるやつは全科目100点だったのかな? 宿題を誰かに写させて貰ったこともないのかな? 学校なんてこんなもんだよ。まじめに考えすぎ。
148 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:45:22 ] >>145 そうやって結局教えちゃうから育たないんでしょ
149 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:46:10 ] たかが5時間でギブするのはどうだよ
150 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:46:29 ] >>147 論点のすり替え ここは宿題教えるスレじゃない
151 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:46:55 ] 単位なんてもらったもん勝ち。入試だって就職だって、まぐれでも入ったもん勝ち。 世の中、要領と運のいいやつが一番トクをする。
152 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:47:59 ] 九九はどうでも良いんだけど、ピラミッドの方がなぁ。 指定された整数が129以上だと、その時点でオーバーフローだな。2003までは。 do untilで指定の数までインクリメントして、 do untilで1になるまでデクリメントして、 積み重ねる部分を関数化するのが楽だと思ってしまた。
153 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:48:42 ] >>149 それ以前に、こんな問題、読んで1分で分からなきゃモノにはならないよ。
154 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:51:57 ] こんなレベルの低い、下らないもんで良いのか。 やっぱ学校なんて気楽なもんだね。 この程度の問題が100点でした!VBA出来ます!! って入ってくる新人がいるって事の方が怖い。
155 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:12:01 ] うちの学校は一般教養にコンピューターの授業が週一であって、 簡単なプログラミングの問題が出た。 少なくとも生徒の99.9%はプログラマーなんて目指してなかったし 宿題なんてほぼ全員が誰かのノートを丸写ししてた。
156 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:13:09 ] ふーん
157 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:22:59 ] うちの商学部でもCとかJavaとかの授業があった。教え合ったりこそはしたけど、コードとチャートは各自で書いてたよ。 SEにはならなかったけど、今の職場でVBAが扱えることで重宝してもらえてる。てかSEにならんでよかった、なったら埋没してたろうから。
158 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:27:04 ] >>157 自分より優秀な奴が集まる集団で働くよりも、自分が一番の集団で働く方が、 大事に扱われるし、自尊心も満たされるしなw 給料3万円しか違わないなら、俺は後者を選ぶ。
159 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:33:36 ] うちのひいじいちゃんが言ってた 「鶏口となるも牛後となる勿れ」ってね
160 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:35:14 ] 俺は三番手位でいいや。 出る杭は打たれる、という諺もあるしな。
161 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:40:20 ] 俺はわかっててもできないフリをしてる。 なんか面倒な作業を押しつけられそうだし。 今の年収で満足してるし、課長とか部長にもなりたくないし。 最低限の生活が出来ればいいや。
162 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:45:58 ] 現実で使えない問題なんてさっさとネットで聞くのが吉 現実的にありそうな問題は分かるまで自分で考えるのが理想だが、そんなことで単位落としたりしてはそれはそれで問題だろう 実際現場ではネット使い放題、上司に質問し放題なんだし かと言ってそれに頼りすぎて成長しないのも困るんだけどね でもそれが仕事がすすまないのも困るんだけどね
163 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 03:26:21 ] >>143 構文チェック時・コンパイル時に分かることなのに 実行しないと分からない。しかも100行を超えるコードをウォッチ式で変数を監視しつつ、ステップ実行するというのは 明らかに効率が悪く、方法を見直す必要があるため、質問しました。 >>146 されません。 例外が発生すると、OKとHELPしか選択肢のないダイアログが出るだけです。 もちろん、ブレークポイントを設定したり、ステップ実行したり、Escキーで停止したときには 実行中の行が黄色く表示されますが。 書き忘れていましたが、 Office 2007 EEで保存形式は2007+マクロ(xlsm)です。
164 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 04:16:07 ] >>163 うそつき ttp://windyakin.if.land.to/src/up38_1232.png
165 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 13:42:35 ] >>164 私の環境では windyakin.if.land.to/src/up38_1233.png こうなりますよ。 やはり何かデバッグオプションが足りないのかもしれません。 プロジェクトのプロパティに「条件付きコンパイル引数」という項目があるんですが そこの所が空欄なのが問題なのかもしれません が、オフラインヘルプを見ても windyakin.if.land.to/src/up38_1234.png というようになんか壊れてますし・・・ オンラインヘルプじゃないのでそのまま凸することも出来ません MSDNの.netリファレンスが不親切だと思ったことはないですが このVBEに付属するリファレンスは何かと不親切ですね。列挙子が何を意味するのかも省略されてますし、ひどいものです。 翻訳作業が間に合っていないならせめて原文を載せてほしいところです。
166 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 13:52:14 ] 2007で確認したけど、164と同じ。 もしなんだったら、MSDNの原文読めばいいんじゃない?
167 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 15:21:26 ] >>165 条件付きコンパイル引数のとこはうちでも空欄 ヘルプも同じ所が同じようにおかしい
168 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 15:25:33 ] 画像貼るの忘れた ttp://windyakin.if.land.to/src/up38_1235.png
169 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 15:35:28 ] セル内の文字列を選択した状態(反転表示した状態)のまま、マクロを実行することはできないのでしょうか? ツール→マクロをみてもグレーアウトされた状態で実行できません。
170 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 18:22:20 ] >>136 今更だが今初めて質問みたのでピラミッドのヒントだけ 1,3,5,7,9と増えていくから必要な”■"は段数*2-1必要。 ループは後ろから回せばよい。 あとはCellsとかResizeとか好みでOffsetとか。
171 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 18:26:01 ] ループは頭からでも同じか。
172 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 19:06:30 ] 一寸だけキモく書くならこんな感じか? For i=1 To height For j=1 To height*2-1 Cells(i,j)=IIf(i>Abs(height-j),"■","") Next Next
173 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 20:33:33 ] >>172 ふつうに数学的に考えるなら y = n - | x - n/2 | で良いよね nは底辺の長さ n = h * 2 グラフに疎い人だと、ピラミットは垂直二等辺三角形が2つくっついたものだととらえて x1(i) = h - i x2(i) = h + i y2(i) = y1(i) = h - i (0 <= i <= h) とするかもしれない。 ピラミットに必要な石の数は孔子にでも聞け。区間[0,n-1]までで上記の式を積分すれば分かる。
174 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 20:38:21 ] 垂直二等辺三角形
175 名前:173 mailto:sage [2009/05/23(土) 21:05:14 ] >>174 どんな三角形だw と思ったら自分で書いてたorz 正しくは"直角"二等辺三角形です
176 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 21:26:27 ] For i = 1 To 9 For j = i To 9 Union(Cells(i, j), Cells(j, i)) = i * j Next Next If height * 2 - 1 > Columns.Count Then MsgBox "列数が足りません" Else For i = 1 To height Cells(i, height - i + 1).Resize(, i * 2 - 1).Value = "■" Next End If
177 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 22:03:49 ] >>176 union使いたかっただけじゃないのかと。
178 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 03:18:30 ] Range("A1:I9").Formula = "=ROW()*COLUMN()"
179 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 03:46:10 ] Height = 5 [A1].Resize(Height, 2 * Height + 1).Formula = "=IF((ROW()+COLUMN()>" & Height & ")*(COLUMN()-ROW()<" & Height & "),""■"","""")"
180 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 03:56:07 ] Range("A1:J10").Formula = "=IF(ROW()*COLUMN()<>1,(ROW()-(ROW()>1))*(COLUMN()-(COLUMN()>1)),"""")"
181 名前:デフォルトの名無しさん [2009/05/24(日) 08:15:08 ] >>135 ちれすだが、win32 apiを使用すれば可能。 enumwindows等でハンドル取得、sendmessageでコマンド送信する。 概してvbaでやるもんではない。 それよりも自前機能内なら、font選んで使った方が早くないか? 知らんけど。
182 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 14:09:19 ] ちょいと見逃してて今読み返してみたが、Win32API使う必要なんて全く無いじゃん Application.CommandBars("Formatting").Controls("フォント(&F):").Text = "MS 明朝" Textプロパティに値を代入した時点で、Executeしたのと同じで選択セルのフォントが変更される 継承って概念を理解してないとわかりにくいかもしれないけど、定義上Controlsコレクションが返すのは CommandBarControlだが、実際にControls("フォント(&F):")が返すのはCommandBarControlを継承した CommandBarComboBoxなので、CommandBarControlには無いTextやListIndexなどのプロパティが指定できる 上記の書き方では.Textプロパティはコードの自動補完リストには出てこないが Dim objCommandBarComboBox As CommandBarComboBox Set objCommandBarComboBox = Application.CommandBars("Formatting").Controls("フォント(&F):") objCommandBarComboBox.Text = "MS 明朝" とすればちゃんと補完リストにも出てくる
183 名前:135 mailto:sage [2009/05/24(日) 15:54:03 ] >>181 ありがとうございます。実際には罫線ツールバー上にある「罫線の作成」「罫線グリッドを作成」の 線スタイルと線の色を選択したかったんです。 とりあえず罫線の作成を使うのはあきらめて、Bordersで選択セルに線引くマクロ作って代用しました。
184 名前:デフォルトの名無しさん mailto:sage [2009/05/25(月) 21:57:57 ] 質問です。 ユーザーフォーム上のコンボボックスでリストの中から 選択すると、その文字が全選択された状態になります。 これを解除してカーソルの状態にするにはどう記述す ればいいのでしょう?
185 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 05:25:55 ] ComboBox1.SelStart = Len(ComboBox1.Text)
186 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 08:31:22 ] >>185 ありがとうございました。
187 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 18:33:19 ] 自分では、セルA1の値が75以上で合格、90以上で優秀、 それ以外は不合格になるプログラムを書いたつもりなのですが、 セルA1に100を入れても、合格になってしまいます。 どこがダメですか? Sub 条件判断() Dim i As Integer i = Range("a1") If i >= 75 Then Range("b1").Value = "合格" ElseIf i >= 90 Then Range("b1").Value = "優秀" Else Range("b1").Value = "不合格" End If End Sub
188 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 19:07:03 ] >>187 Sub 条件判断() Dim i As Integer i = Range("a1") If 90 > i And i >= 75 Then Range("b1").Value = "合格" ElseIf i >= 90 Then Range("b1").Value = "優秀" Else Range("b1").Value = "不合格" End If End Sub
189 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 19:28:32 ] >>188 ありがとうございます。 >>186 の式だと、ElseIf の文が評価されずに終わるから、ダメ。 という理由で合ってますか?
190 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 19:30:32 ] >>189 訂正です 186 ではなくて、 >>187 でした。 すみません。
191 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 19:40:50 ] >>189 If i >= 75 Thenの時点で100の判定はされているので ElseIf i >= 90 Thenの部分は評価されません。 こう書いた方が分かりやすかったかも Sub 条件判断() Dim i As Integer i = Range("a1") If i >= 90 Then Range("b1").Value = "優秀" ElseIf i >= 75 Then Range("b1").Value = "合格" Else Range("b1").Value = "不合格" End If End Sub
192 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:06:07 ] こういうパターンは、Select Caseで書く方が判り易いかな。 そして判り難い書き方の例。 Range("b1").Value = Choose(1-(i>=90)-(i>=75),"不合格","合格","優秀")
193 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:17:26 ] 「分かりやすい」感覚の押しつけには反対です。
194 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:21:17 ] 分かりやすいって書く前にコードを書いてみたらいいじゃない その方がどちらが分かりやすいか「分かりやすい」だろう
195 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:23:17 ] おれならElseIfは使わないかな If i >= 90 Then 優秀 Else If i >= 75 Then 合格 Else 不合格 End If End If
196 名前:デフォルトの名無しさん [2009/05/26(火) 22:24:00 ] VBAで たとえばExcelで Z11に文字が値が入力されていたらA1〜Z11を全選択 A40000に文字が値が入力されていたらA1〜A40000を全選択する文を記述したいのですが これってどうすればいいのでしょうか?
197 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:34:12 ] >>196 うーん・・マクロの記録で ctrl+end と同じってこと?
198 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:44:38 ] UsedRange.Selectで解決しそうな予感
199 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:44:39 ] ファイルの検索やフォルダの検索ってできますか? あるルートフォルダから、以下何階層に渡ってフォルダが作られているかは不明で、 指定した文字を含むファイルをルート以下から探して、返したいんだが。。。 全てを探して、名前を含むリストを作りたいんだよね。
200 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:49:33 ] とりあえず、FileSearchオブジェクトは使用禁止と言っておく。 Office2007で廃止する気満々だったので。
201 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 22:55:02 ] とうとう俺がVBAに本気出すことにした。 今はまだひよっこだが、いずれ大鷲となって羽ばたいた時 おまえら大鷲先生と呼べよ。
202 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 23:00:54 ] 飛んでから言えよw
203 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 23:01:46 ] 何か知らんががんばれよ 俺は配列で飽きてC言語やってるわ
204 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 23:03:22 ] >>199 そのマクロどっかで配布されてた。
205 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 23:11:21 ] Excel VBA FileSearchでぐぐると Dir関数とかの話がでてくるよ
206 名前:デフォルトの名無しさん mailto:sage [2009/05/26(火) 23:47:16 ] FileSearchってのは使わない方がいいのは何故なんでしょう?
207 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 00:06:07 ] ttp://www.google.co.jp/search?q=excel+2007+filesearch
208 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 00:12:10 ] 質問です。 Functionプロシージャに渡したい引数が多い場合、構造体を作って Public Type UserType a As integer b As Long c(10) As String End Type Sub AAA() Dim data As UserType Call BBB(data) End Sub Function aaa(ByRef data As UserType) '処理 End Function のように構造体ごと渡してやればスッキリしますよね。 この時dataの中身を値渡しのように使いたいとしても、参照渡しとなるので Functionプロシ−ジャの中でdataの中身が書き換えられる恐れはありますよね? 構造体を渡すけれども、値渡しとして使うという明示的な方法はあるのでしょうか? 宜しくお願いします。
209 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 07:41:08 ] >>208 基本的には無い。やるとしたら以下の3つかな? @コーディングルール徹底(コメントを残して従う、関数名 etc) A予め構造体をコピーしておく B構造体ではなく、必要データだけ渡す もしかして、byval渡しなら出来たりして。 けど、VBAに限らず上の3つは基本だと思う。
210 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 20:37:10 ] W2K XL2000 配列から重複データを排除しユニークなデータの集合にする方法を教えてちょんまげ
211 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 20:52:04 ] >>210 スレ違い>>4 ★5★6
212 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 22:04:46 ] >>210 dictionary使う。
213 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 22:09:44 ] ユニークといえばモニーク
214 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 03:34:49 ] >>210 ワークシートに並べてフィルタかける
215 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 09:01:13 ] >>214 オートフィルタとかワークシート関数とかを如何に活用するかが ExcelVBAの醍醐味
216 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 18:33:58 ] >>215 そうだね。 となりに=COUNTIF($A$1:A1,A1)が1になってるとことか、=MATCH(A1,A:A,0)=ROW()がTRUEになってるとこをオートフィルターにかけりゃいいもんな。
217 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 19:25:09 ] 配列まで使えるってことはVBAをそれなりに使えると考えられるわけで 既に存在する配列からの削除って事は フィルタかけるくらいなら取り込み時点で排除する方法を採っているだろうと予想できるわけで CreateObject(Scripting.Dictionary)はこれ自体の機能はスマートだけど 結局配列に戻さないといけないから実用レベルで組み込むとコードが鬱陶しいんだよね。 なんか実務家ならではの回答ってないの?おまえら
218 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 19:32:50 ] dictionaryに放り込んでから配列に戻すのが面倒だと感じるならば、 重複判定を積んだ配列に放り込めば良いじゃない。 配列を複数持つ事を嫌うならば、クイックソートで配列を並び替えて、 重複した場合に削除すりゃ良い。 これはワークシートでやってる事と一緒だけどね。 個人的には、作業用配列を作る事に違和感を感じないんで、 別配列に重複判定しながら放り込むけどな。
219 名前:217(210) [2009/05/28(木) 19:48:25 ] いいですね。教えてちょんまげ。 まず「配列に重複判定を積む」ってどうやるんですか? それから、配列から配列を作ろうとする場合、まず二重ループでの処理を思いつくけど 配列を二重ループ内に組み込むとエラーが出ちゃいますよね。 これ、どうやって回避、あるいはどんな他の方法を採ってますか?
220 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 20:02:41 ] 1次元配列で良ければDictionaryのKeysメソッドで何も面倒なことないんでない? 別の2次元配列なら重複判定しながら放り込んだ方がいいけどな。
221 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 20:25:20 ] Scripting.Dictionaryがハッシュ使ってて性能いいんじゃね?
222 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 20:53:30 ] >>221 データによるね。 あまりにも多いとCollectionに負けるし、クイックソートして詰める手法にも負ける。
223 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 21:09:02 ] Dictionaryで重複を弾くのは裏道を抜ける感じがするんで、 論理的思考を養う段階のレベルならば、Dictionaryを避けて配列使った方が良いかもなぁ。 でも、pushがデフォルトで搭載されてない言語だから、ステップ数増えるよね。 Dictionaryでもいいかな・・・とも思う。難しいのぉ。 これを機会にクイックソート覚えるのもいいかもね。
224 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 21:19:37 ] CreateObject("System.Collections.SortedList")は?
225 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 21:22:06 ] 文字列データはいいとして、ある決まった範囲の整数にまでDictionaryを使うやつはアホだね。 猫も杓子もCreateObject(Scripting.Dictionaryを見るとうんざり。
226 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 21:26:35 ] > なんか実務家ならではの回答ってないの?おまえら スレ違いだからコードそのものは伏せるけど、重複削除の汎用関数作って、 それに放り込むだけだろ ワークシートの機能とかScripting.Dictionaryとか使えない言語でも この手の処理は必要になるから、ちゃんといくつかのアルゴリズムが確立されている ソートみたいに、計算量、必要バッファ量、順序の維持(ソートで言うところの安定ソート)など それぞれ特徴があるから、必要なアルゴリズムを必要な言語に書き換えて用意して おけば良いだけの話
227 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 21:31:06 ] >>226 それがどれなのか分からないから教えてくださいって話じゃね 教えてくださいよ先輩
228 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 21:32:39 ] しかしExcel2007の新機能の重複の削除はひどいな。 どっかで見て俺も試したら笑ってしまった。 重複してないものまで削除することあるんだもんな。
229 名前:217(210) [2009/05/28(木) 21:33:53 ] いろいろありがとう。 >重複削除の汎用関数作って 理想としてはこれでやりたいんだけど、 Functionとの間での配列の引渡し方・受け入れ方が分からないんですよ…
230 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 22:11:21 ] >>229 もう総当たりでやれよ。関数化は後の話だ。 関数化するにも、自前でルーチン作成出来なきゃダメなんだしさ。 forで 配列1 から 配列2 に全要素をコピーするだけだ。 その時に、配列2に対象の要素が含まれていない時って条件付けるだけ。 総当たりでやるのが論理的には一番理解しやすい。 先ずはここから入って、処理速度や負荷の問題が見えてきたら、 その状況に応じて別のルーチンを考えれば良いと思うよ。
231 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 09:41:11 ] そういえば、2007で.netってサポートされてるの? 使える雰囲気が全然無いんだが、2010では.netのサポートがあるかな? 次期Officeにはほかの言語もサポートしてもらえるとうれしいな。
232 名前:デフォルトの名無しさん [2009/05/29(金) 10:02:32 ] 質問です。 コマンドボタンを押すとへこんだままになってしまいます。 処理は正しく実行されて、もう一度押すとまた処理が実行された後に元に戻ります。 使う上で問題は無いのですが、直したいです。 設定が悪いのでしょうか?
233 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 10:08:25 ] それ、コマンドボタンじゃなくてチェックボックスだろ
234 名前:デフォルトの名無しさん [2009/05/29(金) 10:15:42 ] いえ、コマンドボタンです。 確認したら処理は最後まで実行されていたんですが、 見た目だけだと処理がフリーズして止まっている様な感じになります。
235 名前:デフォルトの名無しさん [2009/05/29(金) 10:27:16 ] 解決しました。 今あるボタンを消して新しく作ってみたら直りました。
236 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 10:38:56 ] 作り直して解決って事はやっぱりチェックボックスだったんだろうな グラフィックは全く同じだし、押し下げでも上げ戻しでもClickイベント発生するし
237 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 14:18:22 ] >>231 VSTO使えば.netFrameworkの恩恵をフルに享受することができる。 あまり流行ってないけどね。
238 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 17:50:30 ] Excel2003のVBAで新規のbookを作ってファイル名を YYYYMMDDhhmmssにしたいのですが、 Wbook_out = Year(Date) & _ Right("0" & Month(Date), 2) & _ Right("0" & Day(Date), 2) & _ Right("0" & Hour(Now), 2) & _ Right("0" & Minute(Now), 2) & _ Right("0" & Second(Now), 2) もっと適当な命令や定番テクニックってないですか?
239 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 18:30:47 ] >>238 =Format(Now,"YYYYMMDDHHMMSS")
240 名前:238 mailto:sage [2009/05/29(金) 18:39:35 ] >239 ありがとうございました(ペコリ
241 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 18:43:43 ] 今、VBAの勉強してるんですが、自分は仕事しててこういう時にVBAが役立った という経験があったら教えていただきたいのですが。。
242 名前:デフォルトの名無しさん mailto:sage マジでw [2009/05/29(金) 18:59:16 ] VBAのおかげで彼女が出来ました!
243 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 20:22:10 ] >>241 ・古いファイルの正規化 ・プリンタの変更→印刷→プリンタの変更、をボタン一つで出来るようになったこと ・他人に作ったシートには関数を入れず、ボタンを押して計算させるようにしたこと(何度言っても計算式の入ってるセルに上書きするアホウがいる為) ・ファイル名の一部をシート名にする、等 ・彼女は出来・・ねーよwただ仕事上、仲良くなるきっかけにはなったかもしれない 他細かいことは色々あるけど、とにかくまぁ色々便利。特に中小企業でマクロ使えればかなり便利じゃないかな 逆に大企業だと使う場面が無いかと。VBA無しのアクセスの方がよっぽど使う機会が多かった
244 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 20:29:39 ] テキストエディタのマクロや正規表現は結構使うけど Excelのマクロとか、セキュリティ云々でうるさいからあまり使わないなぁ。
245 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 20:56:05 ] >>241 VBAのおかげで持病が治りました
246 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 20:56:47 ] Sub hoge() Dim hoge As Range If (hoge Is Nothing) Or (hoge.Value = 0) Then Exit Sub End If End hoge なぜかエラー出る@2007
247 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 21:00:25 ] >>246 Sub hoge() Dim hoge As Range Set hoge = Range("a1") If (hoge Is Nothing) Or (hoge.Value = 0) Then Exit Sub End If End Sub set
248 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 22:32:13 ] >>247 hogeに値を代入してないのは、値を読み出そうとしたときにエラーを起こさせるためだよ。 VBAはデフォルトでショートサーキット評価ではないみたいだね。 msdn.microsoft.com/ja-jp/library/ea1sssb2 (VS.80).aspx ショートサーキットで評価をするにはOrElseをつかえということだけど VBAではこれまた制限されてるみたいだね。 If hoge is Nothing then exit sub if hoge.Value == 0 then exit sub と分けて書くしかないかな?
249 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 22:48:53 ] 何をやりたいのか分らんが、こういうことじゃないよなぁ。 Select Case True Case hoge Is Nothing, hoge.Value = 0 Exit Sub End Select
250 名前:246 mailto:sage [2009/05/29(金) 23:31:58 ] >>249 おお、それだ。 Select Case Trueとか、なんて変態的なんだw Delphiのcase Integer of (Cのunionと同義)を思い出させるぜ。 なんかトリッキーすぎて分かりにくいなあ。VBAではこういう書き方って一般的なの? それとも、Ifを連ねて書く方が一般的?
251 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 23:53:18 ] オレはIf〜Elseを並べてる
252 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 00:39:40 ] >>250 VBAではごく一般的だと思うけどな。
253 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 00:55:27 ] 言語によってスパスパ頭切り替えられない奴は 向いてないと思う。
254 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 00:55:38 ] 職場のEXCEL2000で使うためのマクロを作っています マクロ自体は自宅の2003で組んでいます。OSはどちらもXPです。 D2とA5のセルにそれぞれ値が入っているときに、D5のセル位置を取得する方法ってありませんか? Ctrl+Endで移動する位置を取得したいのです。 ActiveSheet.UsedRangeでいけるかなと思ったのですが、セルが飛び飛びで利用されている場合だと うまく機能しないときがあるようです。
255 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 01:00:33 ] >>254 www.niji.or.jp/home/toru/notes/8.html
256 名前:デフォルトの名無しさん [2009/05/30(土) 07:39:32 ] >>241 SQL Server とのやり取りが多いから、使わないと仕事にならねぇ 検索結果をExcelにはくことが多いから #数万行出す場合、他アプリから出力すると遅さに耐えられないw テキスト取り込んで簡単な集計する場合とか、ボタン一発のほうが楽じゃね? #簡単じゃない集計はDBに入れてから処理する worksheet関数を鬼のように駆使する人は、ある意味すごいと思うけど VBA使ったほうが、楽になるのに・・と思う場合が多い 後でメンテする場合、Cellを延々と追いかけるの、めんどくないかなと思うんだわ #いや、自分はめんどくさがりや だから #まぁ コード書くのが本職なんだけどねw
257 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 07:49:05 ] 数式が長くなると一覧できなくなるのと コメントが書けないのがワークシート関数の欠点かな 関数一発でいきなり動いて結果が出る手軽さとどっちを取るかだね
258 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 08:56:42 ] delete押すだけで消えてしまうのも怖い
259 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 09:19:01 ] 保護
260 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 21:29:03 ] 行がたくさんあってゴチャゴチャしてるシートの視認性を良くするために 選択したセルのある行に一時的に色をつける処理を考えてるんですが Private SubWorksheet_SelectionChange(ByVal Target As Range)
261 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 21:34:59 ] 誤送信失礼。 行がたくさんあってゴチャゴチャしてるシートの視認性を良くするために 選択したセルのある行全体に一時的に色をつけようと考えてるんですが Private Sub Worksheet_SelectionChange(ByVal Target As Range) Rows(ActiveCell.Row).Interior.ColorIndex = 37 End Sub でとりあえず色はつけられたものの カーソルを移動した後もその行は色がついたままになってしまうので どうにか消せないものかと考えてるんですが、何か方法はありませんでしょうか?
262 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 21:52:08 ] 消す処理入れてないんだから消えないのは当然でしょ? Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = xlNone Rows(ActiveCell.Row).Interior.ColorIndex = 37 End Sub 但し、行強調以外の色つけも全部消えるからね それじゃ困るというならあとは自分で工夫しな
263 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 21:57:04 ] VBA以前にレイアウトを考えたほうが良いんじゃね?
264 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 21:59:14 ] あー、なるほど 色をつける前に全消ししてしまえばいいんですね 色をつけたあとに前に選択していた行だけを消そうと考えていたせいで思いつきませんでした ありがとうございます
265 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 23:54:29 ] ワークシートの右端の列にフラグを入れるとか
266 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 00:01:11 ] >265 ダッセw
267 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 08:07:29 ] >>261 実際にやってみると分かるけど、すげー重いぞそれ。 とても実用化出来ないほど重い。
268 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 08:49:31 ] 余程化石なPC使ってるか、余程システムかExcelが腐ってる状態で使ってるんですね
269 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 15:09:59 ] 昔は>>261 や>>262 みたいなのは重くて使えなかったのは確かだが、今のパソコンはそれほどでもないんじゃない? Excel97が出たころは一工夫して下みたいな十字カーソルをやってた。 もっともExcel97はTargetじゃなくSelectionだったかも。 Dim rng As Range Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not rng Is Nothing Then rng.Interior.ColorIndex = xlColorIndexNone End If With Target Set rng = Union(.EntireRow, .EntireColumn) End With rng.Interior.ColorIndex = 8 End Sub 今のExcelは行列番号の色がはっきり違って目立つから全然必要ないと思うんだが。
270 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 16:34:43 ] 実はたいして変わらないんだけどね
271 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 18:26:20 ] 他ファイルを処理するプログラムの初期処理で、 選択範囲を保管しておきたいです。 選択範囲がセルなら、Selection.Address 選択範囲が図形なら、Selection.Name を保管しておけばいいのだろうけれど、 値にアクセスする前に型を判別できないのでエラーになってしまう。 どうしたらよかんべ?
272 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 18:34:20 ] >>271 なんでわざわざAddressやNameを保持するの? Selectionそのものを保持すればいいだけじゃん Dim hoge As Object Sub 選択保持() Set hoge = Selection End Sub Sub 選択復元() hoge.Select End Sub
273 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:09:00 ] >>272 サンクス。 Rangeオブジェクトのときは上手くいくのだけど、 画像などの場合、他の箇所で切った貼ったを行ってしまうと、 PictureクラスのSelectメソッドが失敗してしまう。 なので、質問したようなやり方をしたいのだ。
274 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:27:31 ] >>270 今はたいして変わらんかも知らんが、昔の低スペック機では全然違ったのよ。 いったん全部色を消すのは使い物にならなかった記憶がある。
275 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:57:25 ] >>269 のコードと、普通に書いた下のコードを比較してみれば分るな。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = xlColorIndexNone With Target Union(.EntireRow, .EntireColumn).Interior.ColorIndex = 8 End With End Sub 2007でA1:J100を順番にSelectさせてみたら、こっちは約10秒で>>269 は約2秒だった。 5倍くらい違うということか。 今の高スペック機じゃ一回では体感できないが昔ははっきり体感できたもんな。
276 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 21:25:29 ] >>273 セルと図形って言ってただろ? なんで画像が出てくるんだ?
277 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 21:28:48 ] >>275 現行機で0.93秒と、1.75秒だった 10年以上前のPen3 450MHzでも1回当たりの体感に差はない
278 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 21:54:28 ] >>277 バージョンによってCellsとかの扱いが違うのかもよ。 とにかくExcel97で275みたいなのは使い物にならなかったのははっきり覚えているよ。 あまり絡むなよ。
279 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:24:30 ] 覚えていること(人の記憶)と、リアルタイムで実践したことでは 当然ながら後者に信憑性があることは言うまでもないわけで。 あまり絡むなよ。
280 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:27:47 ] 本当に嫌な性格だねぇ。 Pentium3の発売が何年か知ってるのかよ。 97年当時Pentium3 450MHzなんてないんだよ。
281 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:33:18 ] 粘着君が97年当時のパソコンをヤフオクで買い求めたりしてw
282 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:38:15 ] Office97が出た頃にはWindows98の話題が出ていた 多くの人はWin95にOffice97パッケージを乗せずに、 Win98もしくはWin98SEとOffice97が入ったマシンに買い換えた 1999年、Pentium IIIが現れWin98の情報も溢れてきた頃に
283 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:55:11 ] というか、277は10年以上前のPen3 450MHzって書いてるだけで、10年前にPentium3が無かったってなら 突っ込むのも解るが、10年前にはPentium3の550MHzが出てたし、280は何で絡んでるのかよくわからんな。
284 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:03:41 ] >>283 話の流れを良く読め。
285 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:09:39 ] 277=279だったら277が粘着してるが、別人だったら>>283 の言う通りだね。
286 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:13:12 ] というか、件のコードが当時は使い物にならなかったってことにしようと 約一名が躍起になってるだけのように見えて痛々しい
287 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:18:41 ] と約1名が躍起になってるようですね。 ほんと痛々しいね。
288 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:20:39 ] >>280 化石引っ張り出してきたよ 12年前のPen2 233MHzでも1回当たりの体感に差はない カーソルキーで連続移動すれば体感差あるけど カーソルキー移動1回、もしくはマウスクリック1回に置いて 色の切り替わり速度に違いは感じられない
289 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:24:34 ] 結局認めてるじゃん
290 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:28:35 ] まぁ1回ではって書いたの俺だから、俺が悪かったよ。 気が済んだか?
291 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:30:43 ] > 今の高スペック機じゃ一回では体感できないが昔ははっきり体感できたもんな。
292 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:32:54 ] >>289 話の流れを良く読め。
293 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:33:55 ] だから1回ではってのは間違いだよ。すまんね。 使い物にならないのは>>268 も書いてる通りだ。
294 名前:293 mailto:sage [2009/05/31(日) 23:34:53 ] >>268 じゃなくて>>288 な。
295 名前:288 mailto:sage [2009/05/31(日) 23:36:45 ] 残念、使い物になってるけど
296 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:37:00 ] どっちもファイト!
297 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:37:27 ] >>276 Excelのオブジェクトでは、図形に画像は包含されるから。 Shape > Picture 紛らわしい書き方だったか。
298 名前:通りすがり mailto:sage [2009/05/31(日) 23:38:33 ] いやそもそも >>288 は真実か? 先ずはそこから検証だ
299 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:40:22 ] 通りすがり わざわざ書くのは 自作自演 字余り
300 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:43:56 ] >>299 お前かわいそうなやつだなぁ。 まぁ自作自演じゃないのが分るのは2名だけだけどな。
301 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:46:07 ] 図星か
302 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:49:06 ] 本当の通りすがりは、わざわざ通りすがりであることを 強調する必要もないからな。 当人ではなく第三者的な意見だって事に しておきたい場合の策だったんだろうがバレバレすぎるw
303 名前:通りすがり mailto:sage [2009/05/31(日) 23:49:12 ] 違うんだけどな このIDの無い板で自作自演をするのに わざわざハンドル名付ける必要も そもそも自作自演する必要も無いんだけどな
304 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:52:03 ] 本当に通りすがりなら、勘違いしてる奴なんて放っておけば良いのに 必死に弁明するから実は通りすがりじゃないことが立証されていく まさに泥沼
305 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:53:31 ] >>3 .02は普段さんざん自作自演やりまくってるんだよ。 自分がやってるから他人もそうだと思っちゃうかわいそうな人なんだな。
306 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:54:06 ] >>304 おめー病院逝けよ。
307 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:55:05 ] > >>3 .02 そんなに焦らず、そんなに怯えずに
308 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 00:03:01 ] 自己を誤魔化しきれなくなると相手の罵倒に走る、正に王道パターンw
309 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 00:12:16 ] おまいら会って喧嘩しろよ。 勝った方が正義だw ファイト!
310 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 00:16:48 ] というかその前に静かになっちゃったね 自演で1回線2,3役やってたから連投規制でも喰らったかな
311 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 00:26:53 ] かわいそうな人。
312 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 00:43:01 ] ほんと、かわいそう
313 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 01:48:00 ] >>269 と>>275 を比較してみた。 A1〜J100をループを回してセレクトしてみた。 まずどちらもまっさらなシートで計ったら >>269 2.2秒 >>279 11秒 次に両方のシートのA1:J5000に"a"と入力してから計ったら >>269 10.59秒 >>279 23.44秒 >>288 はどういう計り方したの?
314 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 02:06:30 ] すまん、>>269 と>>275 ね。 ちなみにA1:S10000に入力したら12秒と40秒だった・
315 名前:>>261 mailto:sage [2009/06/01(月) 07:23:35 ] >>267 会社のパソコンでやってみたらなんか処理重いなと思って来てみたら 俺のへっぽこコードのせいで変な議論になっちゃったみたいですね・・・ 消すほうも塗るほうも範囲を指定すれば軽くなるのかな?
316 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 07:34:06 ] 良く分からんけど、changeの度に200ms以上のラグが発生したらNGだな。
317 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 07:59:23 ] 性能が高すぎるんじゃね? 比較するなら短い方が最低でも2,3秒になるように範囲を調整した方がいいかも。 値が小さくなるほど誤差の影響は大きくなるから。 あとは2007ではなく2003だと、差が少ないのかも知れない。 うちはメインもサブもXPに2003だけど、A1:J100で5回の平均取ったら メイン 1.6秒:3.9秒 2.43倍 サブ 2.3秒:7.1秒 3.08倍 A1:J200だと メイン 2.9秒:8.6秒 2.96倍 サブ 4.6秒:14.1秒 3.06倍 って結果になったよ。約3倍ってところで、2003なら5倍までの差は無いみたい。
318 名前:デフォルトの名無しさん [2009/06/01(月) 08:16:53 ] >>315 気にするな、基地外が一人紛れ込んできただけらしいから。 Excel2000で>269と>>275 比べて見たが、はっきり体感差があるよ。 >>277 や>>288 はシートの上の方の行でしか比べてないんだろう。 >>313 のように入力して最終行近くで比べれば1回でもはっきり分かる。 A1〜J100をSelectさせてみたら>>269 が8秒で>>275 が66秒だった。 Pentim D 2.8GHzの結構古いパソコンだけど、もっと昔のExce97当時の パソコンなら多分>>275 は後ろの行ではとろくて使えないと思う。
319 名前:デフォルトの名無しさん [2009/06/01(月) 08:23:23 ] >>316 だよな。おれも0.2秒ならストレス感じるよ。 しかし最近はSUMPRODUCTなどで鍛えてる人多いから、そういう人たちは我慢強いかもね。
320 名前:318 mailto:sage [2009/06/01(月) 08:41:57 ] ごめん、>>313 のように入力範囲が広ければ別に最終行近くじゃなくてA1近くでもはっきり体感差があるね。
321 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 09:34:35 ] >>320 1回65536行目近くに移動してから1行目近くににもどった場合>>275 は重くなるんじゃじゃね? 1行目近くで軽くするにはオブジェクト変数にMe.UsedRangeをセットすればいいみたいよ。 65536行近くだとやっぱ重いけどな。
322 名前:318 mailto:sage [2009/06/01(月) 09:49:56 ] >>321 トンクス 試してみたら確かにそうだった。 最初はたしかA1近くでは重くなかったはずなのに途中で重くなったのでおかしいと思ったよ。 なるほどUsedRangeね。
323 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 11:25:22 ] >>317 結構速いね。 俺はCore 2 Duo3.33GHzだがそちらのサブ機より約3倍近く遅い。 Vistaがクソなのか? ところで>>313 が書いてるように広範囲に入力したの?
324 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 12:45:14 ] しかし>>269 をさんざん罵倒してたやつある意味すごいよな。 他人の言うことは端から聞く耳持たないらしいけど、変な自信はたっぷりあるんだろうね。 負けることは絶対に許されない人かも知らんね。 前からここや総合相談所に統合失調症の疑いがあるやついるんだが彼かもね。
325 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 13:19:26 ] >>323 広範囲に入力しなくても最終行に飛んで1行に戻ってくるだけで重いみたいね。
326 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 14:02:31 ] >>325 だったね。
327 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 16:48:51 ] 速度厨 uza
328 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 17:44:02 ] 間違いをuzaで済ませられる性格がうらやましいね。 おれなんか落ち込んで死にたくなるよ。 そこをこらえて謝るけどな。
329 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 17:46:02 ] 一連の気違い発言が327じゃなかったらすまんね。
330 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 20:07:30 ] >>324 >>269 を罵倒してる奴なんて一人も居ないよ。 >>269 の方が優れていることは認めた上で、>>262 でも 使い物にならないほど遅くはないって話をしてるだけ。 会社でいつも怒られまくってて被害妄想気味なのかもしれないけど 誰も>>269 を責めても攻めてもいないから、よく話を読もうね。
331 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 20:17:39 ] 来たね。w もう見苦しいからいい加減やめようや。 会社員ねぇw
332 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 20:46:01 ] とりあえず落ち着こう。
333 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 20:48:06 ] 今頃>>262 が使いものになるってアホでつか? 使い物にならない事例がさんざん書かれてるのに見てないのかな。 ほんと見苦しいいいわけにしか見えないや。
334 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 20:58:00 ] >>333 まぁまぁ。 辛抱強い人には200m秒はおいて数秒のレスポンスでも遅いと感じないかも知れないんだから。 人それぞれだよ。
335 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:07:01 ] >>334 なるほどね。 スローライフの人か。
336 名前:デフォルトの名無しさん [2009/06/01(月) 22:23:20 ] For i = 0 to 20000 Cell.Interior.ColorIndex = Int(Rnd()*20) Next i したらマジで気分悪くなってきた
337 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:44:50 ] >>336 最新のExcelはCellsじゃなくてもいいのか
338 名前:241 mailto:sage [2009/06/02(火) 00:36:45 ] >>243 >>256 今更だけど、どうもありがとう。 勉強初めて一ヶ月経ったけど、ただテキストを最初から読んでいくだけだと、 あまり身につかないものですね。 VBAを使って何をどうしたいという動機が必要なのかな?
339 名前:デフォルトの名無しさん [2009/06/02(火) 02:09:20 ] >>337 タイポだ。まあ気にしないでくれ。
340 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 05:02:32 ] 時代の変化を受け入れられないんだね
341 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 09:40:02 ] PowerPointのVBAなんだけど、他所にないようなのでここで質問させてほしい。 PowerPointでファイルを開いてVBAを使った処理をするんだけど、 PowerPointにはExcelのGetOpenFilename()に相当するものが存在しないので、 コマンドバーを使ってファイルを開くダイアログを出してみた。 Application.CommandBars.FindControl(ID:=23).Execute これを実行してみると、ダイアログを呼び出してすぐに次の命令に進んでしまう。 つまり、新しくファイルを開く前に先に進んでエラーになってしまう。 今はブレークポイントを設定しておき、ファイルを開いてから再実行するということをしている。 タイマーを使うとか考えてみたけど、どうも現実的ではない。 何とかうまくやる方法はないだろうか。
342 名前:通りすがり mailto:sage [2009/06/02(火) 09:55:39 ] >>341 >>92 は駄目?
343 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 09:57:30 ] ごめん これ 閉じてから再実行でした
344 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 12:27:25 ] >>338 作りたいものを作って、少しずつ改良していくのがいいと思う
345 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 13:04:19 ] >>338 やりたいことがわからないで勉強しても無意味だよ 学校に通ってても英語の勉強が今では何の役にも立たないのと一緒 毎回これやるのめんどくせぇな、、、、なんとかならんかな、、、 からvba勉強し始めると ここの人の手助けもあって2週間位で株の自動発注から返済までが組めるようになった
346 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 14:09:08 ] 株ねぇ そういえば俺の尊敬する株屋さんどこ行っちゃったんだろうな。 某Q&Aサロンで女性になりすまして活躍してるという噂を聞いたが。
347 名前:デフォルトの名無しさん [2009/06/02(火) 18:21:01 ] さっき図書館でSE関係の新刊があったのでパラパラとめくりながら読んでたら、 ”VBAにいくら習熟しても金にならないから、優秀な人はどんどん他の言語に移っていく。 VBAは下っ端の奴がやらされる仕事だ。” みたいな意味の事が書いてあった。 薄々、同じような事を思ってたけど、いざ活字で目にするとショックだ。
348 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 18:52:54 ] 質問です。 少し時間のかかる処理をさせているんですが、 その処理が動いてる間、 ボタンなしのダイアログ等で『処理中』と表示させ、 処理が済んだら自動で消す、 といったような事はできますか?
349 名前: ◆.jruuB3RTA [2009/06/02(火) 19:06:59 ] Cells(Rows.Count,1).End(xlUp).Select Endプロパティは連続したデータ範囲の終端セルを返すので、 表の途中に空白セルがあるとデータを返せない。 と、テキストには書いてあるのですが、 空白セルがあったら、Null値とか文字列とかを入れるプログラムは書けませんか?
350 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 19:20:53 ] >>347 んっとだな。 VBA単体では金にならない。ってのが正しいと思うよ。 事務処理業務+VBA とか、何かの基礎に付随する能力としてのVBAは金になる。 VBAだけしこしこ組んで金にはならん。 DB+VBAとかでも生活出来る程度の金になるし、 転職する時には凄く大きなアドバンテージになる。
351 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 19:24:14 ] >>348 ユーザーフォームで。 もしくは別シートを表示させるとかね。 >>349 何のデータを返したい? 表の途中に空白があったら、そこに文字列を入れたいのかな? それならば、forで上から判定させながら入れて行くのが良いんじゃないかな。 for i = 1 to cells(rows.count,1).end(xlup).row if cells(i,1).value = "" then cells(i,1).value = "空欄" end if next みたいに。
352 名前: ◆.jruuB3RTA [2009/06/02(火) 19:30:15 ] >>351 どうもありがとう。 こんな短時間で答えられるなんてすごいなぁ。 図々しくて申し訳ないんだけど、 rows.count,1 の1って、どういう意味ですか? すいませんが宜しくお願いします。
353 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 19:42:16 ] Cells(Rows.Count, 1)..SelectとかCells(Rows.Count, 2)..Selectなどやってみれば分りますよ。
354 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 20:09:13 ] >>351 ユーザーフォームとは、、 まだ始めたばかりで余り単語とかも分からず…
355 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 21:01:54 ] >>348 VBAでプログレスバーっていうのはどこかにあるよ
356 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 21:47:46 ] プログレスバーってのはvbaだけですよね? excelで使いたいんです。。。 通常のVBは入ってないので。
357 名前:デフォルトの名無しさん [2009/06/02(火) 21:54:20 ] >>347 あくまで道具の一種ですよ。 ほかの言語でやる必要があればその言語を使えば良いだけ。 並列言語とかをのぞけば、要件抽出して、適当にクラスをモデリングするという基本的な作業は変わらん。 >>350 >DB+VBAとかでも生活出来る程度の金になるし、 それは他の分野で優れていて、なおかつそういうサブスキルがあればその分有利になるってだけの話だろ。 それだけで食っていけるなら、失業者なんて出ないよ。
358 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 21:56:38 ] 以前、FileSearchについて質問した者です。 更に質問なんですが、 FileSearchで見つかったファイル、ファイルパスをシートにリストにしているんですが、 その見つかった数だけ、隣にコマンドボタンを自動で作り、そのボタンで隣のパスのファイルを開く、 という動作はできますでしょうか?
359 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 22:08:23 ] プログレスバーの例 www.asahi-net.or.jp/~ZN3Y-NGI/YNxv9g1810.html >>358 ボタンじゃなくて、リンクではどうよ
360 名前:254 mailto:sage [2009/06/02(火) 23:32:35 ] >>255 遅ればせながらありがとうございました。 リンク先S4でやりたかったことができました。
361 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:43:00 ] >>359 リンクでやってみようと思います。 それから、FileSearch実行中にステータスバーに検索状況を表示しようと思っているんですが、 どのタイミングで記述すればいいか分かりません。 以下ソース一部です。 .SearchSubFolders = True ' サブフォルダも探索 If .Execute() <> 0 Then For Each vntF In .FoundFiles With objFSO.GetFile(vntF) GYO = GYO + 1 Cells(GYO, 1).Value = .Name Cells(GYO, 2).Value = .DateLastModified Cells(GYO, 3).Value = _ Left(.Path, Len(.Path)) With Worksheets("Sheet1") .Hyperlinks.Add anchor:=Cells(GYO, 3), _ Address:=Cells(GYO, 3).Value End With cntFound = cntFound + 1 End With Next vntF End If End With
362 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 00:22:43 ] >>349 >>空白セルがあったら、Null値とか文字列とかを入れるプログラム Cells(Rows.Count, 1).SpecialCells(xlCellTypeBlanks) = "Nullとか文字列" はだめ?
363 名前:341 mailto:sage [2009/06/03(水) 01:13:32 ] だめかなー
364 名前:デフォルトの名無しさん mailto:age [2009/06/03(水) 07:07:54 ] vbaって廃止されるの? VSTOだけになっちゃうの?
365 名前:デフォルトの名無しさん [2009/06/03(水) 07:19:18 ] VBAって何の為にあるのだろう? 昨日、VBAを使ってACCESSにつなぐのが1時間くらいできなくて、 さっきExcelのリボンからやってみたら1分でできた。 俺の頭が悪いだけなのかw でも、VBAやったおかげで、他のスクリプト言語の理解度が深まった気がするから、 やはり、勉強してみて良かったのかな?
366 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 07:36:02 ] >>365 お前ではどんな言語をやっても意味ないだろうな
367 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 08:15:48 ] 単一の機能を呼び出すだけなら、1時間もかかるのはバカだからだとしても VBAのコード書きからやるよりは、メニューやリボン、ツールバーなどからの方が速くて当然 VBAは主に何度も行う定型処理や規則処理、連続処理などに使う スクリプトも使うならそのくらいわかりそうな物だけど
368 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 08:16:13 ] VBAって補助的なツールとして使うだけだな。 使えればそれなりに作業効率がアップする程度かな。
369 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 08:56:47 ] 最初は時間かかってもいいからとにかく動くものを作って理解する 作ったものはエクスポートして保管しておく 後はそれをコピペして改造しながら使っていく VBAを飯の種にしてる人以外はこんなもんじゃね?
370 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 09:55:35 ] 純粋にVBAだけで食ってるのは、本書いたり教室で教えたりの人だけじゃね? 俺は全社の業務効率化の為にVBAだけで仕事してるけど、 それでも会社の事知らないと作れないから、それだけで食ってるとは言い難いな。
371 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 19:20:28 ] VBAもピボットも機能の一つでしょ。それ以上でもそれ以下でもない 使いどころを間違えれば仕事が遅くなるのは当然
372 名前:341 mailto:sage [2009/06/03(水) 22:14:25 ] >>366 はは。他の言語とか、そんなことないんだけどなー。 Office VBAはやらなかったもんでね。 オブジェクトモデルも理解してないんだよ。 さっと教えてみてくれよ。
373 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 22:42:57 ] >>372 www5c.biglobe.ne.jp/~yamag/data/Soft/VBAProgramingTIPS.html WordにもGetOpenFileNameがないらしいので参考にすれば しかし、ここはExcel VBA質問スレだ 二度と来るな
374 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:02:19 ] >>361 ですが、 特にレスがないってのは出来ないって事でしょうか・・・ それともここにはそれだけの知識を有した方がいないんでしょうか
375 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:18:19 ] もう来んな。臭すぎて気分悪いわ。 やっぱり俺が出て行くわ。
376 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:04:06 ] > それともここにはそれだけの知識を有した方がいないんでしょうか そうだよ、だから帰ってね
377 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:19:07 ] >>341 PowerPointから CreateObject("Excel.Application")して GetOpenFileNameするってのもありか
378 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 02:59:12 ] >>374 まあファイル総数を調べた後に1つ1つカウントすればいいんじゃね? 簡単だろ?わからないなら1から10までカウントのプログラム書いてみ?セルに表示するやつ あとはそれをどう表現するかの問題。セルに色塗ったり、色付きラベルの長さを伸ばしたり・・・ コントロールもあったかもしれん そもそも経過処理表示を本気で実装するのは難しい(無理) インスコ等でも分かると思うが、人間の感覚と処理経過に乖離が発生する。
379 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 03:09:35 ] >>374 「vba ステータスバー」でググった一番上。まさにこれかと・・・ そもそもfor文使ってるのに意味分かってないのがアウツ
380 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 06:52:18 ] おまえらほんと優しいな、あからさまに煽ってるやつの相手してあげるなんて
381 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 07:25:18 ] で?
382 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 07:35:17 ] って
383 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 07:50:09 ] /ニYニヽ /( ゚ )( ゚ )ヽ /::::⌒`´⌒::::\ 呼んだ? | ,-)___(-、| | l |-┬-| l | \ `ー'´ /
384 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 09:08:08 ] XP、Office2003を使用しています IEのherf="javascript:clickQuickLink('summary');" これをクリックしてページの推移をしたいのですが このリンクをマウスでクリックするようにvbaでクリックする方法を教えていただけないでしょうか よろしくお願いいたします
385 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 09:40:56 ] >>384 VBAを使ってのExcelの操作ではなくIE(IEオブジェクト)の操作はスレ違い>>4
386 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 11:30:08 ] いちいち言わなくてよろしい
387 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 15:32:16 ] 言わずとも解ってる人には言わなくても良い 言わないと解らない人には言う必要がある スレ違いな質問しちゃう人は後者なので言う必要がある
388 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 15:54:06 ] ほっとけばよろしい
389 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 16:00:08 ] 寛容と無秩序を取り違えている人?
390 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 16:13:58 ] うざいよ
391 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 16:17:48 ] スレ違い認定はもういいよ
392 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:11:47 ] 論では返せず
393 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 19:14:19 ] ならツモで
394 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 20:27:47 ] >>361 です 見付かったファイル状況ならもちろん分かります。 検索しているファイルのカウントを表示させたいんですが、 どこでどのオブジョクトを見ればよいのかが分かりません
395 名前:デフォルトの名無しさん [2009/06/04(木) 23:03:46 ] 世の中に自分で書いたソースが理解できない奴なんて居るの?
396 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:04:40 ] 2年前のソース理解できませんでした。サーセンwww
397 名前:341 mailto:sage [2009/06/04(木) 23:04:55 ] >>373 えらい人だね >>377 > CreateObject("Excel.Application")して なるほど。 明日から出張なんで、帰国したら試してみる。 ありがとう。
398 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:37:34 ] スレタイ見ようぜ。
399 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:10:03 ] executeした後に、どこにファイル検索数を持ってるんでしょう? プロパティやオブジェクトもググっても見つからないし、 executeしたらその.Executeの中身はすぐにhit数になってるし。
400 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 08:54:53 ] オブジョクト
401 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 08:56:30 ] オブジョイ
402 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 09:12:57 ] オブジョイト
403 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 09:46:46 ] EXCELの自動計算がとまってしまうことがあります オプションの自動計算のチェックボックスはonのままです とりあえずマクロの Private Sub Worksheet_Calculate を削除したところ止まらないようになりましたけど・・ 原因がわかりません
404 名前:デフォルトの名無しさん [2009/06/05(金) 21:45:53 ] Worksheets("Sheet1").Delete これをVBAで実行すると、シートを削除するときに本当に消していいのかという 確認ダイアログを求められるのですが これを出さずに強制的に削除する方法ってあるのでしょうか?
405 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 21:58:29 ] >>404 Application.DisplayAlerts = False
406 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 02:07:20 ] >>403 そのマクロの中身がわからんことには…
407 名前:VBA暦12時間 [2009/06/07(日) 14:49:37 ] すみません 初歩的な所ではまっています。 下記の処理は、 ”■”なら16行目に値をカウント ”□”なら17行目に値をカウント という処理をしています(4列目に実際に加算したい数値が入っています) この場合、何回もボタンを押すとどんどん値がふえてしまうのでボタンをおしたタイミングで16行目と17行目を0クリアしたいのですが、 コメントにしている部分を解除にすると、なぜか計算がされません。(0のまま) どなかたどうかご教授よろしくお願いいたします。 Private Sub CommandButton1_Click() For 列 = 5 To 27 For 行 = 5 To 10 ' Cells(16, 列) = 0 'Cells(17, 列) = 0 If Cells(行, 列) = "■" Then Cells(16, 列) = Cells(16, 列) + Cells(行, 4) ElseIf Cells(行, 列) = "□" Then Cells(17, 列) = Cells(17, 列) + Cells(行, 4) End If Next Next End Sub あと自分のレベルで参考になるVBAサイトもご紹介いただけると助かります。 よろしくお願いいたします
408 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:52:12 ] 0にクリアするところはFor文の外にしなきゃだめだよ
409 名前:VBA暦12時間 [2009/06/07(日) 16:42:40 ] うわっ!俺あほだ! ありがとうございました!
410 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 20:46:57 ] Option Base 1 Sub a() Dim a Dim b(3, 3) '空いてる数字探し配列bに入れる For n = 1 To 10000000 a = Range("a1:c3") For i = 1 To 3 For k = 1 To 3 If a(i, k) <> 0 Then b(i, k) = a(i, k) End If Next Next '実際に作成 For i = 1 To 3 For k = 1 To 3 If a(i, k) = 0 Then 'bにない数字を探す Do c = Int(9 * Rnd + 1) If (Application.Match(c, b, 0) >= 1) Then GoTo fjk
411 名前:410の続き mailto:sage [2009/06/07(日) 20:48:22 ] Loop fjk: b(i, k) = c End If Range("a10:c12") = b Next Next Next If (1 = 2) Then Exit Sub 'ここまで If (Application.Match(c, b, 0) >= 1) Then GoTo fjk の時点で型が違いますとエラーが出ます、これは何故でしょうか? ワークシート関数matchで検索し、配列bの中にcがあるかどうかを調べようとしているのですが、cがどんな数字でもエラーが出てしまいます。どうしてでしょうか? コードの主な内容は、A1:C3を元に乱数で魔方陣を作ってみようというものです 配列aはA1:C3セルの数字、配列bは一時的な計算用配列です
412 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 21:43:55 ] 型が違うってことは型が違うんだよ!さっさと死ね!
413 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 22:32:48 ] え・・
414 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 22:38:09 ] んー。癖が強すぎるコードだなぁ。 余談だけど、こんな書き方を推奨してる参考書でもあるの? 条件指定なしのdoを使ってる所見ると、他言語で覚えたかな。 if thenでGoToに飛ばすコードは記憶の限りでは初めて遭遇したんだけど、 他の言語だと一般的なのかな?後学の為に教えてください。 cが宣言無しで突如出てきてるのは、まぁ良いのか。 bは2次元配列のはずなのに、matchでは何も指定されてないけど、 そこが問題じゃない?
415 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 22:39:10 ] Windows:XP オフィス:2003 VBAの勉強を始めようとセルの結合や色付けなど ごく初歩的なマクロを使ってるのですが マクロで実行した操作を戻ることはできないのでしょうか? たとえばA1:B1セルの結合をすると 戻るボタンがグレーになり、保存せずに閉じて開きなおすしか戻る方法がありません。 これをマクロで実現するにはどうすればよいのでしょうか?
416 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:00:29 ] >>414 おお!ありがとうございます!!そこでした doloopとgotoは今回始めて使いました。参考書とかは特に見ていません。 普通はuntilなどと組み合わせるのですね ワークシート関数のmatchは↓のページを参考にしたのです ttp://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200706/07060141.txt If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk でも If (Application.Match(c, b, 0) >= 1) Then GoTo fjk でも型が違うとエラーが出ます。何が悪いのでしょう? ↓できるだけまとめてみました Option Base 1 Sub a() Dim b(3, 3) For i = 1 To 3 For k = 1 To 3 b(i, k) = 5 Next Next Do c = 5 If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk Loop fjk: End Sub
417 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:08:05 ] matchなんて使った事無いんだが、2次元配列内を一発で検索出来るのか?それ。
418 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:09:01 ] >>415 マクロで実行した物は戻せない。 結合したものを解除したいなら、結合を解けば良い。
419 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:12:48 ] >>417 可能ですよ。存在してたら数字、存在してなかったら型が違うとエラーになります。 ただ>>416 ではウォッチ式見ても型も同じです Sub a() Dim myary myary = Array( _ "加入者番号:", "加入者:", "会社名:", "登録日:", "加入日:", _ "予定事項:", "担当者:", "部門:", "区分:", "住所:", _ "請求書住所:", "電話:", "請求書電話:", "アドレス:") MsgBox Application.Match("登録日:", myary, 0) End Sub
420 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:12:53 ] >>416 釣りだよな?
421 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:14:54 ] >>420 違います。 本気で分からないので教えてくださいorz
422 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:15:54 ] >>419 それじゃ1次元配列じゃないか。
423 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:30:29 ] If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk b(2,2)が配列もしくは範囲ではないから
424 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:34:55 ] >>419 Sub test111() Dim ar As Variant ar = [{1,2;3,4}] MsgBox Application.Match(1, ar, 0) End Sub 2次元配列にmatch掛けられないじゃないか。 存在していても型エラー出る。
425 名前:416 mailto:sage [2009/06/07(日) 23:46:36 ] 申し訳ございませんでした!
426 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 15:28:10 ] >>414 BASICではそもそもIF THENの後のGOTOは省略できるってほど THEN GOTOが人気だったんだぜ… >>416 この用途だと Exit Doで十分だな。 というか、今時GoToなんて苦行する必要ない。 GOTO 、GOSUBなんてのはユーザー関数が無かったころの名残。
427 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 20:31:59 ] テキストとか読み込みとき、Line InputとFileSystemObjectの機能とどっちを使うほうがいいの?
428 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:25:23 ] ,-┐ ,ィ─、ri´^-─- 、 .┌f^f^f^f^f^f^f^f^f^┐ く / , ,' ヽ ヽ| ~ ~ ~ ~ ~ ~ ~ ~ ~│ `<' / ,'レイ+tVvヽ!ヽト 知ってるが │ !/ ,' i |' {] , [}|ヽリ お前の態度が | `!_{ iハト、__iフ,ノリ,n 気に入らない | // (^~ ̄ ̄∃_ア____n_____| _r''‐〈 `´ア/トr──!,.--' <_>─}、 `」レ 'ヽ、 ,.ヘーァtイ Y、.,___/ |.| | i `ー'i´
429 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 22:04:04 ] 昔はLine Inputだったけど、今ならFileSystemObjectを使うのが一般的
430 名前:427 mailto:sage [2009/06/08(月) 22:14:12 ] >>429 レスさんくすです
431 名前:デフォルトの名無しさん [2009/06/08(月) 23:15:19 ] Function Line(args1) ActiveCell.FormulaR1C1 = "=COUNTIF(Sheet1!R1C[args1]:R30000C[args1],RC[-1])" こういう感じでargs1を変数にして呼び出し元で中身を変えて実行したいのですが どうしてもうまく来ません どうやればいいのか教えてください
432 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 23:46:53 ] >>431 ActiveCell.FormulaR1C1 = "=COUNTIF(Sheet1!R1C[" & args1 & "]:R30000C[" & args1 & "],RC[-1])"
433 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 09:50:58 ] 俺なら = replace("=COUNTIF(Sheet1!R1C[@]:R30000C[@],RC[-1])", "@", "1") とやる事が多い
434 名前:433 mailto:sage [2009/06/09(火) 09:53:58 ] = replace("=COUNTIF(Sheet1!R1C[@]:R30000C[@],RC[-1])", "@", args1)
435 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:42:12 ] 質問です。 例えばですが、「abcdefg」といった文字列に、「def」が含まれているか、 といった処理をさせようとしているんですが、どうやって比較したらよいのでしょうか? *def*または、?def?の使い分けもできるようにしたいんですが、可能でしょうか?
436 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:50:42 ] >>435 InStr 正規表現
437 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 00:40:03 ] *def*と?def?の使い分けIをnStrでどうやるんだろ? 俺には分らんな。 Like演算子なら使い分けは簡単。 "abcde" Like "?bcd?"ならTrueだが "abcdef" Like "?bcd?"ならFalseだ。
438 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 11:35:40 ] 正規表現なら、 .*def.* .def. だぬ。
439 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 14:50:52 ] ADOからSQLで"*def*"とやるとエラーになんだよね "%def%"もしくは"_def_"と覚えたほうがいいと思う
440 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:29:09 ] >>437 横スレだけど、 len(str) が5文字かつ、instrが2なら "?bcd?" に該当するんじゃないかな。 正規表現やlike演算子使った方が楽だけど。
441 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:29:21 ] ×スレ ○レス
442 名前:437 mailto:sage [2009/06/10(水) 19:43:01 ] >>440 なるほど。
443 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 20:11:04 ] よこだっ!いいぞ!いいぞ!そう!よこっ!すれっ!すれっ!!よこすれっっ!!!
444 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 22:54:02 ] 質問です。 「マクロ→セキュリティ→Visual Basicプロジェクトへのアクセスを信頼する」にチェックを入れるのを、 マクロで行う事って出来ないんでしょうか?
445 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 22:59:50 ] >>444 何のウイルスを配布するつもりなの?
446 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:16:43 ] OS:Windows XP Professional SP2 Excel:2000 以下2つなのですが、参照している列と値を格納する配列以外は全く一緒です。 引数の参照渡しとかでまとめることはできませんか? Yousosu=0 For Each Youin In Range(Cells(36,3),Cells(49,3)) If Youin.Value="" Then ReDim Preserve Joken1(Yousosu) Joken1(Yousosu)=Cells(Youin.Row,2).Value Yousosu=Yousosu+1 End If Next Yousosu=0 For Each Youin In Range(Cells(36,4),Cells(49,4)) If Youin.Value="" Then ReDim Preserve Joken2(Yousosu) Joken2(Yousosu)=Cells(Youin.Row,2).Value Yousosu=Yousosu+1 End If Next
447 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:54:09 ] できま
448 名前:427 mailto:sage [2009/06/11(木) 01:05:01 ] s(ry
449 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 02:13:20 ] すぇん
450 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 08:00:42 ] >>446 異なる部分を引数にもつ関数作れば?
451 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 09:59:51 ] >>446 やりたいことが分からんけど Dim Joken(36 to 49, 3 to 4) For i=36 to 49 If Cells(i, 3).value = "" Then Joken(i, 3)=Cells(i, 2).value endif If Cells(i, 4).value = "" Then Joken(i, 4)=Cells(i, 2).value endif Next i
452 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 13:06:37 ] >>444 レジストリ
453 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:25:43 ] VBAの年月を取得したいのですが 以下のように作成したのですが、 年:XXXX 4桁で取得できました。 月:XX 2桁ができません、1桁になります。 5月なら05として取得したいのですが、修正方法がわかりません A1には、2009/5/1と入力しています。 VBAに詳しい方で簡単に、どうぞお願いします。 Sub sample() Dim myDate As Date myDate = Range("A1").Value Range("B7").Value = Year(myDate) Range("C7").Value = Month(myDate) Range("D7").Value = Day(myDate) End Sub
454 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:51:04 ] >>445 >>452 ウイルスとかじゃなくて、あちこちアップデートが必要ににりそうなファイルを 自動でパッチあてる感じにしたいんだ レジストリはVBEマクロでいじれるもんなの?
455 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:56:16 ] >>453 A1が日付なら Range("B7").Resize(, 3).Value = Split(Format$(Range("A1").Value, "yyyy/mm/dd"), "/") の1行で充分じゃね?
456 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:57:19 ] >>453 書式設定か、 Range("C7").Value = "0" & Month(myDate)
457 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:00:18 ] >>450 そうなのですが、いろいろ試してもうまくいかなくて… >>451 すみません。どんな動作をしたいか、書いておくべきでした。 なるほど…2次元ですか。 ただ、できれば動的配列にしたいかなぁなんて思ってまして。 2次元だと、Preserveは片方にしか利かないとか。 ありがとうございました。また、自分でも考えてみます。
458 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:03:50 ] >>456 それじゃ10月は010になってまずいんじゃないかなぁ。 右2文字を取り出せばいいけどね。
459 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:25:21 ] >>455 >>456 サンクス 宣言した変数(例、TTTTTTT)に05を文字列として入力したい) A1に2009/5/1と入力して、あるフォルダの2009年05月XXX.xlsというファイルを 読み込むマクロを書いています。 よろしくお願いします。
460 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:29:22 ] >>453 Range("C7").Value = "'" & Format(myDate, "mm") これじゃダメかな?
461 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:35:54 ] >>459 Format$(Range("A1").Value,"yyyy年mm月XXX")の文字列を作ってWorkbokks.Openと組み合わせるだけ。
462 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:37:25 ] >>460 できました。 サンクス , - ,----、 (U( ) | |∨T∨ (__)_)
463 名前:デフォルトの名無しさん mailto: [2009/06/12(金) 01:08:40 ] 取得した文字列を、すでに宣言した変数名と一致させて 使いたいのですが、できますか? やりたいのは Dim ABCDE As Integer Dim moji As String moji = AB "moji"CDE = 5 みたいな感じです
464 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 03:32:11 ] >>463 変数はただの入れ物だから、無理じゃないかなぁ 何がやりたいか詳しく書いてくれたら、 別の方法になるかもしれないけれど、実現できるコードを考えられるかも
465 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:26:27 ] >>464 たぶん>>463 が言いたいのはリフレクションを使って 動的に変数を追加・参照することは出来ないかってことじゃね? そんなことをして、なんになるのか分からないが、そういうことだと思う # javascriptで関数電卓のフレームワーク+プラグイン(関数やらが定義されてたりする)を作ったときに使ったくらいかな? たぶん、VBAのリフレクションは貧弱だから出来なさそうな気がする。 だけど、サンプルを見る限り、連想配列で良いんじゃね?って思うな。 最終的にやりたいことは userStatus("Jonson") = "空腹" userStatus("Harris") = "眠い" userStatus("cherry") = "ピヨピヨ来た" ってことでしょ。 VBAでどうやって連想配列を使うか知らないけど。 # たぶん、つかえないだろうなぁ # 無かったら、自分で作ればいいけど、速度面でどうなんでしょうねぇ。 # 下手なハッシュ関数作るより、 配列二つ並べて、逐一中身を検索した方が早かったりしてw
466 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 05:21:46 ] >>463 okwave.jp/qa2033484.html これみたいなカンジ?
467 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 06:05:14 ] >>465 なんか、全然わかってなくて書いちゃって恥ずかしいっす。 教えてくれてあんがと。 連想配列の使い方を調べたら、Dictionaryオブジェクトだらしいです。
468 名前:463 mailto: [2009/06/12(金) 07:51:24 ] "moji"CDEってのが変数ABCDEのつもりです たとえば takeda aoyama tanaka sirakawa aoyama koyama みたいな50種類くらいの名前がかぶりつつ列挙されてて、それぞれ何個 でてきたかしりたいのです。 変数 aoyama_name,koyama_name,takeda_name と人数分の変数を宣言しておいて、セルの文字列を順に取得し、 その文字列に対応する変数にカウントしていく方法ができないかと
469 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:13:29 ] 該当したらインクリメントすりゃ良いんでないかい? Instrでもlikeでも正規表現でも、何でも良い様な気がする。
470 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 09:34:58 ] >468 こういうことでいいのかな。 A列に(1行目から)集計対象があり、B列、C列に集計結果を出力する。 Option Explicit Dim 名前(100) As String, 件数(100) As Integer, i As Integer, i_max As Integer, 縦 As Long, 内容 As String Sub カウント() Call 初期処理 内容 = Cells(縦, 1).Value Do While (内容 <> "") If i_max = 0 Then 名前(0) = 内容: 件数(0) = 1: i_max = 1 Else For i = 0 To i_max If 内容 = 名前(i) Then 件数(i) = 件数(i) + 1 Exit For Else If i = i_max Then 名前(i_max) = 内容: 件数(i_max) = 1: i_max = i_max + 1 Exit For End If End If Next i End If 縦 = 縦 + 1: 内容 = Cells(縦, 1).Value Loop For i = 0 To i_max - 1 '集計結果の出力 Cells(i + 1, 2).Value = 名前(i): Cells(i + 1, 3).Value = 件数(i) Next i End Sub to be continued
471 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 09:38:23 ] 続きです Private Sub 初期処理() For i = 0 To 100 名前(i) = "": 件数(i) = 0 Next i i_max = 0: 縦 = 1 Exit Sub End Sub 以上 出現順に名前を格納する配列と件数を格納する配列を用意して、セルの内容を読み込む都度 名前配列を順に調べていく、初めてならば添字を+1して名前を格納し、同じ添字の件数配列 に1をセットするというやり方です。もっとスマートな方法があればお知らせください。
472 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:25:10 ] >>468 Excelの本来の機能は表計算ソフトだから、個数を集計する方法はいくつもあるよ。 COUNTIFとかピボットテーブルとか。 VBAだけでやろうとするより、ワークシートにデータを入れちゃって集計の関数を使った方が早い。 VBAだけでやりたいならDictionaryって便利な機能がある。同じ物があったかどうかのチェックが とても簡単。 Sub 集計() Dim name() As String 'テスト用データを用意 name = Split("takeda,aoyama,tanaka,sirakawa,aoyama,koyama", ",") Set dic = CreateObject("Scripting.Dictionary") For Each n In name '配列で集計 If dic.exists(n) Then dic(n) = dic(n) + 1 Else dic.Add n, 1 End If Next For Each d In dic '結果出力 Debug.Print d, dic(d) Next End Sub
473 名前:470 mailto:sage [2009/06/12(金) 13:14:48 ] >472 こういうことができるんですね。 集計対象データが大量の場合は、いったん文字列変数にに","をはさんで連ねていくことになりますね。 Dictionaryの機能は半角英数の大文字・小文字の別とか日本語対応はどうなんでしょう。
474 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:25:58 ] >>473 あくまでもサンプルだから , で区切ったデータを用意したけど、 実際のデータはワークシートやファイルから読み込むのが普通。 キーワードには日本語も使える。英字の大小は区別される。 データを "鈴木,高橋,山田,田中,鈴木,高橋" に変えて試してみ。
475 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 14:28:42 ] 50件程度なら重複チェックを省略しても、とりたてて問題はない。 For Each n In name '配列で集計 dic(n) = dic(n) + 1 Next たったこれだけで集計できる。 データが増えると遅くなるけど。
476 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:22:18 ] UserFormから数式を入力させて、その数式に該当するセルに処理を行いたいのですが、 ヒントになるサイトか関数などあれば教えてください。よろしくお願いします
477 名前:463 [2009/06/12(金) 16:27:12 ] 実は集計するだけではなく、 高橋 100点 三根 98点 山田 100点 高橋 100点 青山 97点 山田 99点 (50人くらい、データは1000件くらい) で100点の人だけ集計して100点の高橋が何人いて、 100点の山田が何人いるみたいなことをしたかったので、 100点で検索して左のセルをみて、 文字列を取得して、その取得した文字列と 関連するの配列名にカウントしたかった のですが、どうもdictionaryでできそうです。 みなさんありがとうございました。
478 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:27:50 ] 「数式に該当するセル」が意味不明 実例を示せ
479 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:30:15 ] >>477 その程度ならVBAなんぞ使わんでも一発で集計できるがね
480 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:43:26 ] >>478 失礼しました やりたいことは条件付き書式設定のようなことで、 例えば 30 20 50 60 40 80 というセルを選択した後、ユーザーフォームから数式を入力してボタンを押すと 数式に該当するセルに対して、処理を行うということです。 条件付き書式設定を使えというのは無しでお願いします。。。
481 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 17:31:32 ] 列なの行なの? なんなのその数字。
482 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 18:13:09 ] Chr(13)とvbCrlfの使い分けの判断は何?
483 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 19:49:23 ] vbCrLf = Chr(13) & Chr(10) Chr(13) = vbCr Chr(10) = vbLf
484 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 21:11:04 ] >>482 改行コードは状況によって変わることがあるから Chr(13)とかChr(10)とかに固定すると具合が悪いこともある
485 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 21:20:26 ] ぜんぜん「数式に該当するセル」の説明になってない…
486 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 09:26:08 ] 俺がエスパーすると 数式の解に該当する数字の入ったセル
487 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 10:58:14 ] 数式: >=50 数式に該当するセル: 50 60 80 ってことじゃね
488 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 11:10:30 ] 俺がエスパーすると、 フォームから「A2=A1+10」と入力する。A1に5が入っていたとしたらA2に15を入れる。 どうだ?
489 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:27:04 ] 463が説明しようとする度にエスパーが大量に必要になりそうな悪寒 何をどうしたいのか細切れに話そうとしてるからますます判らん w
490 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:28:17 ] ____ /_ノ ヽ、_\ o゚((●)) ((●))゚o ,. -- 、 /::::::⌒(__人__)⌒:::::: / __,>─ 、 | |r┬-| / ヽ | | | | { |__ | | | | } \ ,丿 ヽ | | | | / 、 `┬----‐1 } | | | | / `¬| l ノヽ wwwwwwwwwwwwwwwww \ `ー'ォ / 、 !_/l l / } { \ l / ,' \ ´`ヽ.__,ノ / ノ \ ヽ、\ __,ノ /  ̄ ヽ、_ 〉 ,!、__/
491 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:20:49 ] >>480 数式からEvaluateで戻り値を求めて、その戻り値でフィルターにかけりゃいいじゃん。 それともフィルタオプションで検索条件範囲の1行目を空白にして、2行目に=A2=数式と書きだして抽出するとかね。
492 名前:491 mailto:sage [2009/06/13(土) 16:24:49 ] 俺のエスパー度はマグニチュード7くらいの自信があるから上で間違いないな。
493 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:52:40 ] 463まとめ >>463 >>468 >>477 >>480
494 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 21:30:24 ] >>493 仲間はずれがいるぜ。 >>480 は>>476 だな。
495 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 22:23:18 ] / ノノ ノノノ ヾヽ、ヽ / ノj ` ´ i | i { ` , ,-,、´ i | { i )-―-'( i | ヽ i ⌒ } |_,,,. -‐- 、 __)), ,ノ人 、_, ノ''"´ , \ / ` ー--,. '´ . : :`( ゝ、 / : : :: :´: . : :\ , ' ´_ ヽ / r´: : : : : : ,. ' ´ ヽ>'´ ,'ヽ! / γ: : ノ _ ,, 、,, ,,__i 。 ./ ; ,! i ir' " ヽ ,,, ''' ´ `"7 :/ i |、 ° }, ' ` y' / "'''‐‐- ...,,,_| ヽ、ー/ __ _/ / `'''-,,,て ´  ̄ ̄ / ,イ `''-、__/ / ` / ,! _, `''-,,_ ,..、_,,..イ´ i'´ `ゝ''"´ \_ ,,,,,...ゞ、_ |ー-/ ミ〉 !r'´ ヽ ミ/、 /| i i }