ExcelのVBAに関する質問スレです
前スレ
http://pc11.2ch.net/test/read.cgi/tech/1212587819/ ★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)
>>995 入力文字列の書式が「999-9999-9999」か「9999-99-9999」だけなら、
x = split(入力文字列,"-")
x(0)="(" & x(0) & ")"
debug.print join(x,"-")
VBEってかなりイカスよな。なんていっても使いやすい。 これだけコンパクトに洗練されたIDEってほかにないだろ? しかもお手頃。Excelに最初からついてくるんだぜ。 そんでExcelからマクロの記録とかやれば馬鹿でもチョンでもコードがかけるの。 こんな素晴らしい機能は他に類をみないよね。 もうビルゲイツさまさまってかんじ? ろくにシェルスクリプトもかけないのにわざわざLinuxとか使ってる奴もったいねーw とりあえずビルゲイツさまが提供してくださるOSとソフトウェアを使っていればいいんだよ。
釣りも乙
>前スレ985 ならんぞ。どういうパターンの話? もしかして型変換起こしてるとか?
9 :
デフォルトの名無しさん :2008/08/26(火) 22:43:02
>970 です。 いろいろなことを教えていただきありがとうございます。 ひとつひとつやってみます。 またなにか聞くかもしれませんそのときはお願いいたします。
10 :
デフォルトの名無しさん :2008/08/27(水) 12:59:04
VBAで、構造体をTypeで定義する場合、変数を持たせることができるのは理解しています。 関数も持たせたいのですが可能でしょうか?
クラスじゃだめなの?
12 :
デフォルトの名無しさん :2008/08/27(水) 15:18:29
なるほど、クラスがありましたか! ちょっと調べてみます。
13 :
デフォルトの名無しさん :2008/08/27(水) 22:06:17
シート上の特定の列にオートシェイプを1行ずつ(1セルずつ)表示したりすべて消したりするマクロを作りたいと思っています。 並べて表示させるのはなんとなくわかるのですが、すべて削除するマクロがわかりません。 その列以外にもオートシェイプがあるのでDrawingObjects.Delete は使えないと思いますし、 マクロを記録しながら、オブジェクトの選択を選んで消したい箇所をドラッグしてDELしても ActiveSheet.Shapes.Range(Array("AutoShape 260", "AutoShape 261")).Select Selection.Delete とオートシェイプの番号を指定して削除しているのでマクロには使えなさそうです。 マクロで使えるオートシェイプの削除方ってありませんか?
key使えばよくね
15 :
デフォルトの名無しさん :2008/08/27(水) 22:50:39
座標をセルの幅と高さから計算してとりあえずシェイプの作成はできるよな。 んで作成時にkeyプロパティに座標(行,列)を文字列で格納しておくんだ。 あとはActiveSheet内のシェイプを走査して、特定の座標のシェイプを指定 して削除できると思うよ。 ActiveSheetの行or列orセルが削除されたらシェイプのkeyプロパティに格納 されている座標を更新する処理を加えれば完璧じゃね?
17 :
デフォルトの名無しさん :2008/08/28(木) 20:54:48
ページの書式設定をVBAでやると遅いですよね。 ExecuteExcel4macroでやると速いんですが、 書式が通常と全く異なるので記述が難しい。 順番が決まってるし、""で囲む部分とかどうやったら良いのやら。 誰か上手いこと解説して下さい。
18 :
デフォルトの名無しさん :2008/08/28(木) 22:37:59
subとfunctionについて教えてください。 何度も同じ処理をcallする場合に、処理を記述するのは、 sub と function、どちらにすべきでしょうか。 引数無しの記述なので、どちらで記述して呼び出しても同じ結果が出るのですが、 正しい使い方を覚えたいと思います。 よろしくお願いします。
戻り値があればFunction、なければSub以外にやり方があるのか?
subがいいよ
初めての投稿です。よろしくお願いします。
Excel でコンマおよび引用符を区切り文字としてデータをテキスト ファイルにエクスポートするマクロ
http://support.microsoft.com/kb/123183/ja 上記のようなマクロを求めています。
例えばexcel上に、
1 2 3
4 5 6
という表があれば、
"1","2","3"
"4","5","6"
というテキストファイルに吐き出したいのです。
例では、囲い文字='"' 、 区切り文字=',' としましたが、両方とも簡単に変更出来るとなお良いです。
どなたかとっかかりでも良いですからアドバイスを下さい。よろしくお願いします。
>>21 釣りじゃないなら、「名前をつけて保存」のcsvを飽きるほど試してみるんだ。
>>22 回答ありがとうございます。
保存形式にcsvを選べばカンマ区切りのテキストファイルが得られるのは知っていますが、
それでは囲い文字までは指定できないと思います・・・。
それとも私の知らない機能があるのでしょうか?
セルが文字列なら括られるべ。
>>24 セルの書式を文字列に変更してcsv形式で保存しましたが、
""で括られることはありませんでした。ごめんなさい。
ちなみにセルの内容自体を"1"などとしてcsvで保存すると、
なぜか"が増えて"""1"""となってしまいます。
EXCELの機能のみで実現できるのならばそれにこしたことはないのですが、
色々調べた結果、これはマクロを組まなければ実現できないみたいなんです。
どうか、マクロを使った方法を教えていただけないでしょうか?
私の足りない頭では、まずベタにcsvで吐き出した後、
テキストエディタを使って正規表現で , や先頭を置換していく方法しか分かりません。
1ファイルだけならそんなに手間はかかりませんが、大量のファイルを処理したい場合、
マクロを使えたら便利だと思い質問させて頂いてます。
26 :
24 :2008/08/29(金) 10:46:51
ありゃ、ダメだっけ。そりゃ失敬。 んじゃ、1を'1にしたらどう? # つーか、理由が判らんから喰い付きが悪いんじゃないだろか。
>>26 >んじゃ、1を'1にしたらどう?
書式を文字列にしたのと同じ結果で、""では括られませんでした。
># つーか、理由が判らんから喰い付きが悪いんじゃないだろか。
理由をお話ししますと。
仕事上、囲い文字付きのcsvファイルを良く扱うんです。
それはoracleデータベースから吐き出されたテキストデータなんですね。
"00","123","789"
"01","456","098"
上記のような形式のものです。
それを修正する時、テキストエディタで直接編集するのが難しい場合、
一旦excelに読み込ませてexcel上で編集するんです。
そのデータを再び上記のような形式に保存し、データベースに取り込むということをするんです。
その際、単にexcelでcsv形式で保存すると、囲い文字""が無くなってしまいます。
囲い文字""がないとうまくツールでデータベースにロード出来ないので困っているわけです。
単にただのcsvから囲い文字付きcsvに変換したいなら、
そのようなシェルスクリプトを作るなり、手動で置換するなり出来るのですが、
今回excelを使用しているので、マクロを使って自動化することに挑戦したいのです。
ヒントでもリンクでも構いません。とっかかりをどなたかご教示願います。
>>27 ファイル保存のコードを流用しているみたいですけど、すべての値を'"'で囲んで、,'で連結してファイルに書き出すコードを書けばいいですよ
囲い文字や区切り文字は変数にしとくと変更も簡単にできます
会社として問題がないならファイルを経由せずに直接DBを更新するとよいかもしれません
「excel oo4o」とかでぐぐれば参考ページが出てきたと思います
29 :
デフォルトの名無しさん :2008/08/29(金) 12:55:59
シート上のセルではなく、プロシージャ内で宣言したRange型変数の書式を 組込ダイアログボックスから操作することは可能でしょうか? やりたいことは、 [書式]>[条件付き書式]で表示されるダイアログの [書式(F)]ボタンをクリックしたときの動作を自作フォーム上で再現したいです。 よろしくお願いします
Excel2003からOutlook20033の 予定表に書き込む事はできます でしょうか。 予定をExcelでガーッと書いて、 ポチッとOutlookに流し込みたいです。 MS Exchange serverを使ってます。 VBAについては初心者で、 「Excel Outlook VBA 予定」等でググってみたのですが 見つける事ができず・・・ もしサンプルコードがあればそれをもとに勉強させていただきたいと思っています。
32 :
デフォルトの名無しさん :2008/08/29(金) 21:38:52
エクセルスレから移動してきました。 【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2003 【3 VBAが使えるか .】 多少 【4 VBAでの回答の可否】 可 【5 検索キーワード 】 シート作成 ファイル名 付与 原本となるブックがあり それを元に Book1 Book2 Book3 Book4 ・・・ と任意の数だけブックを任意のフォルダに作成し かつブック名に日付(8月1日、8月2日・・)と付けて作成する方法を 教えてください。 参考になりそうなサイトでも構わないです。 よろしくお願いします。
>>31 あぁ!?そうなんですか!?
ほかのバージョンではできるんでしょうか?!
かいかえようかなぁ・・・
34 :
y :2008/08/29(金) 22:05:49
>>32 「FileCopyステートメント」で検索してみてください。
35 :
y :2008/08/29(金) 22:39:09
>>29 「プロシージャ内で宣言したRange型変数の書式」とありますが、
宣言された時点でのRange型変数は、まだどこのセルを指すか
決まっていないため、書式を設定することはできません。
Range型変数に任意のセル範囲をSetした上で、そのセル範囲の
条件付書式の書式をVBAで設定する方法を、ということでしたら、
まずは条件付書式設定の作業を「マクロの記録」(
>>1 ★6)を
使ってコード化し、「Selection」となっているところを任意のセル範囲
に対する操作になるよう書き換えてください。そうして出来上がった
コードを、自作フォーム上のコントロールのイベントプロシージャから
呼び出すようにすれば、自作フォームから操作できます。
始めに「組込ダイアログボックスから操作する」とあり、
後で「自作フォーム上で再現したい」とありますが、
組み込みダイアログボックスと自作フォームは別物です。
おそらく「自作フォーム」のつもりだと思いますが、
混同しないよう気をつけてください。
>>32 マクロを記録して、やりたいことやってみろ
>>33 そもそもOutlook20033なんてない。
Excel20033はあるよ
39 :
y :2008/08/30(土) 21:14:32
Outlook20033の検索結果 5 件中 1 - 5 件目 (0.39 秒) Excel20033の検索結果 8 件中 1 - 8 件目 (0.15 秒)
うちはExcel2003.3だけど
【1 OSの種類 】 WindowsXP 【2 Excelのバージョン 】 Excel2000 【3 VBAが使えるか 】 皆無 【4 VBAでの回答の可否 】 可 【5 検索キーワード 】 VBA プログラム 現在VBAを勉強し始めたばかりなのですが、9/1までに提出しなければいけない問題があり困ってます。 丸投げとなってしまうのですが、もしよろしければお知恵をお貸しください; EXCEL名:テンプレート Sheet名:[Sheet1][Sheet2] CommandButton:[Cmd] 補足:三行目以降にデータが入っている。 ACCESS名:ユーザー テーブル名:T_TOUROKU フィールド名:[No.][Name][Adr][Tel] 補足:データは数百件入っている。 SELECT文があるとまとめやすいようです。 VBAのDAOを使用して、テンプレ−ト上の[Cmd]ボタンを押すと、 @Sheet1のCell(B)列に書かれた内容と[Name]を比較、 A一致すれば次にCell(A)列と[No.]と比較し,変更のある箇所をSheet1の内容へと更新。 B見つからなければ、新規として追加する。 C又、変更があったものは[Sheet2]へコピーもする。 簡潔に言えば、 名前を主キーとして、EXCELの内容をACCESSへ書き込み・更新をして変更ログを Sheet2へ書き込みたいのですが、自分の知識ではどのようにコーディングすればいいのか 全然判らないので、よろしくお願いします。。。
>>42 >>1 ★5
「なつやすみのしゅくだい」はじぶんでやりましょう
ぎりぎりまで放っておくのが悪い
45 :
デフォルトの名無しさん :2008/08/31(日) 08:56:12
グループ化されたオートシェイプを解除して テキスト変更して再グループをして終了させたいのですが これだとその都度グループ番号が変わっちゃって使えません><; 他にいい指定方法ありませんか? ActiveSheet.Shapes("Group 526").Select Selection.ShapeRange.Ungroup.Select ActiveSheet.Shapes("Rectangle 101").Select Selection.Characters.Text = "ほげ1" ActiveSheet.Shapes("Rectangle 126").Select Selection.Characters.Text = "ほげ2" ActiveSheet.Shapes("Rectangle 127").Select Selection.ShapeRange.Regroup.Select Selection.Characters.Text = "ほげ3"
46 :
デフォルトの名無しさん :2008/08/31(日) 10:28:55
47 :
y :2008/08/31(日) 11:07:20
VBA経験が「皆無」という生徒に、ExcelVBAでDAOを用いMDBに接続してデータを取得・更新する、
という課題は荷が重すぎるような...。
>>42 の学校ではどういうカリキュラムでVBAを教えているのか
わかりませんが、最低限その課題を解くために必要な授業を受けるか、必要な説明が書かれた
テキストが配布されているなら、とにかくそれらを参考に自分で何かコードを書いて、
再度質問してみてください。
んな、難しいもんでもないような。 1日ぐぐって、サンプル試すだけでできるようなるっしょ。
>>47 あんた優しいな。
経験皆無なわけないじゃん。
>>42 が授業聞いてないだけだよ。
50 :
y :2008/08/31(日) 11:48:33
>>45 GroupItemsプロパティから、そのグループに含まれているすべてのシェイプのコレクションを取得できます。
グループを解除する前に、その情報をCollection型変数にでも保管しておいて、
それぞれのテキストを書き換えた後、その情報をもとに再びグループ化すれば、グループ名を使わずに実現できます。
>>48 ,
>>49 情報系の学生で、ちょっとでも他の言語の経験があれば何とかなるかも
あとは
>>42 の頑張り次第ですね。
参考書とか期限みたら意味ないことくらいわかるでしょ コードくれよ
納期〆切寸前の苦しみを自力できりぬけんのが一番の経験だからな。 おまえのことをおもって、今後誰もレスをせんだろうな。
yウゼー
54 :
y :2008/08/31(日) 13:46:53
>>41 それについて私も気になってました。
>>16 に書いてある方法を自分でも
調べていたんですが、シェイプに「keyプロパティ」ってあるんでしたっけ?
オブジェクトブラウザで探しても見つかりません。
55 :
45 :2008/08/31(日) 15:17:38
質問を変えます。 複数のグループ化されたオートシェイプのうちの一つを指定するのに ActiveSheet.Shapes("Group 526").Select のようにではなく、例えばRange("B5")の上に掛かってるグループを指定する、 というような方法はありますか? シートもどんどん複写して使いますので名前やインデックスだと手に負えない気がします。
コテつけてくれてるんだから見たくない奴はNG指定しろ それすらできないなら文句言うな
>>16 >>54 keyプロパティはないけどidプロパティでシェイプを特定できるから、(id,座標)のような配列や
コレクションを用意しておいて座標<->シェイプの関連づけをすれば解決するんじゃないかな。
>>55 TopLeftCell プロパティとか BottomRightCell プロパティを利用するのだと思います
Excel.Excel.Excel
顧客名簿を作ったのですが、2000件近くなり電話番号で検索できるようにしたいと思っています で、ユーザーフォームで「電話番号入力」欄を作り、そこに電話番号を入れて「検索」ボタンを押すと、 電話番号が一致した「顧客名」、「住所」を同じユーザーフォームに表示するようにしたいのですが、 どんなコードを使うと良いのかヒントを教えていただけませんか? シートには、 A B C D 顧客名 電話番号 住所1 住所2 1 あいだ 090xxxxxxxxx 東京都 杉並区 2 いとう 080xxxxxxxx 北海道 札幌市 という風に記入しています B1の電話番号「090xxxxxxxx」を「電話番号入力」欄に入れて「検索」ボタンを押すと 「顧客名」 あいだ 「住所1」 東京都 「住所2」 杉並区 という風に表示できるようにしたいのです。 Excelは、2000 OSは、Winddows XP SP3です
いちおうユーザーフォームを使って形だけは作って、 「検索」ボタンを押すと該当するデータがない場合にメッセージが出るようにはしたのですが、 そこから先が(というか、ほとんど進んでいないのですが)見当がつきません
Findで電話番号を検索して行位置を取得 あとはCellsでデータを取ればいい
64 :
デフォルトの名無しさん :2008/09/02(火) 18:47:07
ChDir ThisWorkbook.Path Chdrive ThisWorkbook.Path とやって作成した奴を 他人のPCで実行させても同じフォルダ内のファイルを探せなくてエラーが出ます。 デスクトップのフォルダで動作させても msgbox ThisWorkbook.Pathでは〜¥Tempとなっています。 ユーザー設定のカレントは空白にしても変わりません。 XPの2003で作成し、会社の2007では動作しましたが他のPCのXP、2003で発生します。 どのように対処すべきですか?
日本語でおk
66 :
64 :2008/09/02(火) 22:13:35
要は、デスクトップで起動させたブックのThisWorkbook.Pathが なぜ関係ないC:\〜¥〜¥Tempになってしまうのか?ってことです。
67 :
デフォルトの名無しさん :2008/09/02(火) 23:44:42
>>64 OfficeXP・2003からOffice2007にアップグレードすればおk
68 :
デフォルトの名無しさん :2008/09/03(水) 19:41:38
EXCEL2007です。 以下のコードで、実行時エラー1004「アプリケーション定義または オブジェクト定義のエラーです」になります。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim o16 As Integer Dim o1 As Integer Dim rgbnum As Integer r = Target.Row c = Target.Column 省略 rgbnum = o16 * 16 + o1 Range(Cells(r, c - 1), Cells(r, c - 1)).Value = rgbnum ←ここでエラー End Sub
cがゼロになってるとか
cがゼロじゃなくて、cが1だからCells(r, c - 1)が存在しないとこを参照してるってことね
71 :
デフォルトの名無しさん :2008/09/03(水) 23:46:30
VBAを1週間前から勉強していて、すごーく簡単なプログラムは作れるようになったのですが、 いまいち理解しているのかどうかがわかりません。 勉強の仕方はネットで調べながら・・・なのですが、 みなさんはどのように勉強してましたか? 課題をもらえるとやりやすいのですが、一人でやってると自分が何をしているのか わからなくなります。覚えるコツなどありましたら教えてください。
>>71 興味あるものを作るところから始めたら?
仕事なら、覚えるしかないからかえってそういう事を悩まずにすむけど。
>>71 おれはシューティングゲーム→ギャルゲー→RPGと作って
無駄な時間をすごした。
俺はVB→ExcelVBAだったから特に勉強とかしてないけど、 VBは最初はいろんな小物ツールとかつくって覚えたなぁ。
ExcelVBAだったらExcelオブジェクトを理解することが重要だけど、 VBA全体を勉強したいならWin32APIやWindowsCOMオブジェクト についても勉強する必要があると思うなぁ。 最初はコードが公開されているサンプルを眺めたり流用して何か 役に立つものを作ったらいいと思う。その内にコードが公開されて いないけど実現したい機能とかも自力で作成できるようになるよ。 Officeだったらコードが公開されていなくてもパスワードクラックの ツールがあるからそれ使ってちょっと高度なコードにも目を通すと いいかも。
結局ダジャレかよ
>>71 質問掲示板の「回答者」になるのが良いでしょう。
どの掲示板が良いかは自分で判断して下さい。
別に書き込まなくても良いので、色々な方のコードと自分のコードを比較する事が勉強になる。
78 :
デフォルトの名無しさん :2008/09/04(木) 16:15:58
VBAでオブジェクト指向プログラミングできるの?
79 :
デフォルトの名無しさん :2008/09/04(木) 18:43:38
むしろ、VBAはOO言語だろ
まあOO言語としてはかなり不完全だけど 分類的にはOO言語寄りではあるな
81 :
68 :2008/09/04(木) 19:49:36
>>69 ,70
レスありがとうございます。
cはゼロにも1にもなっていないですが・・・。
82 :
デフォルトの名無しさん :2008/09/04(木) 20:41:23
1つのセルが対象なのにrangeで範囲選択してんの?
いいじゃまいか
84 :
デフォルトの名無しさん :2008/09/04(木) 21:56:37
うーん。出先なんで確認取れないんだけど、 sheets(hoge).range( の形でどうかな? sheet changeイベントで、rangeオブジェクトが保持してるシート名が対象rangeと異なるからエラー出してるとか。 適当だけどw
>>71 体系だった入門書を通読しろよ、糞ゆとりが
cellsに修飾が足りないな、きっと
>>68 cに1が入った場合の処理をしていないから
Changeイベントループして最終的に
>>70 の言う事になってるだけ
88 :
デフォルトの名無しさん :2008/09/05(金) 00:09:51
toggleMerge("A1:A5") という命令でA1:A5の範囲のセルを結合させたり結合解除させたいのですが、 実行させても何も起こりません。エラーすら起こりません。 ばらして同様のことをやるとちゃんと動きます。何が悪いのでしょうか。 以下そのコード Sub toggling(ByRef obj As Variant) obj = Not obj End Sub Sub toggleMerge(ByVal str$) toggling Range(str).mergeCells End Sub
89 :
デフォルトの名無しさん :2008/09/05(金) 00:35:04
スレ違いとは思うのですが助けてください モジュールで有効な変数宣言しようとすると Dimとか打ってたらエラーダイアログが0.2秒ぐらいで6連続くらい連発して打ち切れない Excel2008なんだけど構文チェックスピード早すぎて打てない どうしたらいいのか教えて頂けないでしょうか
>>68 "c"にミスがないのであれば
Sheets(hoge).Range((Sheets(hoge).Cells(r, c - 1), Sheets(hoge).Cells(r, c - 1)).Value = rgbnum
↑のようにしてみてはいかがか
91 :
デフォルトの名無しさん :2008/09/05(金) 00:50:36
>>90 Worksheet_Changeイベントに記述しているから
セルに値を入れる前にイベント発生を止める処理を入れるか
cが0にならないようにする処理を入れないと
Changeイベントが連鎖してエラーになる
質問するのは全然かまわないんだけどさ、質問スレだからな。 でもさ、質問する前に日本語で質問できるようになってから来いよな。 たのむから。
96 :
68 :2008/09/05(金) 08:57:53
みなさん、レスありがとうございます。 cが特定の値の時にしか、 セルに値を入れないようにしたら うまくいきましたm(__)m
97 :
y :2008/09/05(金) 17:45:41
>>88 おやっ、と思うようなコードですね。
たぶん、MergeCellsプロパティの「実体」を、togglingプロシージャに
参照渡しして、そこからプロパティを操作しようと考えたのでしょうか。
偶然かもしれませんが、なかなか珍しい間違い方をしていると思います。
toggling Range(str).MergeCells
というコードは、
@MergeCellsプロパティを読み出した結果得られた値について、
Aその値をtogglingプロシージャに渡す、
という2段階の処理として実行されます。単純に
「MergeCellsプロパティを、togglingプロシージャに渡す」
わけではありません。
Range(str).MergeCells で取得できるのは、プロパティの実体ではなく、
実体を読み出した結果であり、"True"もしくは"False"というただの値です。
この時点で、実体との関係は断たれてしまっているので、
その値をtogglingに参照渡しして、それを反転させても、
プロパティそのものを操作することにはなりません。
プロパティを操作する場合は、次のように直接操作するようにしてください。
Sub toggleMerge(ByVal str$)
Range(str).MergeCells = Not (Range(str).MergeCells)
End Sub
98 :
y :2008/09/05(金) 18:04:43
>>89 何をした瞬間エラーメッセージが出た、というあたりをもう少し詳しく。>93w
>>58 ありがとうございます。やっぱりKeyプロパティはないんですね。
何言ってんだこいつ
100 :
デフォルトの名無しさん :2008/09/05(金) 23:31:49
>>97 どうもありがとうございます。
Boolean型のオブジェクトを渡していたからだったのですね。
でもできれば、汎用的にtoggleプロシージャをつかって実装したいです。
Sub toggle(ByRef obj As Variant, ByVal propertyName$)
obj.propertyName = Not obj.PropertyName
End Sub
という感じです。
そこで、新たに質問なのですが、”.”を使わずにプロパティを参照するには
どのようにすればいいのでしょうか。
たとえば、Javascriptだとobj["PropertyName"]でプロパティ参照できるのですが、
VBAには類似の呼び出し方法は存在しているのでしょうか。
101 :
デフォルトの名無しさん :2008/09/05(金) 23:43:02
102 :
デフォルトの名無しさん :2008/09/05(金) 23:50:31
VBAではインクリメントは a = a+1 と記述するしかないですか? a += 1 a ++ はだめでした。 (下は別言語なので当然ですが・・・。)
hint : overload
A列のセルに入力があればA列の中で同じ入力がないか検索する というマクロを作ろうと思っているのですが、セルの入力判定の方法を教えていただけないでしょうか? 宜しくお願いします。
もっと具体的に
107 :
105 :2008/09/06(土) 07:39:52
説明が抽象的になってしまいすいません。 A列からF列までそれぞれの列に情報を入力してリストを作っているのですが、 既に何百行も情報を入力していて、都合上同じ情報を追加で入力してしまう恐れがあり、 現在は毎回入力の前にCtrl+Fの検索で既に入力された情報かどうか調べています。 そこでA列のセルに入力があれば入力されたセルより上の既に入力された全てのセルの文字列と比較して、 既に同じ入力があればエラーメッセージを出すというマクロを作りたい次第です。 マクロを作成するにあたって、「A列に入力があれば」という部分をどう書けばいいかわからなかった為質問させていただきました。 A列に同じ情報が入力されるという事は都合上絶対に有り得ない事なのでA列のセルを比較しようと考えています。 ・A列には1行目から空白なく順番に情報が入力されている。 ・新規に入力する際は現在のリストの最終行の次の行に情報を入力している。 という条件があるので、A列に入力があればというよりA列の最終行の次の行に文字が入力されればという方が正しいかもしれません。 説明が下手で申し訳ありません。 宜しくお願いします。
>>107 Worksheet_SelectionChange
リアルタイムのイベントハンドラかぁ・・・。 VBAって自分でイベントの作成は出来るのかな。あまり詳しくないんで分からないや:( 若干重くなるけど、sheetのchangeイベントで、セルを移動した時に、A列の最終行の内容と同じ物をチェックするとか。 うーん・・・あまり美しくないよね。 自分でイベント作成出来るのか、私も知りたいです。 詳しい人お願いします。
111 :
105 :2008/09/06(土) 14:30:52
>>108 ,109
アドバイスをくださってありがとうございます。
参考にマクロを組んでみようと思います。
>>107 重複データがあるかないかを調べるだけでよければ
VBA使わなくても条件付き書式でできる。
113 :
デフォルトの名無しさん :2008/09/06(土) 16:14:55
Excelの VBA の関数の呼び出し方法が分かりませんので、誰か教えて戴けませんでしょうか? C では // 関数の定義 void abc(void) // メインルーチン void main(void) { // 関数名 abc(); } void abc(void) { --- } 上記の方法で関数を呼び出そうとして、 Sub 名前() abc() End Sub :abc() --- return 上記記載の方法では動きませんでした。 素人な問い合わせで申し訳ありませんが宜しくお願いします。
関数なんだからなんらか値を返す 仮にintegerの型でパラメータを受取ってintegerの何かを返すとして Sub 名前() Dim a as integer Dim param as integer param=100 ←何かの数字(integerの範囲内) a = abc(param) End Sub Function abc(param as integer) as inetger 〜 abc = **** ←何か処理した結果のintegerの数字 End Function
115 :
デフォルトの名無しさん :2008/09/06(土) 17:04:48
<<114 113 です。早速のお教え有難う御座います。 なんらか値を返す様に変更します。
>>113 のCのコードを何も考えずにVBAにするとこうだぞ。
Sub main()
Call abc()
End Sub
Sub abc()
---
End Sub
戻り値の型がvoidの関数はSub、それ以外はFunction。
戻り値を受け取らない場合、Sub/FunctionにかかわらずCallを付ける(Call使わない記法もあるけど)。
117 :
デフォルトの名無しさん :2008/09/06(土) 17:30:42
>>116 113 です。いろいろお教え戴き有難う御座います。
この方法が簡単なので採用させて戴きます。
118 :
デフォルトの名無しさん :2008/09/06(土) 18:07:40
>>114 >>116 113 です。プログラム作成途中ですが、両方とも必要になりましたので、
共に採用させて戴きます。いろいろと、有難う御座いました。
関数は、なんらかの値をかえすべきであるという考えた方が 身に染み付いてるから、SubとVoid関数は非常にきもちわるい。
要するに時代遅れですね
かえり値もたない関数は、デバッグがむずかしくなるから、医療系の俺の会社じゃ よほどのことがないかぎり作らない。むしろ121がしろうと
>>122 VBAスレで恥ずかしい事いうなよおっさん。
LispとかMLでの話なら
>>120 >>122 も分かるが、
VBAで純粋関数型プログラミングは無茶があるだろ、常識的に考えて。
125 :
89 :2008/09/07(日) 03:31:47
むっちゃ早く打つ案に似た解決策で自己解決しました。 必殺コピペです。 グローバルエリアに変数定義しようとしたらDimと打った時点でエラーメッセージが頻発 変数書こうとしても打っている途中でメッセージ頻発して書けない。 どこかにエラーチェックのタイミングプロパティがあると思うがコピペで解決したから諦めようかと思います
そういや、functionしか存在しない言語もあるな。
よくいるんだよね。VBにしかVariant型がないと思ってる自称上級者
ファイルを開かずにアクティブシートを変更するにはどうしたら良いでしょうか。 AccessのTransferSpreadsheetでエクセルの任意シートへデータを出力していますが、 エクセルファイルを開いた時に、値を出力したシートがアクティブになっているようにしたいのです。
129 :
128 :2008/09/07(日) 14:30:04
ついでに読み取り専用属性の操作もできればサイコーです
please tell ass in Japanese... Sheets("hoge").Activate Sheets("hoge").SaveAs "c:\hoge.xlsx", xlWorkbookNormal, , , True
131 :
128 :2008/09/07(日) 15:15:51
えー、ファイルを開かない状態でアクティブシートを変更したいのです。 そのやり方だとインデックスエラーになっちゃうんですけど。
Excelオブジェクト生成 ファイルオープン(非表示) シートをアクティブにする 保存
ここっていちいち一から百まで説明しないといけないから疲れるな 結局ファイルを開かなきゃいけないってことですね。どうもありがとうございました。
偉そうに言ってますな w
そりゃそうだ。エスパーなんてここにはいない。
ここの奴らほとんど、ろくな知識も無いのに 知ったか振っててうざいんだもん これぐらい言わせなよ
うわぁ・・・低脳すぎて煽るきにもならない
138 :
128 :2008/09/07(日) 15:52:01
あと別におまえらがエスパーである必要はねーけど 言われた事から、相手がなぜそうしたいのか、ではどういう方法が適切かくらい想像しろよ、と思うね おまえら自分の知ってることが唯一の回答であるようにこじつけてるだけだろ。 そういうのをバカの一つ覚えって言うんだよ。 でも回答ありがとう。じゃね。
っていうかxlsファイルを開くのとExcelのGUIを開くのを同じことだと思っている低脳っているんだね
じゃあ書くなよウスノロw
うわぁ・・・ひどい池沼ですね・・・
日本語で質問できるようになったら書き込みしような。
高卒とかFランは書き込みできないようなフィルタかけてくれよ
盛り上がってますね
>>133 最低限1から5くらいまで説明しようぜ。
俺らお前のお母さんじゃないんだからよ。
というより、 出来ないことは出来ないと説明した上で代替案を示すなら ここまで荒れないと思うのだが。 条件に反することを回答するからこうなる
>>145 えっ?
>128を1から5くらいの説明で理解できるのか?
最近のお母さんてスペック高いんだな!
OBJ.FileOpenは知ってたけどコードがごちゃごちゃするから嫌いなのよ。 他にもっとシンプルなやり方が無いのかな、って思っただけ。
>>147 非表示だけど、ファイル開いてるからNGだろ。
想像力のない俺からすれば、元の質問自体がNGだけどな。
変な知ったかいいわけ始めたぞ
ファイル開かずにファイルを変更するなんて方法があったら俺が知りたいな
128ってそんなに難しいか まさかとは思うがプログラム板なのにAccessのVBAを知らん奴がいるのか
簡単だぞ。質問がヘタなだけ。で質問の答えに対して実装できるスキルもないだけ。
要するに低脳というわけですね。分かります。
盛り上がってますなあ
157 :
128 :2008/09/07(日) 16:38:58
結局お前らAccessVBAが理解できなかっただけ佳代w 低能エクセル厨乙w
スレタイ100回音読してみろ。 それから自分の質問と回答を100回音読しろ。
下手な釣りだなあ。次の質問どうぞ。
excel vba 極めたいのですけど お勧めの参考書はありますか?元制御系プログラマで プログラミングの基本は充分できています。 技術評論社のポケットリファレンスはどうですか?
便乗質問・・・。 win32APIを勉強したいのですが、お勧めの本ってありますか? 使用目的はExcel VBAで呼び出す事です。
Excel VBAによるWin32 APIプログラミング入門 (単行本) ぐぐることも出来ないの?
質問者も回答者もバカが多いな
お前ほどじゃないがな
だな
157 名前:128[] 投稿日:2008/09/07(日) 16:38:58 結局お前らAccessVBAが理解できなかっただけ佳代w 低能エクセル厨乙w こいつリアルでもこんな感じなんだろうな
>>162 マジレスするとWin32APIの為に本を買うのはもったいない。
MSDNとネット上のAPIサンプル集とかで十分。
笑!
173 :
y :2008/09/08(月) 20:21:47
>>169 セルB1にあるアドレスを、セルA1にハイパーリンクとして埋め込むのは、
次のようにすればできます。
Sheet1.Hyperlinks.Add Anchor:=Cells(1, "a"), _
Address:=Range(1, "b"), _
TextToDisplay:=Cells(1, "a").Value
(マクロの記録を使って、ハイパーリンクを埋め込む動作を記録してみれば簡単です)
これをループで括って、「1」となっているところ(これは行番号にあたります)を
変えていけば、お好みの行数分操作できます。
174 :
y :2008/09/08(月) 20:25:13
> Range(1, "b") ?
176 :
y :2008/09/08(月) 20:29:41
さらに自分のレスの間違いに気づきました。 Address:=Range(1,"b") → Address:=Cells(1,"b")
177 :
169 :2008/09/08(月) 21:03:00
>>173 マルチ悪かった。
ツール→マクロ→VBA→標準モジュールに保存した後、
マクロ実行してみたけどできません。
初心者なんでもう少し詳しく教えていただけませんか?
178 :
169 :2008/09/08(月) 21:54:01
1行だけできましたけど、 行数分操作ができません。 Cells(1, "a"), 1の部分の範囲指定はどうすればいいの?
179 :
169 :2008/09/08(月) 21:55:21
できればセルを範囲指定して、マクロ実行で 一括で変更できると助かります
ググレ
>>180 いろいろ調べてもわからねぇよ
質問スレなんだから聞いてるんだろ。。意地悪しねぇで教えろよ。
その気がないなら返信するな
モーグでも行けよ池沼
で、また169が暴れるのか?
187 :
デフォルトの名無しさん :2008/09/09(火) 01:33:11
XMLファイルをVBAで扱いたいんですけど、そういった方面を勉強できるような書籍はないでしょうか。 「XML入門」みたいな本はたくさん見るんですけど、あれって具体的なコーディングについては記述が無いorごく少ないですよね。。。 あってもPHPとかばっかりだし。。。
書籍があってもバカじゃどうしようも無い まともな頭があればVBAでCOM(XMLDOM)使ってXML扱うくらい、 ネットの情報だけで事足りる
189 :
デフォルトの名無しさん :2008/09/09(火) 10:31:32
あるセルからあるセルまでソルバーを使うということをやりたいのですが、 ↓のを作ったのですが、出来ません。どうすればいいですか? SOLVERの参照設定はやりました。 Sub Macro1() Dim x As Integer For x = 1 To 5 Range("Cells(x, 3)").Select SolverOk SetCell:=Cells(x, 5), MaxMinVal:=3, ValueOf:="0", ByChange:=Cells(x, 2) SolverSolve Userfinish:=True Next x End Sub
190 :
y :2008/09/09(火) 19:35:50
>>177 173の後半を、もう少し具体的に書きます。
まずループ用の変数rを宣言し、ここでは例として
For 〜 Next間を5回繰り返すループを示しておきます。
Dim r as Long
For r = 1 to 5
Sheet1.Hyperlinks.Add Anchor:=Cells(r, "a"), _
Address:=Cells(r, "b"), _
TextToDisplay:=Cells(r, "a").Value
Next
繰り返しのたびに、rは1, 2, 3, 4, 5と変化していくので、
上のコードでは1〜5行目に対する操作が行われることになります。
初心者の方なら、「VBA デバッグ」などで検索してみて、この過程を
一つ一つ目で確認する方法を身につけると、上達が早くなります。
For r = Inputbox("開始行?") to InputBox("終了行?")
とすれば、処理をしたい行の範囲を簡単に指定できますが、
もっと便利にしたければ、自分でも他の方法を色々調べてみてください。
質問する時は、どんなに間違っていてもいいので、とにかく何か自分なりに
調べて考えたコードを貼って、それに対するアドバイスを求めた方がいいですよ。
181のようなことを書くと、
>>1 の★5にあるように、「また丸投げか」と
怒りを買ってしまいます。
191 :
y :2008/09/09(火) 20:01:47
>>189 マクロの記録を使って、ソルバーでやりたい作業をマウスでやってみて、
どんなコードが記録されるか確かめてみてください。(
>>1 ★5)
189のコードについては、
@単純な構文ミス Range("Cells(x, 3)").Select → Cells(x, 3).Select
A目的セルをどこにしたいのか、可変セルをどこにしたいかが不明
です。特に、Aが分からないとアドバイスができません。
192 :
y :2008/09/09(火) 20:03:56
>>190 ご親切にありがとうございました。
勉強になりました
>>191 すみません
目的のセルがCells(x, 5)で、可変セルがCells(x, 2)のつもりでした。
で、@のやつをやったら出来ました。
ありがとうございました。
195 :
デフォルトの名無しさん :2008/09/09(火) 22:50:31
VBA初心者です 何か作ろうと思うのですが…自分では思いつかないので… 何か問題お願いします。
>>195 このスレを集計してyの貢献度を調査せよ。
197 :
195 :2008/09/09(火) 23:04:59
198 :
デフォルトの名無しさん :2008/09/09(火) 23:34:22
式を教えてください。 A列には文章が入っています。 B列には文章に含まれる単語、C列にはコード番号が入っています。 それぞれ数百〜数千行になります。 A列にはB列の単語のいずれかが含まれる場合には、 単語に対応するC列のコードをD列に表示させたいのですが、 どのような式がよいでしょうか。 VLOOLUPやFINDなどを組み合わせてみても上手くいきません。 お手数ですが、どなたか至急お教え願えますでしょうか。
199 :
デフォルトの名無しさん :2008/09/10(水) 00:31:40
具体的なセルの中身教えろよ このスットコドッコイ
200 :
デフォルトの名無しさん :2008/09/10(水) 07:26:43
A列…デフォルトの名無しさん、具体的なセルの中身教えろよ、このスットコドッコイ B列…デフォルト、セル、スットコドッコイ C列…E46194、H23t55、342421
ここはExcel VBAのスレです
202 :
デフォルトの名無しさん :2008/09/11(木) 00:16:48
XPでExcel2003です c:\aaa 配下にある全てのファイルとサブフォルダを c:\bbb 配下に全てコピーする事は可能ですか? また、サンプルコード等ありましたらヒントを頂けると助かります 色々と探してはいるのですが、いまいちピンとこないので サンプルがあると助かるのですが、、、、 VBAはまだまだ初心者なので未熟者で恐縮です。
たまにmougヲチするんだけど、痛い回答者が多いのね。
シートにコンボボックスを貼り付けて AddItemで追加した後にシートを Xボタンを押して閉じようとすると 変更を保存しますかと聞かれるんですが このチェックを外す方法ってあります? OSはXPでExcel2003です。
206 :
y :2008/09/11(木) 20:15:03
>>198 文章中の、特定の単語の有無の判定なら、たぶんInStr関数で何とかなると思います。
調べてみて使えそうなら使ってください。
>199にもありますが、具体的なデータが分からないとアドバイスしずらいです...
207 :
y :2008/09/11(木) 20:17:20
>>195 どんな業界で働いている方か分かりませんが、
実務に役立つ知識が増すようなテーマを選ぶと、
何かと都合がいいのではないでしょうか。
為替、株式市況、地価、青果水産物市況など、
ネット上にはたくさんの生データが公開されています。
それらを自動的に取得し、テーマに沿って演算し、
レポートを出力するマクロを組むだけでも、
相当勉強になると思います。
やるのであれば、日々刻々と変化する数字の方が面白いです。
例えばある人は、東京に10数箇所ある中央卸売市場の毎日の市況データを
取得し、各市場の卸売価格差をグラフに出力するマクロを作っていました。
仲買業者なら、どこの市場で買い付けをすれば一番安いか、
逆に生産者なら、どこの市場に出荷すれば一番高いか、
一目で分かるというものです。ちなみに彼は商社に勤めていますが、
似たようなことをしている人は結構いるでしょう。
Excelは基本的にデータ処理の道具なので、何を試すにしても、
まずは題材になるデータを見つけてこなければなりません。
ならば自分が、分析対象として最も興味を覚えるデータを選ぶのがベターです。
その上で、自分のスキルに応じた試行錯誤をしてみればいいと思います。
仮に「VBA解説書に載っている多機能な家計簿を作るんだ」と決意したとして、
自分で小遣い帳をつけているほどの人ならともかく、付属CDに入っている
仮想データを使って作っていくようなやり方は、モチベーションが湧きづらい
ように感じます。
208 :
デフォルトの名無しさん :2008/09/11(木) 22:02:38
あれ今日y絶好調だな
yには、人生相談にすら答えてくれそうな勢いを感じる
212 :
y :2008/09/12(金) 20:05:30
>>205 「シートを Xボタンを押して閉じようとすると」とありますが、
シートに×ボタンはないので、たぶん「ブックを」のつもりでしょうか。
「変更を保存しますか」というメッセージは、ブックを保存した直後の状態であれば
表示されません。この状態は、WorkbookオブジェクトのSavedプロパティをTrueに
することで、強制的に作り出すことができます。
ブックが閉じられる直前に、その操作が自動で行われるようするためには、
ThisWorkbookオブジェクトのコード領域にBeforeCloseイベントを挿入し、
その中でSavedプロパティを操作します。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub
うざいな
215 :
205 :2008/09/12(金) 22:35:11
なるほど。Savedプロパティですか。 ありがとうございました。
確かにうざいわ
217 :
y :2008/09/13(土) 02:54:40
・・・
何コイツ
煽りなんか気にすんな。
未だに169が粘着してる
まぁ、2chではあまり見ないキャラであることは確かだな。 嫌ならNGしとけ。
凄い粘着だな。。。おい。
マクロなんですけど、行挿入のマクロを作りたいんです。 だけど、挿入する行をセルの値から指定したい場合はどうすればよいですか? 例 B2 = 3 3行目と4行目の間に行挿入をするようB2をつかってさせる。
Dim i As Integer i = Range("B2") Rows(i).Insert
これだけでもいけるな Rows(Range("B2")).Insert
229 :
y :2008/09/13(土) 16:13:47
・・・
yそろそろコテにしたら?なりすましが出るくらい名が知れてきたんだからさ
yがコテじゃなかったら何だと言うのだ
トリップつけたら?ってことじゃね?
いい加減、yの話題やめろよ
うざすぎ
エクセルのシートに画像をドラッグした時に、指定場所に指定のサイズに変換したいのですができますか? また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?
> エクセルのシートに画像をドラッグした時に、指定場所に指定のサイズに変換したいのですができますか? 「シートに画像をドラッグした時に」というイベントが用意されてないから、 「ドラッグした」ら自動で処理するってのは無理 「シートに画像をドラッグしてからボタンを押したら」なら可能だが > また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか? 可能だがExcelでやるべきことじゃないな Excelでやるってことは、Excelとその警告マクロを作ったブックを立ち上げてないと警告文出ないわけだし やるとすれば、「n日前」ではなく、「n日前以降、最初にExcelを立ち上げたとき」という条件になるかな
前者:できない 後者:できない
EXCEL関数についてお教えください あいうえお(abc) かきくけ(ほげほげ) さしすせそたちつ(nekdk) という行がありまして、()とその中の文字列だけを全部消したいです。 ()は全角です。()内の文字、文字数数がことなるので置換が使えないでいます。。
マッチコレクション
>>238 関数ではないけど
ツール→区切り位置で区切り文字を ( にすると
( の前後で別のセルに分かれるからそれではダメかな?
VBAで検索システム的なものを作っています。 行き詰ってしまったので何かアドバイスをいただければと思います。 OSはXPでエクセルのバージョンは2002です。よろしくお願いします。 ブック内に「メイン画面」「情報A」「情報B」という3つのシートがあります。 「メイン画面」のB5セルに会員番号(K_Ban)を入力してマクロを実行すると「情報A」「情報B」から該当の会員番号に関する情報が「メイン画面」の任意のセルに代入されるというものです。 ただし「メイン画面」の形式の都合で、該当する「情報A」のうち、上から3件のみを出力させて4件目以降はカットしています。(下記コード参照) 「情報B」は「種別」という項目があり、「野菜」「肉類」「魚類」…などの分類が30種類ほどあります。 「情報B」についても、各種別毎に3件目以降はカットしたいのですが、行き詰っています。 すなわち、会員番号1について「情報B」は30件あり、野菜25件、肉類5件があるとすると 「メイン画面」には野菜3件、肉類3件分の情報を出力させたいのです。 また、種別については、今後随時変更があるので「種別毎に変数を設定して直接数える」のではないようなコードにしたいと思っています。
Public Sub 検索() Dim K_Ban As String Dim MyRange As Range Dim MyAddress As String Dim cnt As Integer K_Ban = Worksheets("メイン画面").Range("B5") Set MyRange = Worksheets("情報A").Range("A1:A50").Find(K_Ban, LookAt:=xlWhole) MyAddress = MyRange.Address cnt = 8 Do Worksheets("メイン画面").Cells(cnt, 3) = MyRange.Offset(0, 0).Value Worksheets("メイン画面").Cells(cnt, 4) = MyRange.Offset(0, 1).Value Worksheets("メイン画面").Cells(cnt, 5) = MyRange.Offset(0, 2).Value cnt = cnt + 1 If cnt = 11 Then Exit Do End If Set MyRange = Worksheets("情報A").Range("A1:A50").FindNext(MyRange) Loop Until MyRange.Address = MyAddress End Sub
シートの構造書くか、Bookをどこかにアップ
だよな普通
246 :
y :2008/09/15(月) 11:18:44
>>242 |A列. |B列. |C列. |D列. |E列.
01 | 0123456789| .| .| .|
02 | .| .| .| .|
03 | .| .| .| .|
04 | .| .| .| .|
05 | .| .| .| .|
シート内のデータ内容を説明するために、以前こんなテンプレを使っている人がいました。
「情報A」「情報B」シートの中身を、文章で説明するより楽だと思ったら使ってください。
247 :
242 :2008/09/15(月) 13:54:22
>>244-246 以下のようなシート構造で、種別→日付で並べ替えてあります。
A B C D
番号 種別 データ1 データ2
1 肉類 豚肉 20080915
1 肉類 牛肉 20080912
1 肉類 鶏肉 20080801
1 魚類 その他 20080401
2 肉類 猪肉 20080905
2 野菜 その他 20080802
248 :
y :2008/09/15(月) 16:03:53
>>247 Sub Sample()
Dim K_Ban As Long: K_Ban = Worksheets("メイン画面").Range("B5")
Dim r As Long
Dim shubetsu As String
Dim shubetsuCnt As Integer
With ThisWorkbook.Sheets("情報B")
.Range(.Cells(1, 1), .Cells(.Rows.Count, 4).End(xlUp)).AutoFilter Field:=1, Criteria1:=K_Ban
r = 2
Do While .Cells(r, 1) <> ""
If .Rows(r).Hidden = False Then
If shubetsu <> .Cells(r, 2) Then
shubetsu = .Cells(r, 2)
shubetsuCnt = 1
ElseIf shubetsuCnt < 3 Then
shubetsuCnt = shubetsuCnt + 1
Else
.Rows(r).Hidden = True
End If
End If
r = r + 1
Loop
.Range(.Cells(2, 1), .Cells(.Rows.Count, 4).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy _
Destination:=ThisWorkbook.Sheets("メイン画面").Cells(8, 3) '←任意のコピー先セル
.AutoFilterMode = False
End With
End Sub
249 :
y :2008/09/15(月) 16:04:42
上のコードは、条件に合わない行を非表示にしていき、最終的に表示されている行だけを 「メイン画面」の任意のセルにコピーする、という考え方です。デバッガでステップ実行していけば、 不要な行が非表示になっていく様子がよく分かると思います。不便なところは改良してみてください。 なお、データは「種別→日付で並べ替えてあります」とありますが、見たところ「番号→種別→日付」で並んで いますね。上のコードは、そう並んでいる必要があります。 他のやり方を提案する方もいるかもしれませんので、そちらも参考にしてください。
先日行挿入について質問したものです。 C3で指定した値の行に行を挿入して、D3,Fj,D3で与えた値を挿入した行のHi、Fi,Iiに値を入れたいのですが、どこが間違っていますでしょうか、ご指摘お願いします。 Sub Main Rows(Range("C3")).Insert Dim i As Integer Dim j As Integer i = Range("C3") Range("D3").Copy Destination:=Range("Hi") j = i-1 Range("Fj").Copy Destination:=Range("Fi") i = Range("E3") Range("D3").Copy Destination:=Range("Ii") END SUB このように作ったのですが、うまくいきません。
>>250 まず、Range("Hi")というセルの指定のやり方はない
Rangeを使いたいんなら、Range("H" & i )
ほかには、Cells(i, 8)、もしくは、Cells(i, "H")
解説サイトいっぱいあるから基本的とこから少し勉強したほうがいいよ
エクセルの使い方もロクに知らない俺が 今日これからVBAの勉強を力尽きるまでやってみるぜ。 困ったときはお前らだけが頼りだ。
>>251 ご指摘、解説ありがとうございます。
出来る限り自分でやるようにしてみます。
254 :
242 :2008/09/16(火) 23:49:49
>>248 ありがとうございます。
(もしかしたら上級者の方には普通なのかもしれませんが)
自分には全くない発想でした。勉強になりました。
お示しいただいたコードを元に自分でも勉強したいと思います。
そう考えること自体は不思議ではないと思うよ。 現によその言語ではそういうことができるものだってある(Perlとか)。 いずれにせよVBAはそういうことをしないということに変わりはないけれど。
256 :
デフォルトの名無しさん :2008/09/17(水) 01:45:49
ねぇねぇみんな。 Microsoft Forms 2.0 TextBoxだと右クリックしてもメニューが出てこないよね。 出てくるようにしたいんだけど、何かいい知恵あるかな?
すいません、質問です。 1004エラーが出ます。(´Д`; worksheet記述を加えてみたり、色々試してみたのですが消えません。 作りたいものとしては、 A列を縦にチェックして異なる文字列が出てきたら罫線(太線)を引く、 というものです。 突っ込み、お願いします。 Sub test() Dim i As Integer Dim st_flag As Byte Dim range1 As Range st_flag = 0 i = 3 Do While Cells(i, 1).Value <> "" If (st_flag = 1) Then If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium End If Else st_flag = 1 ''最初の1セルは比較をしない End If i = i + 1 Loop End Sub
読むのめんどいからどの行でエラーなのか教えて
259 :
デフォルトの名無しさん :2008/09/17(水) 19:37:16
Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium ↓ Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).Weight = xlMedium
実行時エラー '1004': Border クラスの LineStyle プロパティを設定できません。 これくらいコピペしようぜ
時間の許す限りエラーの内容くらい小一時間考えよう
質問者と回答者よりも講釈師の方がが多いスレ
板全体に言えるわけだが すれ違い甚だしい質問だとか煽りだとか ここはまだまし
>>262 質問者 回答者 講釈師
貴方はどれに該当しますか?
ヌルポ
ポルヌ
268 :
y :2008/09/17(水) 23:26:36
>>254 念のため補足しますが、
>>248 のコードは決して最善の方法ではありません。
合致する会員番号でふるいをかけ、その中から種別ごとに最大3つまでの
アイテムを取り出していく取捨選択の過程を、視覚的に理解するために利用してください。
仕組みが単純なので、コードが短くて済むというのが唯一の利点ですが、
マスタデータの行の表示・非表示を切り替えて実現する「検索システム」というのは、
>255でも指摘をいただいていますが、普通はやらないでしょう。
(数がたくさんになると、けっこう動作が重くなってしまいます)
まじめに実装するとすれば、取捨選択の考え方はそのまま生かすとしても、
転記の仕方に改良の余地があります。適当な二次元配列を用意して、
取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに
書き込む、というのが一般的なやり方になると思います。
>>256 TextBoxのMouseDownイベントプロシージャ内で、Commandbars("登録されているCommandbar名").ShowPopup を
実行すれば、そのタイミングで表示されます。ユーザー設定のショートカットメニューも表示できます。
ちなみにMouseDownイベント発生時は、Button引数 が 定数xlSecondaryButton と等しければ、右クリックと判断できます。
さすがy
うぜぇ
>>257 っす。
>>258 申し訳ないっす。ブレークポイントで調べてみたらここらしいです。
If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then
→ Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium
End If
>>259 うぉ、できました!
罫線の種類とか太さとか、指定する先が間違っていたのですね。
>>260 そこまで親切に表示されませんでした。orz
出てきたのは、
実行時エラー '1004':
アプリケーション定義またはオブジェクト定義エラーです。
でした。あ、verはexcel2003です。
>>261 小一時間考えて駄目だったので聞いてみました。orzorz
Cのコンソール系しか打ったことが無いので、感覚的につかめなくて。
ともあれ、無事にできたので。
ありがとうございました。m(_ _)m
>>242 をわざわざVBA使ってまでやってる理由が分からんな…
関数だけで何とでもなりそうだw
>適当な二次元配列を用意して、 >取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに >書き込む、というのが一般的なやり方になると思います。 はぁ? 何でお前ごときが一般論を語れるんだよ?
今独学でVBAを学んでいます。 皆さんにお聞きしたいのですが、 独学で学ぶにお薦めの本はありますか? 大村あつし著 かんたんプログラミング EXCEL VBA基礎編 と できるシリーズのVBAを読んでいます。
>>276 漏れの場合はVBAに関する知識はほとんどネットやヘルプで調べたものだったりするし・・・
VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
便利なテクニックとかはネットで拾い集めて行く
最初に手に入れたVBAの本に載ってたサンプルがコンパイル通らなかったから
本は全然信用してないだけだけどなw
でも1冊だけ役に立った本があったな・・・
「Excel VBA逆引き大全」とかだったかな?
278 :
デフォルトの名無しさん :2008/09/19(金) 01:19:38
すいません。 VBA作成経験なく、ここを答えを求める場として 使うことに申し訳なく思っています。 複数のExcelファイルを指定する。 当該ファイルを新ブックにして保存する。 →その際、シート名が重複しても問題なし 新ブックのファイル名はあらかじめ指定したものを このようなマクロをつくることは可能でしょうか。 前述のとおり、まったく経験なしなので、 サンプル、たたき台程度で構いませんので、 ご教示いただけたら嬉しいです。
相変わらずyきめぇw
>>277 >VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
できる奴の戯言だな
286 :
デフォルトの名無しさん :2008/09/19(金) 06:37:00
ここの奴ら「簡単」だの「出来て当たり前」だの口ばかり達者で 入門書レベルの事しか回答出来ないから笑える
288 :
デフォルトの名無しさん :2008/09/19(金) 07:01:00
あらあらw
vbogl.tlbのedxさんめちゃくちゃいい人だ。メールしたら速攻返事きたw
誤爆した
>>278 複数ファイルのブック内のシートを結合するマクロなら昔適当に作ったのがあるけど
>>278 まとめると
複数ファイルのブック内のシートを結合する
シート名は重複している場合がある
だよな?
シート数は全部でどのくらいになるんだ?
あまり多いと1つのブックに収まらないよ
293 :
デフォルトの名無しさん :2008/09/19(金) 09:10:07
>>292 すいません、追加・変更があります。
○○システムの情報 ブック*2
□□システムの情報 ブック*2
(全部で5システム)
上記1ブックに1シートのみ
これをシステムごとに1ブックとして新規に保存。
なので、計5ブックができる。
これを一回でやりたいです。
下記の情報をあらかじめ指定(変更可)
- 各システムの情報ブック
- 新ブックの名前
を考えています。
294 :
292 :2008/09/19(金) 10:40:41
>>293 かなり手抜きだが書いてみた
コピー後のシート名は指定するように作った
マクロを入れるブックに
A列(ファイルバス)| B列(コピー後のシート名)
○○システム
C:\A1.xls| Sheet○○1
C:\B1.xls| Sheet○○2
C:\C1.xls
○×システム
C:\A2.xls| Sheet○×1
C:\B2.xls| Sheet○×2
C:\C2.xls
といった感じにデータ入れて以下のマクロを動かす
(AとBはコピー元Cがコピー先)
295 :
292 :2008/09/19(金) 10:41:55
Sub Macro1() Dim wkAWorkbook As Workbook Dim wkBWorkbook As Workbook Dim wkCWorkbook As Workbook Dim i As Long For i = 0 To 1 With ThisWorkbook.Worksheets(1) 'コピー元1つ目を開く Set wkAWorkbook = Workbooks.Open(.Cells(2 + i * 4, 1)) '1つ目を新規ブックにコピー wkAWorkbook.Worksheets(1).Copy Set wkCWorkbook = ActiveWorkbook 'コピーしたシートをリネーム ActiveSheet.Name = .Cells(2 + i * 4, 2) 改行多すぎので次レスに続く
296 :
292 :2008/09/19(金) 10:43:09
'コピー元2つ目を開く Set wkBWorkbook = Workbooks.Open(.Cells(3 + i * 4, 1)) '2つ目を上でコピーしたブックにコピー wkBWorkbook.Worksheets(1).Copy after:=wkCWorkbook.Sheets(1) 'コピーしたシートをリネーム ActiveSheet.Name = .Cells(3 + i * 4, 2) '開いた時に見栄えが悪いので1つ目のシートを選択 wkCWorkbook.Sheets(1).Select '名前をつけて保存 wkCWorkbook.SaveAs (.Cells(4 + i * 4, 1)) '終了処理 wkAWorkbook.Close Set wkAWorkbook = Nothing wkBWorkbook.Close Set wkBWorkbook = Nothing wkCWorkbook.Close Set wkCWorkbook = Nothing End With Next i End Sub 専ブラじゃないのでずれて見づらいかも知れんなw
頭悪そうなコード
変数名のつけかたって、読んだ参考書や勉強したサイトにけっこう影響されない?
変数名のセンスが悪いな
300 :
y :2008/09/19(金) 21:23:03
>>276 「VBAの絵本」(アンク)
アンクの絵本シリーズは、その言語の仕組みや考え方を、豊富なイラストを用いて直感的に
伝える工夫がなされています。他人に薦めた本の中で、「分かりやすかった」という反応がいちばん
多かったのがこの本です。ACCESS VBAの内容も包括しているので、将来的にも役に立つでしょう。
概念の説明が中心で用例は乏しいので、メイン本にはできませんが、「かんたんプログラミング」を
持っているのであればそれで足りると思います。
「Excel VBAのプログラミングのツボとコツがゼッタイにわかる本〜最初からそう教えてくれればいいのに」(秀和システム)
「絵本」よりも実際性があり、個人的には一押しです。解説文と図の取り合わせがとても洗練されており、
文脈の多義性によるストレスや誤読を最小限に抑えようとする、手厚い推敲の跡が感じられます。新しい本なので
まだ他人に薦めたことはありませんが、アマゾンでは好評なようです。
「VBAポケットリファレンス」(技術評論社)
ヘルプがあればリファレンス本はいらない、という声もありますが、個人的には手離せません。
ページをめくるより、ヘルプを開いた方が速いような気もするかもしれませんが、
書式指定子の一覧、よく使うオブジェクトのプロパティ一覧など、よく開くページに
付箋を貼って机に置いておくだけで、パッと見たい時には最速のツールになり、ディスプレイも汚れないので
思考が中断されません。(※ただし、ヘルプを使って調べる習慣は、それはそれで必要です)
「逆引き」本(各社)
>276で既に上がっていますが、豊富な用例がほしい時は逆引き本です。ただ、「やりたいこと」をもとに
用例を探す場合、インターネット検索のほうがより楽な場合が結構あることも覚えておいてください。
「VBA + (やりたいことに関連するキーワード)」で検索すると、似たようなことを既にやっている人の
コードが割と簡単に見つかったりします。
301 :
y :2008/09/19(金) 21:24:04
他にも良書はたくさんあるので、上にこだわることはありませんが、ひとつだけ、初心者が解説書を選ぶ上で ぜひ注意してほしい点は、VisualBasicEditorの使い方、特にデバッグの作法を丁寧に解説している章があるかどうかです。 ステップ実行、ローカルまたはウォッチウィンドウでの変数の監視、イミディエイトウィンドウからの介入、これらの意味を 早いうちに知り、使いこなせるかどうかが、その後の上達に明らかに影響します。
たいしたデバッガじゃないからヘルプで十分だよ
303 :
y :2008/09/19(金) 21:56:25
>>273 Excel2007なら、オートフィルタの抽出条件で「上位○位まで」という設定が可能になったので、
それを組み合わせれば、フィルタだけで何とかなるような気がします。
ただ関数だけでやるとなると… いい方法が思いつきません。
304 :
y :2008/09/19(金) 22:28:11
すみません。
>>300 の「>276で既に上がっていますが」は、「>277」の間違いです。
さらに内容も、結構>277とかぶってしまっています。失礼しました。
305 :
292 :2008/09/19(金) 23:27:08
>>297 頭悪そうなレス
>>299 センスが良いネーミングをぜひとも教えてくれ
貶すことしか知らない無能って多いな
あらあらw
307 :
デフォルトの名無しさん :2008/09/20(土) 00:29:08
先週金曜日あたりから突然会社のExcel2002がおかしくなった。ネットワークが切断されたかなんたらで、ファイルにアクセスできないやらなんたらというのがおきるようになった。 コンパイルするとファイルサイズが600kbから740kbになる場合とならない場合があり、(ソースはバックアップから同じ様にに変更したのに)大きくなった場合、実行すると強制終了になるという症状も現れた。 自宅の2003では問題なかったがためしに2002に変更。SP3を適用したまでは問題なかったが会社と同じバージョンになるよう、全部の更新を適用したところ同じ症状となった ためしに最新のKB8951551を削除するとあっさり解決した・・。同じ目にあってる人いますか? 解決にいたるまでめちゃくちゃ苦労したよ・・・。(いやまだ会社のエクセルでは試せてないけど・・・)
IDでないのにわざわざコテつけて煽るってなにこいつ
309 :
デフォルトの名無しさん :2008/09/20(土) 02:37:18
初心者です、お世話になります。 他の板で質問したあとに、こちらで質問すべきだったと気付きましたマルチポストですが勘弁してください。 セルA1とB1にそれぞれシリアル値による時間が入っています。 セルの書式設定により時間が表示されています。 ユーザーフォームの中のラベル1にB1からA1を引いた時間を時分秒の形で表示したいのです。 A1は開始時間、B1は終了時間、ラベル1は所用時間と考えてください。 Label1.Caption = Range("B1") - Range("A1").value とやるとシリアル値っぽいのが出るのですが、時間を表示したいのです。 助けてくださいませ。
310 :
デフォルトの名無しさん :2008/09/20(土) 03:58:49
>>292 ホントありがと。
まったくプログラム経験なしだけど、
書いていただいたものをもとに
勉強含め動かしてみたいと思います。
感謝します。
>>309 DateDiff関数でintervalに"s"を指定して秒単位の差分を取得、
後はそこから時分秒に分割して文字列に結合して完成、って所?
313 :
デフォルトの名無しさん :2008/09/20(土) 10:14:55
ジョン3兄弟
314 :
y :2008/09/20(土) 13:55:32
>>309 >311のやり方で可能ですが、他にこういう書き方も。
Label1.Caption = Format(Range("B1") - Range("A1"), "hh:nn:ss")
315 :
デフォルトの名無しさん :2008/09/20(土) 16:18:39
>>311 >>314 アドバイスどうもありがとうございます。
テストをしてみたのですが、両方とも「’実行時エラー’438:オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というエラーが出てしまいます。
私は知識不足なので対応がわかりません。
これは、どういうことなのでしょうか?
316 :
デフォルトの名無しさん :2008/09/20(土) 16:35:45
hh:mm:ssでなくて?
nnでもいけるんだよね
319 :
y :2008/09/21(日) 00:37:26
そうですね。 書式指定子 "m" または "mm" は、時刻の分も表しますが、日付の月も表します。それによる混乱を回避するため、 分のみを表す指定子「n」が実装されている、という話を何かの本で読んだことがあります。 ヘルプには、「"h" または "hh" の直後、あるいは "ss" の直前に "m" を指定した場合、月ではなく分が表示されます」とあります。 逆に言うと、mだけを独立して使うと、分ではなく月を表します。つまり分のみを表示させたい状況では、どうしても「n」を使う必要があります。 そういうわけで、分は最初から「n」を使う習慣をつけておいたほうが、間違いが少ないように思います。
うざ
Excel 2009を使用しております。
テーブルを作成し、いくつか項目を入力した状態で、
GUIでテーブルの見出し行にある矢印メニューボタンを押した時に表示される
フィルタのメニューの処理を、VBAから行うにはどのようにすればよいでしょうか?
例えば、TODOリストを想像してください。
ボタンを配置して、ボタンを押すと、
テーブルの1つの列の「開始日付」が今日のもので、
「状態」列が「未完」となっているもののみを表示する。
また、他のボタンを押すと、元に戻る(というか全部表示)。
といったようなことをしたいのです。
画像を見てもらったほうが早いので、説明画像も作成しました。
http://sylphys.ddo.jp/upld2nd/pc3/src/1221954091856.jpg どのようなクラスのオブジェクトにアクセスすればいいかだけでも、手がかりがあればと思います。
323 :
y :2008/09/21(日) 09:13:13
>>322 チェックを入れたり外したりする操作を、「マクロの記録」(
>>1 ★6)を使って記録して、
生成されたコードを見れば、どんなオブジェクトにアクセスしているか手がかりが
得られると思います。
>>323 ありがとうございます。
基本的なことを聞いてしまった様な気がします。テンプレ嫁よ俺。
「開始日付」を「今日」のみ選択、「状態」を「途中」「予定」「スキップ」のみ選んだ時は、
こんな感じで記録されていました。
ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=2, Criteria1:= _
xlFilterToday, Operator:=xlFilterDynamic
ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=1, Criteria1:=Array _
("途中", "予定", "スキップ"), Operator:=xlFilterValues
ListObjectsでListObject(テーブル)が得られて、そのRangeにAutoFilterをかますんですね・・・。
326 :
デフォルトの名無しさん :2008/09/21(日) 15:51:36
質問なのですが、 同一ファイル内で、シート1上の左側にはシート1の内容、右側にはシート2の内容 のように分割して表示することは可能でしょうか? (ウィンドウを別々に開くのではなく) もしやり方があるのであれば教えてください。 Excel2003を使用しています。 よろしくお願いします。
スレ違い
質問です。 ------------------------------------------- 【やりたいこと】 (1).ファイル保存ダイアログでファイル名を選択させる。 (2).新規ファイル名を入力することも可能にする。 (3).ファイル保存時に選択可能なファイルタイプ(拡張子)をVBAで指定する。 【直面している問題】 ・Office.FileDialog で msoFileDialogSaveAs を指定すると(3)を満たす方法がわからない ・Office.FileDialog で msoFileDialogFilePicker を指定すると(2)を満たす方法がわからない 【環境】 WindowsXp SP3 + Excel2002 SP3 ------------------------------------------- よろしくお願いします。
>>328 です。事故解決しました。
Excel.Application.GetSaveAsFilename
を使えばよかったんですね。
スレ汚し失礼。
ExcelVBAって、.netよりもVB6に近いですか?
うーん。その質問は難しいな。 似てるけど全くの別物と思っておいた方がいいよ。
いやVB6とほとんど同じ
VB6でオブジェクトブラウザ開いてみな VBAがあるでよ
>>330-332 何処に焦点当てるかで変わってくる
VB6とVBAは、構文規則は全く同じ
組込関数はほとんど同じ
組込オブジェクトは全然別物
>>333 そのVBAとVisual Basic for Applicationは意味違うからw
Worksheets("表").Range("A2").Select と記述するとA2にデータの未入力状態ということで実行エラーが出てしまうのに、 With Worksheets("表") .Select .Range("A2").Select End With と記述するとエラーが出ずに問題なく実行されるのはなぜなの?
336 :
y :2008/09/24(水) 21:36:05
あるセル範囲に対してSelectメソッドを実行したとき、 そのセル範囲が含まれるシートが選択されていなければ、 実行時エラーが発生する仕様になっているためです。 >335の下のコードは、シートを選んでから、セル範囲を選んでいるので、エラーは発生しません。 上のコードも、「表」シートが選んである状態であれば、エラーは発生しません。
>Worksheets("表").Range("A2").Select こうすればいい。 >Worksheets("表").Select >Worksheets("表").Range("A2").Select # って、既に歪の人が書いていたか。
338 :
デフォルトの名無しさん :2008/09/24(水) 23:27:58
スレチでしたら誘導願います。 xp・excel2002で、関数が物足りなくなってきたのでマクロとVBAの勉強始めました。 ネットで検索するとaccessにもVBAとかマクロとか関数も?あるようです? 同僚に挫折したaccessのVBAの本ならあるから1500円で譲るよ。と言われたのですが、 excelとaccessのVBAは同じものですか?全く別物でしょうか?? すみません、宜しくお願いします。
>>338 AccessVBAの本ではVBの勉強にはなるかもしれないがExcelVBAの勉強にはならないので
1500円も出すくらいならちゃんとした本を買いましょう。
>>338 VBAそのものは同じだけど操作対象が全く別物なのでお勧めできない
>>339 >>340 レスdくすです。
つまり、同じものだけど違うものだから?エクセルのVBAの本を買うべき。
と言うことですね?ありがとうございました。
危うく、accessの本を読んでexcel挫折するところでしたw
いらないならタダでくれればいいのにセコイ同僚だな
343 :
デフォルトの名無しさん :2008/09/25(木) 15:13:33
Dim Cnt, Num As Integer Dim Tbx As TextBox Num = 0 For Cnt = 1 To 9 Num = Num + 1 Set Tbx = "TextBox" & Num Tbx.Text = "" Next VBAは変数の型を自動変換してくれると考えて、これを実行すると、 「コンパイルエラー:型が一致しません」と出ちゃいます。無理かな。
>>343 >Dim Tbx As TextBox
>Set Tbx = "TextBox" & Num←何がしたいんだ?
TextBoxは文字列ではないからコンパイル通らなくて当たり前だな
Set Tbx = Worksheets(1).OLEObjects("TextBox" & Num)
なら理解できる
345 :
デフォルトの名無しさん :2008/09/25(木) 16:39:59
ちなみに余計なお節介かもしれんけど Dim Cnt, Num As Integer と書くと cntはVariant型だぞ
>>346 わざわざ有難うございます。いただいたアドバイスをヒントに修正しました。
やりたかったのはUserForm1のコントロールTextBox1〜9までの値をクリアすることでした。
Private Sub CommandButton5_Click()
' TextBox1〜9までのTextプロパティの値をクリアする
Dim iCnt As Integer, iNum As Integer, oTbx As Control
iNum = 0
For iCnt = 1 To 9
iNum = iNum + 1
Set oTbx = UserForm1.Controls("TextBox" & iNum)
oTbx.Text = ""
Next
End Sub
348 :
デフォルトの名無しさん :2008/09/25(木) 18:48:29
ExcelVBAExpressEditionってないの?
えっえっえっえっ えっろっびっでぉー
>>348 excelが対象なのに、VBAだけじゃ意味無いだろw
おとなしくメモ帳に書いとけ。
351 :
デフォルトの名無しさん :2008/09/27(土) 22:33:47
Hになればなるほど、固くなるものってな〜んだ?
鉛筆の芯
エクセルにVBAが付いてくる…一般 VBAにエクセルが付いてくる…マ >350は素人
> VBAにエクセルが付いてくる…マ これ、笑うところ? あ、マってプログラ"マ"じゃなくて"マ"ヌケってことか それなら納得 プログラマがこんな本質を違えた愚かな発想するわけないもんなw
VBAって、いわゆるスクリプトだろ? サクラエディタにでも書けばいいじゃん。
Excel 2008ではVBAサポートが廃止されました
357 :
ちら裏 :2008/09/28(日) 06:12:41
VBとVBA,VB.NETは共にプログラミング言語文法の名前がVisual BASICというだけで 3つとも全部違うと思って欲しい。 それぞれ用途がかなり違う。文法も基本的な部分は同じでも、 実際にコードしてみると、かなーり違うことがわかる。 例えばVBA(もしかしてVB.NETも)では識別子に漢字交じり日本語が使える。 DLLなどの外部モジュールを最も簡単に呼び出せるのはVB。 VB.NETでは網羅されて使いやすいCLRが使える。 Excel付属のVBAでは、これらは出来ないか出来ても酷く面倒 しかしExcelのVBAは 精々ユーザー定義関数の定義や、外部ファイル入出力関係の 典型処理の組み込みや、フールプルーフ目的のフォーム作成 といった補助的な利用に留めておくべきで、ExcelをVB 環境の一種として取り扱うのはやめたほうがいい。 (VBを学ぶ環境としては余り適していない)
Visual Studio Tools for Applications
って何かと思っていたら、VBAの次世代版だったのか。
Office2003からVBAと並行して使えるようになっていたのな。
.NET2.0ベースで、VB.NET以外にもC#が使えるのは楽しそうだなあ。
>>356 VBAサポート打ち切ったら、マジ売れなくね?
>>357 ひどい知ったかなので、初心者は信じないように。
>>359 失敗の経験も貴重だから、確かにそうだな。
>>358 2008で「切り捨てて」AppleScriptに変更したら非難ごうごうで(当たり前)
次でやっぱりVBAを復活させるってさ
363 :
高島彩 :2008/09/29(月) 15:57:37
ワークシートつかわないでVBAでRSSの値とるやり方おしえて
364 :
HIRO ◆225xxx6ZSE :2008/09/29(月) 16:07:10
, - ,----、
(U( )
| |∨T∨ 皆さん、
>>363 をよろしくお願いします。
(__)_)
365 :
高島彩 :2008/09/29(月) 16:12:29
____
/∵∴∵∴\
/∵∴∵∴∵∴\
/∵∴∴,(・)(・)∴| / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|∵∵/ ○ \| <
>>364 氏ねよ!!
|∵ /. ミ | 彡 | \_______
|∵.| \___|_/| ___
\| \__ノ / / \
\___/ /∧ \
/ ) | × | _ _
/ ,イ 、 ノ/ |●( ―= ̄ `ヽ, _
/ / | ( 〈 ∵. ・\ 〈__ > ゛ 、_―
| ! ヽ ー=- ̄ ̄=_\_(/ , ´ノ
| | `iー__=―_ ;, / / /
!、リ -=_二__ ̄_=;, / / ,'
/ / / /| |
/ / !、_/ / 〉
/ _/ |_/
ヽ、_ヽ
>>363 ごく普通にやればいいだけだよ
VBやCでやるのと同じように
つーか、ワークシート使わない方法になると
>>1 にも書いてある通り
VBAではなくVB分野になるのでスレ違いだな
あとは自分で調べましょう
367 :
HIRO ◆225xxx6ZSE :2008/09/30(火) 00:14:01
, - ,----、
(U( )
>>366 | |∨T∨ ありがとうございます。
(__)_)
368 :
デフォルトの名無しさん :2008/10/01(水) 00:19:39
369 :
368 :2008/10/01(水) 00:36:04
バージョン:Excel2007 OS:Vista 私の環境では、ウィンドウを最大化しておかないと何故かフリーズしやすいです。 フリーズというか、画面は固まりますが裏では動いています。
>>368 全く試さない上でVBA素人の俺が脊髄反射レス
・基点となるセルからoffsetで上下左右1ずつ隣のセルの値を取得して、
それを評価した方がいいんジャマイカ
・セルのプロパティのアクセスを都度行うのは重いから、
一度マップ範囲を c = Range("x:y") のように配列に入れて、
値から何とかした方がいいんジャマイカ
・ScreenUpdating を最初から False に(ry
嘘ですごめんなさい
371 :
デフォルトの名無しさん :2008/10/01(水) 07:26:33
Private Sub CommandButton1_Click() Randomize Dim hsXmax As Integer 'マップの横最大値 Dim hsYmax As Integer 'マップの縦最大値 Dim hsMap() As Integer 'マップの戦闘力格納用配列変数 Dim i As Integer '行番号 Dim j As Integer '列番号 Dim hsMaxPow As Integer '最大戦闘力 Dim x As Integer 'For用 hsXmax = Cells(6, 57).Value hsYmax = Cells(5, 57).Value ReDim hsMap(1 To hsYmax, 1 To hsXmax) For x = 1 To 1000 Application.ScreenUpdating = False 'マップに戦闘力を設定。マップの一番外側は必ず白色 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If Cells(i, j).Interior.Color <> RGB(255, 255, 255) Then '白色以外のセルに戦闘力を設定 hsMap(i, j) = Int((99 * Rnd) + 1) End If Next j Next i
372 :
デフォルトの名無しさん :2008/10/01(水) 07:27:04
'戦闘結果算出 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合 'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1)) If hsMap(i - 1, j) = hsMaxPow Then '上のセルが最大だった場合は、上と同じ色にする Cells(i, j).Interior.Color = Cells(i - 1, j).Interior.Color ElseIf hsMap(i, j - 1) = hsMaxPow Then '左のセルが最大だった場合は、左と同じにする Cells(i, j).Interior.Color = Cells(i, j - 1).Interior.Color ElseIf hsMap(i + 1, j) = hsMaxPow Then '下のセルが最大だった場合は、下と同じ色にする Cells(i, j).Interior.Color = Cells(i + 1, j).Interior.Color ElseIf hsMap(i, j + 1) = hsMaxPow Then '右のセルが最大だった場合は、右と同じ色にする Cells(i, j).Interior.Color = Cells(i, j + 1).Interior.Color End If End If Next j Next i Application.ScreenUpdating = True Next x End Sub
373 :
368 :2008/10/01(水) 07:43:19
↑はソースのコピペです。 一応貼っときます。 戦闘力はランダムのはずですが、 何故か名古屋が強い気がします・・・
>>368 フリーズは再現できなかったけどとりあえず軽くしてみた
やったことは
1.色を配列に入れてこねくり回すようにした
2.色が変化しない時は再設定しないようにした
3.気に入らなかったのでElseifをSelect Caseにした
375 :
374 :2008/10/01(水) 14:08:53
Option Explicit Sub CommandButton1_Click() Randomize Dim hsXmax As Integer 'マップの横最大値 Dim hsYmax As Integer 'マップの縦最大値 Dim hsMap() As Integer 'マップの戦闘力格納用配列変数 Dim hsColor() As Long 'マップの色格納用配列変数 Dim hsColor_old() As Long 'マップの色格納用配列変数(比較用) Dim i As Integer '行番号 Dim j As Integer '列番号 Dim hsMaxPow As Integer '最大戦闘力 Dim x As Integer 'For用 Dim hsCells As Object hsXmax = Cells(6, 57).Value hsYmax = Cells(5, 57).Value ReDim hsMap(1 To hsYmax, 1 To hsXmax) ReDim hsColor(1 To hsYmax, 1 To hsXmax) ReDim hsColor_old(1 To hsYmax, 1 To hsXmax) With Range(Cells(1, 1), Cells(hsYmax, hsXmax)) 'シートから色を取得 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 hsColor(i, j) = .Cells(i, j).Interior.Color Next j Next i
376 :
374 :2008/10/01(水) 14:10:02
For x = 1 To 1000 Application.ScreenUpdating = False 'マップに戦闘力を設定 'マップの一番外側は必ず白色 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If hsColor(i, j) <> vbWhite Then '白色以外のセルに戦闘力を設定 hsMap(i, j) = Int((99 * Rnd) + 1) End If Next j Next i hsColor_old = hsColor '戦闘結果算出 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合 'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1)) Select Case hsMaxPow Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする hsColor(i, j) = hsColor(i - 1, j) Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする hsColor(i, j) = hsColor(i, j - 1) Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする hsColor(i, j) = hsColor(i + 1, j) Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする hsColor(i, j) = hsColor(i, j + 1) End Select End If Next j Next i
377 :
374 :2008/10/01(水) 14:10:48
'マップ(シート)に色を反映 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If hsColor(i, j) <> hsColor_old(i, j) Then .Cells(i, j).Interior.Color = hsColor(i, j) End If Next j Next i Application.ScreenUpdating = True Next x End With End Sub
どこかのセルが変更された時に処理(以下、処理A)が走るようにしています。 最初の処理(以下、処理B)でセルを変更しています。 処理Bのときだけ処理Aを走らせないようにしたいのですが、 どうしたらいいでしょうか。
>>378 Application.EnableEvents = False
かな?
>>379 まさにそれでした。ありがとうございました。
最初「Application.EnableEvents = False」の一行見たとき意味わかりませんでしたが、
ググッたら使い方でてきて何とかなりました。
ありがとうございました。
381 :
368 :2008/10/01(水) 22:30:32
>>370 >>374 ありがとうございます。
予想以上に速くなりすぎていて驚きました。
色を配列に入れるところまで考えが至りませんでした。
ところで、戦闘力はランダムのはずなのに勝者に偏りがありすぎます。
いくつかのマップで10戦ずつやってみたところ、
愛知県マップ・・・名古屋9勝、西三河1勝、東三河0勝
「目(上中下の3色)」マップ・・・上9勝、中0勝、下1勝
「田(4色)」マップ・・・左上8勝、左下2勝、右上0勝、右下0勝
という結果で、左上に近いほど強いとしか思えません。
謎です・・・
>>381 謎でもなんでもないじゃん。
・hsMapの値が整数で0-100程度でしかないから最大値を取るセルが複数できやすい。
・Select Caseで上左の順でチェックしているから上や左が優先されやすい。
つまり、上や左から侵食されやすい傾向があるわけ。
最大値を取るセルが複数ある場合に微妙に優先度を調整するか、
値の変動幅を大きく取って最大値を取るセルが一つになるようにするかってところかな。
Excel2000 で 255文字以上のフルパスの存在チェックで DIRでチェックしようとすると「ファイルが見つかりません。」になるんですが回避するにはどうすれば良いですしょうか? if dir( 255文字以上のパス ) <> "" then
Set fs = CreateObject("Scripting.FileSystemObject") If fs.fileExists(ぱす) = False Then でいけたかも。他にあれば教えてください。
385 :
368 :2008/10/02(木) 07:45:57
>>382 それは私も考えました。
それが原因なら、判定の順序を「下→右→上→左」とすれば、
下や右が強くなるはずです。
順序を変えてやってみましたが、
名古屋8勝、西三河2勝、東三河0勝
上7勝、中3勝、下0勝
左上7勝、左下1勝、右上2勝、右下0勝
と、やはり左上に近いほど強いようです。
まあ、10回程度だと偶然偏りができることも考えられますが・・・
386 :
374 :2008/10/02(木) 10:40:57
>>365 比較する順序ではなく色を入れ替えるタイミングの問題では?
Select Case hsMaxPow
Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
hsColor(i, j) = hsColor_old(i - 1, j)
Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
hsColor(i, j) = hsColor_old(i, j - 1)
Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
hsColor(i, j) = hsColor_old(i + 1, j)
Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
hsColor(i, j) = hsColor_old(i, j + 1)
End Select
と更新前の色を入れてやれば少しは改善するかもしれません
マクロを実行してファイルを閉じ、再び同じウィンドウで マクロ入りのファイルを開いても、マクロが実行できません。 VBAを使っていろいろ処理して終了させます。 処理の中では画面更新の抑制やら色々やってます。 マクロを実行したbookを閉じてから、マクロが入った ファイルを開くと、右クリックで新規ウィンドウ等を やらない限りは必然的に、既に開いているExcelを使って ファイルが開かれると思うのですが、そうなるとマクロが 動かないんです。 セキュリティの問題ではなくマクロが無いファイルのような そんな扱いです。やはり、色々標準の機能を殺しているのが問題で それが終了しても保持され続けているのが問題なのでしょうか??
>>387 セキュリティの設定は何になっているんですか?
低になっていてかつApplication.EnableEventsがFalseだった場合
マクロは自動実行されないはずなので何も起きていないだけでは?
389 :
デフォルトの名無しさん :2008/10/02(木) 20:31:10
1行目と3行目を選択(1行目を選択してからCtrl+3行目を選択)すると、 Range("1:1,3:3").Select と言うコードが得られますが、 変数を用いて、a行目とb行目を選択する場合には、どのように記述すれば良いのでしょうか。 よろしくお願いします。
>>389 Dim a As Integer, b As Integer
Rows(a & ":" & b).Select
391 :
390 :2008/10/02(木) 20:45:59
動かなかった・・・orz Dim a As Integer, b As Integer a = 1: b = 3 Range(Rows(a).Address & "," & Rows(b).Address).Select
392 :
デフォルトの名無しさん :2008/10/02(木) 21:42:23
お世話になります。 for loopの入れ子でループを抜けたいときは gotoするのが一般的なんでしょうか? gotoってあんまり使うなと言われているので For intI = 3 To 65535 For intJ = 1 To 255 '条件が一致すればここからいっきに2つのループを抜けたい Next intJ Next intI あとループ変数って単純にi,j,kとするか なにかしらわかりいい名前をつけるのかどちらがいいのでしょうか よろしくお願いします。
多重ループ脱出は数少ないgotoの出番だぞ。 (無論そのための仕組みが存在する言語なら話は別だが) ループ変数はi, j, kとするのが単純かつ分かりやすい。 intIですらやめてくれと言うところだ。
なるほど そうでしたか ありがとうございました
>>393 プログラムが大きくなってくると1文字の変数は探しにくい
やりたいことにもよるだろうが
1文字で済ませる癖は付けないほうがいいと思う
>>395 それはプロシージャを分割した方がいいんじゃないかな
クラスモジュールと 標準モジュールの違いがいまいちわからん クラスはオブジェクトとして使ったりコンパイルしてDLLとして参照すると 名前でプロシージャーを呼び出せるってことなのか? 標準だと他のモジュールのって呼び出せない?
>>389 union(rows(a),rows(b)).Select
399 :
368 :2008/10/02(木) 23:51:05
>>374 ありがとうございます。
強さが均等になりました。
言われてみれば、あのプログラムでは左上が強くなるのも当然ですね。
実は、初期はちゃんと古いマップから色を持ってきていたのですが、
高速化のためにいろいろやっているうちに、古いマップを省略してしまったようです。
>>395 ループ自体をForで探せばいいじゃない。
あと、ループ変数をi, jとしないなんてVB以外では聞いたことないってただの個人的経験だけど。
>>392 2重ループ脱出はForとDoを併用するのが常套手段
For intI = 3 To 65535
Do Until intJ = 255
Exit For
Loop
Next intI
Do/Loopを使うと速度が落ちちゃうじゃないか、とか言ってみる。
405 :
デフォルトの名無しさん :2008/10/03(金) 22:13:12
ループ抜けの話が出ていたので、質問をさせてください。 例えば、 for i = 1 to 100 if cells(i,1).value like "hoge" then set cl = cells(i,1) end if next のような形で、該当する最初のセルに処理をした時点でループを抜けるにはどのように記述すれば良いのでしょうか。 上記だと2つ以上の該当があった場合、後のセルがsetされてしまいます。
406 :
>401 :2008/10/03(金) 23:22:31
( ゚д゚)
ほとんど基礎もできていませんがアドバイスお願いします 自宅にパソがないので平日会社で試すしか方法がないのですが、何枚かのエクセルファイルを開きセルA6に別の表から拾った値を引っ張ります これがシートならば全シートを選んでVLOOKの式でもA6に入れればいいのでしょうが各ファイルを別々に保存しなければなりません 一度一つのファイルにまとめて入力後またばらしてもいいのですがそれならファイルを開けて手入力する手間とさほど変わりません 多くて40ファイルです どうぞよろしくお願いしますm(_ _)m
>>408 その情報だけだと使えそうな手段は2つくらいしか思いつかない
1.VBAで表をまとめてLOOKUP
2.VBAで該当する値を直接取りにいく
>一度一つのファイルにまとめて入力後またばらしてもいいのですが
何がしたいのかよく分からないw
>ファイルを開けて手入力する
これは目視で値を確認していって該当する値を移すってことでしょうか?
>多くて40ファイルです
40ファイル見るだけなのかすべて更新するのかどちらでしょうか・・・
早速のレスを有難うございます。説明が至らずすみません おそらくあまりに初級なので難しく捕らえていらっしゃるかもしれません 見に行く表にはA列に番号(12桁)B列にも番号(9桁)がありこれが多くても40種の意味です。重複はしていない番号ばかりです そしてA列の番号がファイル名にもなっている1枚シートしかないファイルのセルA4に先程の12桁が入っているがセルA6に今までは手入力で9桁番号を入れていました 目視です。一応FIND窓で捜しはします… 独立させずシートとしてまとめたら一度に処理できるかと考えたのですが、、
すみません余りに眠いのでちょっと離れます なお40種は40行の意味です
>408,410 横レスします。 状況を私なりに解釈し、不足するところをおたずねします。 1 参照元ファイル(以下ブックと呼びます)は最大40個ある (408の下から2行目の記述から) 2 参照元ブックにはそれぞれ40行×2列(A列、B列)のデータがある (410の上から3行目の記述と411の「40種は40行」の記述から) 3 (結果を求める)作業用ブックのA4セルに12桁の番号が入っている (410の上から4行目の記述) 4 作業用ブックのA6セルには今まで9桁番号を手入力していたが → これを自動で表示させたいってこと? 質問 Q1 上の解釈でいいんでしょうか? Q2 40個のブックはそれぞれシートは何枚ですか? 1枚ずつだったら40シートの1ブックにまとめられませんか?
レスを有難うございます まず参照元と作業用の違いを私自身があまりわかってないかもしれません。携帯からのカキコで字数が限られ申し訳ないです(>_<) @A→参照する表は1ブックでそこに多くて40行2列、少ない時は10行2列くらいの表が1シートだけに表記してあります BC→OKです Q2→確かにひとつのブックにまとめればいいのですが、保存が1ブック1シートでないといけないのです(請求書みたいな感じ) なおかつそのブック名もセルA4の番号をつけないといけません 15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると間違いや画面の一杯さで 頭がくらくらしてしまい、楽な方法がないかとお尋ねしてみました まだ言葉足らずかと思いますがどうぞよろしくお願いいたします
初心者にありがちなこと: やりたいことの自分なりの稚拙な解決方法を思いつくのだが、その具体的なやり方がわからずに ぐだぐだと質問&回答を続ける。 良い質問方法: やりたいことをまず具体的に書く。やりたいことというのは、ユーザレベルでの話し。
すみません本当に初心者なもので…… やりたい事は毎日新たに発生するブックのセルA6に、セルA4に対応した9桁の番号を拾ってきて自動入力し保存するという事です セルA4に対応した番号は他のブックに見に行きます この表現ではどうでしょうか? あまりに簡単な作業かもしれませんが良い方法があればよろしくお願いします
致命的に説明が下手だな。とはいえ、普通の奴はこんな感じが標準なのかもしれんが。 商品マスタ(Product.xls)と注文ブック(Order.xls)ということにして、仕様を書いてみた。 [前提] 1.Product.xlsのSheet1のA:B列に何らかのデータが入力されている 2.毎日Excel Bookが40ファイル程度できる 3.そのBook名は[12桁の文字列].xls(以降、Order Bookと表記) 4.Order Bookには1シート(以降、Orderシート)しか存在せず、そのシートのA4には[12桁の文字列]が設定されている [やること] 1.毎日発生するOrder BookのOrderシートのA6に、Product.xlsから取得したデータを設定し上書き保存する 2.データの取得方法は、Product.xlsのSheet1!A列の中から、[12桁の文字列]を探し、適合する 行が合った場合は対応するB列の値を持ってくる [異常処理] 1.Order Book名とA4の内容が異なる場合は***する 2.[12桁の文字列]が見つからなかった場合は***する [疑問] >多くて40行2列、少ない時は10行2列 これはどのタイミングでどのような理由で変更されるのか?
それから簡単、簡単言うな。 お前が超絶難しいと思ってるものでも、ソルバ一発で解決できる類の問題もあれば、 単純作業を自動化するだけなのに、プログラム的にはすげー面倒な場合もある。
はぁー言われてみたらその通りです。こういう表現をするんですね? 確かにこのように書け、と言われたらできるのかどうか それで1点、OrderBook名には「請求書M...」みたいにセルA4に日本語が3文字ついていたかもしれません また、10コか40コかはメール受信によって左右されます。メールの添付をどこかのフォルダに保存し何等かのマクロを実行するとよそにそれに対応した9桁の番号が、 検索されるのか作成されるのかするのでそれを本日分として拾ってくるわけです。でセルA6は空白なので入力して完成させる… 自分は記録マクロしかできないのですが、もし自分がVBAに詳しければ@OrderBookのシート1を一つのブックにまとめる AProductシートもそこに挿入BVlookupでセルA6に値入力Cシートをばらして保存 とかが簡単に出来るのかな?のイメージでした;ω; スミマセン
419 :
412 :2008/10/05(日) 17:49:34
>408,410,413,415 もう一回自分なりに解釈したものを書きます。 1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。 (内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測) 2 結果を求める(作業用)ブックは複数生まれる (413の「保存が1ブック1シートでないといけない」ということと、 「15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると」から推測) 3 作業用ブックは「ひな型」となるものを呼び出してA4セルに12桁の番号を入力し、A6セルには参照元 ブックから自動参照した結果が表示されたところで「12桁の番号」をブック名として名前を付けて保存する 4 上記3を15〜40回繰り返す これでいいのかな? もし、参照元ブックの名前が固定されているんであればVBAじゃなくてもできそうだけど。 作業用ブックのひな型のある範囲に参照元ブックのデータをまるごと外部参照でもってきておいて、 A6セルにVLOOKUP関数を書いたらいいんじゃないかな。 外部参照って言い方が正しいのかわからないけど、ヘルプで 「ほかのブックやアプリケーションへのリンクを設定する」を見てみてください。
ありゃ、回答を書いているうちに質問者さんからの書き込みがあった。419はなかったことにしてください。
お世話になります 3.の行程上でセルA4には12桁の番号が既に入った状態で届きます。こちらで入力はしません VLOOKもいいのですが作業用ブックの開け閉めが面倒いというか少ない時はいいのですが、多い時にはどれがどれやらわからなくなるのです
422 :
420 :2008/10/05(日) 18:41:03
>421 ↑のことも入れて、もう一回自分なりに解釈したものを書きます。 1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。 (内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測) 2 結果を求める(作業用)ブックはメールにて複数送られてくる なので、作業用ブックに個々に計算式等を入れるのは無理(あるいは極力回避) 3 作業用ブックのA4セルには既に12桁の番号が入力されていて、 ・現状では 参照元ブックを開いてA列に一致する行のB列の番号(9桁)をA6セルに入力して保存(の繰り返し) ・したいこと マクロブックを開いてマクロを実行したら、複数の作業ブックを手動で開かなくても それぞれのブックのA6セルに自動的に対応する9桁の番号が記録されている ※作業対象のブックを指定する作業は手動か? (作業対象ブックが保存されているフォルダを指定できれば自動化も可能)
出来の悪いSEと出来の悪いクライアントのgdgdな打ち合わせの例
確かに文章だけで説明する事がこんなに大変とは! '作業対象のブック指定は手動?'の意味が今一つわかりませんがデスクトップにでも予めフォルダごと保存しておいて、作業をしてもらおうか?という算段です というのも引継ぎでは手入力推奨でしたのでネットワークの中で何かやると怒られるかも?とか考えたり ま、推奨程度ですからきちんとセルA6に番号が拾えていたら結果オーライだと思うのですが…
425 :
422 :2008/10/05(日) 20:00:20
>424 流れとしてこんな感じかな? 画面更新をしないようにすれば画面がチラつきません。 1 作業ブックが収められているフォルダ中のエクセルファイルの一覧取得 2 参照元ブックを開く(ついでに2列×数十行のデータを配列に取得) 3 参照元ブックを閉じる 4 上記1で取得したファイル一覧からひとつずつ処理 (1) カレントブックを開く (2) A4セルの値を取得 (3) 配列を調べて対応する値をA6セルに書き込む (4) カレントブックを閉じる(変更確認ダイアログを非表示にしておくといい) (5) (1)〜(4)の繰り返し 5 終了(画面更新再開) 処理がちゃんと進んでいるか確認するために、マクロを記録したブックに A列:カレントブック名(もしくはフルパス) B列:A4セルの値 C列:A6セルに書き込んだ値 を上から順に書き込んでみるといい。その場合は画面更新を停止しないように。
426 :
デフォルトの名無しさん :2008/10/05(日) 20:02:14
ググったのですが適切な単語が思いつかなかったので質問させてください。 関数を自作しようと思ったのですが、 その関数が代入されるセルのオブジェクトを取得することは可能でしょうか? 入門サイトを一通り見たのですが、そのような記述が見つかりませんでした・・・。 可能であれば関連するキーワードか、簡単な実装方法など教えていただけるとうれしいです。
427 :
デフォルトの名無しさん :2008/10/05(日) 20:02:53
よろしくお願いします。 OS:XP、Excel2003 Module5で、Public Sub AAA() という関数を作成して Module1で使おうとすると「名前が適切ではありません」というエラーが出ます。 Module1に関数を作成して、Module5使うことは出来ています。 これは、モジュール名の順番みたいなものが関係しているのでしょうか?
質問です。(WinXP,Excel2003) マルチスレッドで処理をしたいのですがうまくいきません。 以下のテストコード(スレッド系関数の宣言は省略)で、セルへの書き込み自体は問題なく出来るのですが、 エクセル終了時や保存時等ににエクセル自体が落ちてしまいます。 どこが問題なのでしょうか?ご教示お願いします。 '----モジュール------ Public Const STILL_ACTIVE As Long = 259 Public Function testThread(ByVal n As Long) As Long Dim i For i = 1 To 10 Sheet1.Cells(1, n) = i DoEvents Next i testThread = 0 End Function '----シート------ Private Sub test_Click() Dim hThd, idThd, dwExCode As Long hThd = CreateThread(0&, 0&, AddressOf testThread, 1, 0&, idThd) Do DoEvents If (GetExitCodeThread(hThd, dwExCode)) Then If (dwExCode <> STILL_ACTIVE) Then Exit Do End If Loop While True CloseHandle hThd End Sub
>>425 は、はぁ、、そんなかんじかと思いますがそれは記録マクロでできる作業なのでしょうか……
あまりな初級な質問ですみません
作ってくださいとちゃんと言えよ、アホ
>>428 ド素人がVBAでマルチスレッドを使おうとするのが問題
は、はぁ、、例えばコードを書いてもらう事を作るといいますか? 作ってください!お願いします(^人^) でももしかして記録マクロでもできる人はできるのかと思ったり(自分では無理ですが)…… 何か自分の知らない簡単な方法があるような気がしてならなかったり?
433 :
デフォルトの名無しさん :2008/10/05(日) 22:32:39
コード書いてもらう事は、作る事に他ならないが・・・。 作るって、何を作る事だと思う? と言うか、作成依頼はスレ違い。 自分でやって、分からない事を聞くようにしておくれ。
434 :
425 :2008/10/05(日) 22:39:17
>432
このスレのbPの
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
は見てなかったようですね。
自分は明日の夕方以降ならなんとか対応できると思いますが、急ぐんだったら
この件のやりとりの部分 を印刷でもして職場でVBAのわかる人に見せてください。
マクロの記録だけではほとんどできません。条件分岐とか繰り返しとかファイル処理とかいろいろ
あります。
あるフォルダの中のディレクトリ一覧を取得して印刷する部分だけでも↓みたいになります。
http://www.excel.studio-kazu.jp/mag2/backnumber/mm20041012.html
皮肉もわからないとかw
dirなりなんなりでファイルをリストアップして、オープンしてfindしてrange.valueに代入してセーブしてクローズする ってだけの簡単なことなんだけど、細かいところが不明なんで丸々作るめんどくさいのでパス。
>>425 でわかんないなら、もうこのスレ向きの話題じゃなくなった。
マァマー(´・ω・`)
>>434 エクセルの学校の添付を有難うございました
私自身は忘れているとはいえ?ベーシックくらいは少し学んだのですが全く身についていないようですorz
手でやると、1回なら簡単な作業なのに文章にするとこんなにややこしくなるとは!!
ちょっとこの週末は時間がなかったのですが確かに自分であれこれ試してみたいと思います
会社では現在は時間が全くありませんがそのうち手薄になれば挑戦してみます!
昔かじった言語でも、1年経つとほとんど動かせなくなるんだよね。 以前仕事で、とあるScript言語で食ってたんだけど、1年経ったら全部忘れてた。
441 :
デフォルトの名無しさん :2008/10/05(日) 23:32:35
>>426 は自己解決しました。(というかバグが別の場所にあることが分かった)
で、もう一つ質問させてください。
自作関数の演算結果を複数のセルに表示したいのですが、
Function func()
func = 1
ActiveCell.Offset(1).Value = 2
End Function
こうやるとこけてしまいます。
funcの返り値でなくActiveCell.Valueに代入すると循環参照で怒られます。
どうにか解決する方法はないのでしょうか?
442 :
427 :2008/10/05(日) 23:38:12
>>427 ,
>>442 Module5に作成してModule1で呼ぶのも
Module1に作成してModule5で呼ぶのも
問題なく出来ている
つまり「Module5に作成してModule1で呼ぶ」こと以外に問題があるということだ
ちょっとした自分のミスに気付かず、首を捻り続けたりソフトを疑ったりなんてよくあることだ
まずは新規ブックを作成して、標準モジュールを5個挿入し
Module5にPublic Sub AAA()
Module1にAAAの呼び出しプロシージャだけ書いて実行してみろ
それでダメならExcelもしくはOfficeはたまたWindowsを再インストールした方がいい
これで問題なく実行できるなら、自分のミスに気付いてないだけだ
>>440 プロの人でさえ1年で!?
なんとか頑張ってみますと書いたものの、あの業務量を思うと頑張る暇などとてもなくゆーうつ・・・
はぁー、、楽したい。。
446 :
441 :2008/10/06(月) 02:03:42
>>445 こんな・・・制限が・・・あった・・・なん・・・て・・・orz
VBAなんか大っ嫌いだうわあぁぁん
ありがとうございました。本当に助かりました。
厨ばっか湧いて来やがるのはなぜだ
なんかゴネてる人さあ、、、 まずは、A6にvlookup入れて値コピーで上書きするマクロでも作ったら? ファイル開いたり保存するのは取り敢えず手動としても、目視手作業で 入力してるよりよっぽど楽になると思う。 そこから徐々に、自動でできる部分を増やしてけばいいんじゃねーの? あんたがVBA習得するまで仕事が待っててくれるならいいけどさ、 なんも出来ねーくせに余計なことばか考えて、自分で仕事増やしてるだけじゃね?
>>444 月100時間勉強するのを三ヶ月位続ければ、あとは楽になるよ
皆様お疲れ様です
>>448 それはいい考えだと、本日早速セルA6にA4を見て予め用意した表から拾って来てくれ頼む!を打ち込んだところ………
後ろにもう一枚嫌なシートがあってなんと式がセルA6にそのまま表示されてしまうていたらく
後ろのシートとなんかリンク?が貼ってあるかのような得体のしれなさでもう素直にFIND窓で目視で探しました
件数も15件くらいでしたし
他の仕事があまりに立て込んでてそのシート間の関係さえ検討できないほどの忙しさなのです
もうフラフラです
皆様も季節柄お体気をつけて!
えーと、このスレはVBAでプログラミングする人の為のスレだから、 Excelの使い方はよそで聞いて&愚痴ってくれ。
記録マクロで挑戦したんですよ〜 一月100時間3ヶ月をいつか夢見て……
453 :
434 :2008/10/06(月) 20:52:44
>408,〜,452 作ってみました。長いので2件に分けます。 ' DEBUG と書かれた行はテストのためにマクロを記録しているブックのアクティブシートに 処理対象ブックのフルパス、12桁の番号、FINDで求めた9桁の番号を表示させるためのもので、 丸々1行消しても動くと思うけど、こちらでは試してません。 例外処理は入れてません。フォルダーのパスとか検索範囲とかもプログラムで直接指定してますが、 マクロを記録しているブックに設定できるようにするとメンテがラクですね。 詳しい方には添削してもらえるとありがたいです。 Option Explicit Dim BK_M As Excel.Workbook, TATE As Long ' DEBUG Dim BK_I As Excel.Workbook, BK_O As Excel.Workbook Dim SEARCH_PATH As String, FILE_NAME As String Sub prog_408() Set BK_M = ActiveWorkbook ' DEBUG ' 参照するだけとなるブックのフルパスやファイル名は適当に変えてください。 Workbooks.Open Filename:="D:\TEST_FOLDER\PRODUCT\PRODUCT.xls" Set BK_I = Workbooks("PRODUCT.xls") TATE = 3 ' DEBUG ' 変更対象となる10〜40個のブックが記録されているフォルダです。 ' このフォルダにはメールで送られてくるという処理対象だけのブックを置いておくこと。 SEARCH_PATH = "D:\TEST_FOLDER\" FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal) Do While FILE_NAME <> Empty ' 繰り返し Call PROC_1 Loop BK_I.Close Set BK_I = Nothing Set BK_M = Nothing ' DEBUG End Sub
続きです。 Private Sub PROC_1() Dim WK_PATH As String, BANGO_12 As String, BANGO_9 As String Dim c As Excel.Range WK_PATH = SEARCH_PATH & FILE_NAME Workbooks.Open Filename:=WK_PATH Set BK_O = Workbooks(FILE_NAME) With BK_M.Worksheets(1) ' DEBUG .Cells(TATE, 1).Value = WK_PATH ' DEBUG A列に処理対象ブックのフルパスを書き込む BANGO_12 = BK_O.Worksheets(1).Range("A4").Value .Cells(TATE, 2).Value = BANGO_12 ' DEBUG B列に「12桁の番号」を書き込む End With ' DEBUG ' 次行のA2:A41は実際のデータの開始位置と考え得る最大の範囲を指定してください。 Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues) If c Is Nothing Then BANGO_9 = "" Else BANGO_9 = c.Offset(0, 1).Value ' ←ここで9桁の番号が求められました End If BK_O.Worksheets(1).Range("A6").Value = BANGO_9 ' ←やりたいこと はこの部分です BK_M.Worksheets(1).Cells(TATE, 3).Value = BANGO_9 ' DEBUG C列に「9桁の番号」を書き込む BK_O.Close Set BK_O = Nothing TATE = TATE + 1 ' DEBUG FILE_NAME = Dir() End Sub
y様に頼めば全て解決 はい次の方
456 :
448 :2008/10/06(月) 21:40:19
今までさんざんシートは1枚だと言ってたのは嘘か。 もうあきれて物も言えん、、、
マンマー(´・ω・`)
408,410,411,413,415,418,421,424,429,432,439,450,452の人はもういなくなったのかな?
459 :
デフォルトの名無しさん :2008/10/07(火) 22:54:35
初心者でおじゃまします。 := ←これはどういう時に使うものですか? 本見てもよくわかりませんでした('A`)
>459 詳しい人がいないようなので、未熟ながら小生がヒントを。 上の454のマクロに2カ所使ってありますが、いずれもメソッドのパラメータを指定してますね。 Workbooks.Open Filename:=WK_PATH →Openメソッドでフォルダのパスを指定(Openには読みとりモードも指定できますが、この場合は 記載してないので規定値ということ) Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues) →Findメソッドで値検索を指定 VBAのエディタの画面でsortメソッドのHELPを見てください。10個以上のパラメータを指定できます。 省略できるものもあるので、どのパラメータをどのように指定するかをメソッドの行の中に(見た目は 改行されていてもひとつながりなら1行とみなす)続けて書くときに必要となるものです。 こういう説明でわかりますか?
一般に名前付き引数と呼ばれている。
462 :
460 :2008/10/08(水) 00:12:19
一部訂正 →Openメソッドでフォルダのパスを指定 じゃなくて、 →Openメソッドでファイルのフルパスを指定 だった。
>>453-454 さん
お時間を割いて頂きたいへん有難うございました
ノートに早速書き写したところなんと2頁にも及ぶなんて!(記録マクロと大違い)
段落が判らないので近い内ネカフェに印刷しに行けたら、と思っています
本当にありがとうございました
また、余りの忙しさにお礼が遅れすみませんでした
あの後記録マクロに成功し開けたり閉じたり繰り返したりができないものの、VLOOKでショートキーを使い保存までこぎつけました
目視と比べとても楽ちんでした
ところがご指摘のとおり後ろにマクロ用?のようなシートがついているせいか?セルの表示が尋常でなく無理矢理値貼付けで乗り切ったのです
その後9桁の数字が入力されたブックをマクロに通す作業がありましたので
464 :
sage :2008/10/08(水) 21:22:35
今度マクロを使って集計表を作ることになったのですが その中でVBAという物を使うということで質問をしに来ました。 内容は集計ボタンを押すと 同フォルダ内に配置されてるエクセルのファイル名を読み取って 事前に用意されている集計表の中に概要をコピーするというものです。 集計対象のエクセルは毎週作成され、「ファイル名称(作成日付)」で作られていき 数ヶ月に一度集計ボタンを実行します。 VBA、というかプログラムは全くのド素人ですが、 どういった文法?で作れば良いかなにかヒントだけでも教えて頂ければと思いこのスレに来ました。 皆さんどうか知恵をお貸し頂けないでしょうか、宜しくお願いします。
1ブックずつ再度開けて自分のマクロのみ消去するのが面倒くさく、VBAの方を開き自分のショートキーのモジュールを解放しました 間違えて人の(どのブックにも3〜5個はある)は解放してないとは思うのですが、その後マクロの消えたブックになったりならなかったり 挙句いつもきちんと実行(9桁の番号が入ったブック達を通す)できていたマクロがデバッグ とりあえず慌てたものの優先事を片付け、再度初めからメール添付を保存しなおし今度はマクロを使わず手入力し、 手順のマクロを実行すると……………デバッグ 解放がいけなかったのでしょうか 記録マクロがいけなかったのでしょうか 黄色い行には"後ろのシートをアクティブにetc…"となっています。勿論このマクロは私が実行した記録マクロと違いえらい長く書いてある別の仕事の為のマクロです(抽出とまとめ)
>>464 >>1 ★5
ここは右も左も解らない奴が来るところじゃない
どういう処理がしたくて、どういうコードを書いたが、どの部分で躓いてるのかを
具体的に質問できるレベルになってから出直すか
急ぎや勉強が嫌なら、金払ってVBAコード書いてくれるところに依頼しろ
車を運転するには免許が居るように、便利な物を利用するにはそれに応じた資格(スキル)が要る
その資格無しに利便性を求めるなら、車でもタクシー使ったり運転手雇ったりするように
金使って解決しろ
指定されたフォルダ中のエクセルファイルの一覧を取得する処理は、 453、454の中に書かれていますよ。 あと、434で紹介されたurlも参考になると思います。 文法云々ということであれば、エクセルVBAの入門書を入手するか、 ウェブの初心者向けサイトを調べてみてください。 それから、このスレのbPをよく読んでください。
例えばデバッグの黄色い行を削除したりすればうまくいくのでしょうか その場合保存さえしなければ誰かが作成された、いつもは健全に働くモジュールを壊す事にはなりませんよね? いつもエラーなど発生しないのに私が要らないマクロを被せたせいで何かがどうかなったのでしょうか 自分のだけ解放しても他のマクロに影響があるのでしょうか それだけではないのです 今日は昼飯時に453さんの回答に気づきお礼をカキコするつもりが横に置いていた鞄に散歩中の犬がしっこをかけたのです! こんな目に遭う人がいますでしょうか 仕事もテンパリは続き少々のアルコールでは何にもなりません 皆様もこの寒暖の激しさにはお気をつけ下さい
>465 まだ、私が453〜454に書いたものは実行していないと思いますが、念のため書いておきます。 上記マクロは新規ブックの標準モジュールに書いてください。(ファイル名は任意ですが、 以下の説明ではマクロブックと呼びます) あなたが仕事で扱うブックには絶対に書かないでください。 エクセルを起動したらマクロブックを開き、ツール−マクロ−編集− prog_408 を選びます。 マクロ文中のフォルダ指定とかセル範囲などを実際のものに変更したうえで、いったん保存。 そのうえでprog_408を実行してみてください。 なお、私はWindowsXp、Excel2003で試しています。 ここまで書いたところで、468を見たので追加 465で書いてある「自分のショートキーのモジュールを解放」が気になる。そのモジュールにはあなたの マクロだけしか書いてなかったのかな? 本当に「自分のだけ」のモジュールでしょうか? ひとつのモジュールには複数のマクロが記録されるんですよ。 壊れてしまったものは、現場で対応してもらうしかないと思います。
なんなの、最近の流れ
スレbP−★5を読まない初心者ばっかり。
469さん、ご丁寧にありがとうございました モジュールが単独だったか複数かという事ですが、珍しくうまくいった為解放する前にモジュールを表示させて自分の記録マクロを印刷しました そこには15行程度の構文が書かれていたのみですので下の方にもあったか?となるとおそらくなかったような…… なお記録する前に保存先を作業中のブックよりもう一つ深い範囲に適用する、を選択したと思います これがいけなかったのかもしれません あぁ楽をするのも大変ですね…… お先にお休みさせて頂きます。ありがとうございました。。
過去スレですね? 現在PC環境にありませんが是非訪ねてみたいと思います! 晴れた今日も良い一日を!!
>>473 >>1 の★5のことだ・・・
マジでテンプラ読めないやつ増えてるのか?
そりゃ犬もションベンかけるわ
>>465 どのブックにもVBAモジュールがある…だと?
あんた、「1ブックにはそれぞれ1シートしかないから、全シートを
一旦まとめて、後でまたバラして保存すれば…」なんて書いてたよな。
それでどういうことになるのかわかってるのか?
あんたみたいなのは下手なことに手を出すな。
気づかない内に絶対まわりに迷惑かけてるから。
後始末する側の身にもなれ。
2chで相談する前にそのブック配布したやつに相談するのが先だろ・・・ 他にVBAとか入ってるなら下手したら変数名とかかぶるし
VBAを勉強する前に、「仕事のやり方」から勉強するべき
479 :
デフォルトの名無しさん :2008/10/09(木) 18:06:20
Excel2000でメニュー(データ>並べ替え)で現在のソート状態が表示されますが この値をVBAで取得する方法があれば教えて下さい。orz
2chねらならVBEオブジェクトくらい使ったことあるよな
481 :
デフォルトの名無しさん :2008/10/11(土) 03:49:58
フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。 【モジュール】 Private Foo As Integer public sub Bar(Baz As Integer) Foo = Baz End Sub ↓ 【フォーム】 Private Sub TextBox1_Change() On Error Goto Err If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then Call Bar(TextBox1.Text) Else TextBox1.Text = "" End If Err: If Err.Number <> 0 Then MsgBox Err.Description End If End Sub
いったんエラー処理はずしてどの行でエラーか書いてくれよ まあfooかbazに入れてる値がまずいんだろう
472です。その節はお世話になりました 犬に聖水をかけられた鞄は無事洗濯いたしました ところで9桁の番号を取得した後に'抽出とりまとめ'の長いコードの最初でデバッグが出始めた話でしたが なんと手順を間違えていたらしい事が昨日判明しました そのとりまとめ用の長いコードを実行するにはエクセルを全部閉じておいて、マクロブックを先に開いた後 例の9桁番号を取得したブックたちを開かなければならなかったのが、9桁の事で頭いっぱいでそちらを先に開いていたのです 恐らくこれが原因だったようです。まだ1回しか成功していませんがこの、全部閉じとけよ!はどのコードだったのでしょう? しかもそこで黄色になる訳ではないのですね?? もっと丁寧なデバッグ説明表示ならいいのに……
なお、1枚だけだと思っていたのにシートがもう一枚あるもののマクロの組んであるブックはごく一部だけで全ブックではありません ほんとに単純なシートなので高度なコード?ではないようです デバッグが出てヒィヒィ言っていたマクロブックも長いコードながら実行できない間は手作業でカバーできるものではありました けれど実行できればそれはそれでたいへん楽です! なんとか仕事が手薄な時間を作り出し教えて頂いたコードに挑戦できる日がくるのを夢みて…
485 :
469 :2008/10/11(土) 10:09:56
>483,484 「全部閉じとけよ!はどのコードだったのでしょう?」への回答→そんなコードはない。 まさか、最大42ものブックを開いたところでマクロを実行させるつもりだったのか? [42=マクロブック+(2列×40行のデータのブック)+メールで送られる40ブック] FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal) Do While FILE_NAME <> Empty ' 繰り返し Call PROC_1 Loop と WK_PATH = SEARCH_PATH & FILE_NAME Workbooks.Open Filename:=WK_PATH Set BK_O = Workbooks(FILE_NAME) 〜 BK_O.Close FILE_NAME = Dir() でファイル一覧からひとつずつ開いて転記してクローズしている。 ちなみに、マクロを実行すると変更を保存するかどうかのダイアログが表示されるはず。 その際A4セルの12桁の番号に対応した9桁の番号がA6セルに入っているので確認できる。
486 :
481 :2008/10/11(土) 12:15:07
フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。 【モジュール】 Private Foo As Integer public sub Bar(Baz As Integer) Foo = Baz End Sub ↓ 【フォーム】 Private Sub TextBox1_Change() On Error Goto Err If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then Call Bar(TextBox1.Text) Else TextBox1.Text = "" End If Err: If Err.Number <> 0 Then ● MsgBox Err.Description 'テキストボックスにキーボードから値を入力したとき、ここでエラーが出る。 End If End Sub
ByRef渡しでもVBAの方でうまくやってくれたっけ?
>>485 >>483-484 は、まだおまいの作ったコードは実行してないと思う
ネカフェで印刷して会社へ持って行って、見ながら手打ちしてからだから、
来年ぐらいじゃないかな
490 :
479 :2008/10/11(土) 17:48:11
キーワードを変えてググってみても見つけられなかった。 VBAからソートプロパティを取得する方法は無いのでしょうか?
>>486 テキストボックスの値を関数に渡す前にVal()で数値に
変換したら。
>>490 > キーワードを変えてググってみても見つけられなかった。
> VBAからソートプロパティを取得する方法は無いのでしょうか?
>
ソートの設定のこと?
これならマクロの記録でできるけど。
Range.Sort Key1:= ・・・・ Order1:= ・・・・
>492 これまでの書き込みから、ソートの「設定」ではなく「設定内容の参照」のようです。 なので、今まで回答がない。詳しい人の目にとまるまで回答はないかも。
>>479 単純にセルの値取得すればいいだけじゃないの??
OS: WindowsXP Excel: 2007 チャートの目盛線のスタイルを「破線」にしたいと思っていますが、 以下のようなコードを実行しても、「長破線」になってしまいます。 ActiveChart.Axes(xlCategory).MajorGridlines.Border.LineStyle = xlDash LineStyleの値として設定できる値(xlDash, xlDashDot, xlDashDotDotなど)を すべて試しましたが、やはり破線にはなりませんでした。 今は、手動で「目盛線の書式設定」→「線のスタイル」→「実線/点線」から、破線に設定しています。 VBAからは、チャートの目盛り線のスタイルを破線にはできないのでしょうか?
496 :
デフォルトの名無しさん :2008/10/12(日) 00:38:29
エクセル2002 ウインドウズxp で質問! @列を選択 AダイアログBoxに文字を入れ検索 B検索にヒットしたセルの左のセルに*を入力 具体例 @’D列・F列を選択 A’ダイアログBOXに検索したい文字 イロハ を入力 B’ イロハニホ が入力されてるセルD1の左C1と アイロノカニ が入力されてるセルF3の左E3に*を入力 この作業のうちAとB(例はA’B’)をマクロで効率化したいと思っています。 詳しい方、コードを教えて下さい m( )m この板を知る前に総合相談所にカキコしてしまったことをご容赦願います。
置換でいいじゃんd
499 :
479 :2008/10/12(日) 13:44:23
>>493 おっしゃる通り、ソートの設定状態を参照したいのです。
Excelの並べ替えメニューに現在のソート状態が表示されるので、何処かに
ソート状態を保持している筈なのです。
これを取得する方法が分かりません。
>499 で、(直前に行われたであろう手動による)ソートの各種設定を参照してナニしようとしてるんですか?
501 :
デフォルトの名無しさん :2008/10/12(日) 17:29:28
>>500 シートAにデータがあり、
シートBがアクティブ時にはシートAの選択データからシートBを編集します
シートCがアクティブ時にはシートAの選択データからシートCを編集します
シートBやシートCを編集する時のシートAのソート条件が異なるので
編集できるかどうかを判断するためにソート状態を知りたいのです。
実際には、プログラム用ブックと上記のデータ用ブックに分かれていて
プログラム用ブック側でデータブックのイベントを拾って汎用的に処理
しています。
502 :
500 :2008/10/12(日) 19:23:34
>501 シートAは手動でソートするんですか? シートAのソートをマクロで実行して、 その際のパラメータをデータブックに記録しておけばどうですか? シートAのソートのパターンをいくつかつくっておいてマクロ実行時選ぶように したらいいのでは?
503 :
デフォルトの名無しさん :2008/10/12(日) 22:26:40
シートA(B&Cも)は別ブック(任意のデータブック)ですので、単独で開いて ソートされる事も想定が必要です。 プログラムブックからデータブックを開いて、データブックに定義されている 内容によりデータブックのアクティブシートを編集しています。 データブック側にはVBAコード等の記述は不要であり、プログラムブック側に VBAコードを記述し、データブックのイベントを拾ってデータブックの編集を 行っています。 データブックは任意のxlsファイルが指定できます。
誰か早く無理だって言ってやれよ
無理です
506 :
503 :2008/10/13(月) 00:02:44
自分も最初は無理だと思っていたのですが、メニューで現在のソート状態が表示 (Excel2000)されている事に気付いたので、取得する方法がある筈と考えた次第 です。 Excel2007を一寸見たら、現在のソート状態は表示されないみたいですね。 諦めかな...
無理かどうかは知らんけど、Excelが覚えてるからといって、それを取得できる公開I/Fがあるとは限らない。
二つのセルを比較して降順か昇順かしらべることはできるんじゃないの?
無理です
510 :
デフォルトの名無しさん :2008/10/13(月) 01:40:17
ExcelVBAの関数のコールグラフを作成してくれるツールってある? ちなみにDoxygen+VBFilterは関数の中は全く解析してくんなかった。
フォルダにある複数の報告書のファイル名を変更したいのですが 方法を知っている方おられませんか? 報告書(Aさん)→済_報告書(Aさん) 報告書(Bさん)→済_報告書(Bさん) 報告書(Cさん)→済_報告書(Cさん) 上記のように ()内の名前が変わってもファイル名を 報告書()→済_報告書() と変更できる方法を探しています。 何か良い方法を知っている方がいれば教えて頂けないでしょうか? お願いします。
ファイル名を fileName As String とすると、 まず fileName LIKE "報告書(*)" で想定した書式であることを確認した後、 fileName = "済_報告書(" & Mid(fileName,5,Len(fileName)-(4+1)) & ")" って感じ?
>>511 スレ違い
ファイル名変更ぐらいならRENコマンドでできる。
514 :
512 :2008/10/13(月) 17:50:21
この条件だと、wsh使わないと一寸厳しいとは思う。
というか、何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
違うの?
>>511
>>514 さん
返信遅くなってすみません
レス有難うございます。
>>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。
最初は
>>516 さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が
ネックになって上手くいきませんでした。
>>513 、
>>515 さん
スレ違いでしたか、すみませんでした。
>>506 xlsファイルフォーマットが公開されているので(英語)、
解析してソート部分の設定を読み出すコード書いたら。
何がわからないのかわからなかった
なんでわかってもらえないのかがわからない
なんでわかってもらえると思えるのかがわからない
>>506 ヘルプには「シートごとに保存される」
とは書いてあるがどうやって取り出すか書いてないな・・・
ところでそもそも「ソートの設定」で見ようとするのは危なくないか?
コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う
ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う
>506 522に1票 >シートBやシートCを編集する時のシートAのソート条件が異なるので >編集できるかどうかを判断するためにソート状態を知りたいのです。 とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか? ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?
524 :
506 :2008/10/14(火) 13:22:48
基本的には保存しない前提で考えていたので、コピペは考えていませんでした。 出直します。orz
なんで強制的にソートしちゃいけないのかな Aが一定の条件でソートされてないとBやCの編集ができないのに、 ソートは人まかせってのが不思議 永遠にソートしてくれなかったらどうするんだろう ソートされてるかどうかを何かのフラグとして扱うつもりなら、 それこそそんなの信用できないんじゃないの 気まぐれでソートして見てみただけかも知れないし
526 :
デフォルトの名無しさん :2008/10/14(火) 16:57:54
私の勘違いだと思うのですが、どうしても分からないのでお尋ねいたします。 文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの があるようです。具体的な例をあげると、 "ad-02-mb.html" "ad-02.html" の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと なります。マッチング処理ができなくて困っています。解決方法を お教えください。
527 :
506 :2008/10/14(火) 17:42:10
>>525 説明不足でした
BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が
多めに要するという事です。
強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に
戻す必要があります。
別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ
ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。
>>526 バージョン差あるかもだけど、option compare は?
>>527 ソートされなくても永遠に作業が滞るわけではないのね。ならよかった
いつの日か希望どおりにソートしてもらえるといいね
>>527 だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。
そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?
そぅっとしてやってくれ。
早野乙
>526 自分のPC(WinXp Excel2003)で試したら再現したので並べ替えのヘルプを見たら原因判明です。 ヘルプから引用 一重引用符 (') とハイフン (-) は無視されます。ただし、ハイフン以外は同じ文字列がある場合、 ハイフンを含む文字列が後に配置されます。 引用終わり つまり、並べ替えの時は-が無視されるので、ad-02mb.html と ad-02.html が比較される。 先頭から6文字目は"m"と"."なので、"."のあるad-02.htmlが先になる。大小比較のときは"-"も 比較に利用されるので、bd-02-mb.htmlが先になる。 文字コード(10進表記)では、"-":45 ".":46 "m":109 です。
534 :
526 :2008/10/15(水) 22:38:35
>533 おーっ、感動の回答!ありがとうございます。 自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。 で、どーすりゃいいのか考えないと。。。 とにかく、ありがとうございました。
535 :
533 :2008/10/15(水) 22:54:32
>534 レスがあるとうれしいですね。 引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。 解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか? 処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら 一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。
binary
ハイフンは、行末で英単語を分割する際に使われるからだな。
どのような時に、なぜマッチング処理ができないのかを明記せよ
>536 バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか? エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は あるけど、バイナリのことは書いてありません。(Excel2003)
マッチング処理ってどういう処理をしてるの?
比較にstrcompを使った独自ソート関数書けよ
542 :
デフォルトの名無しさん :2008/10/15(水) 23:48:53
>>539 Option Compare ステートメント
543 :
542 :2008/10/15(水) 23:52:53
こっちの勘違いにつき、忘れてcくれ(^^;
544 :
539 :2008/10/15(水) 23:57:27
>542 エクセルVBAのヘルプを見てみました。 引用はじめ Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法 である Binary モードが使われます。 引用終わり ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、 ハイフン"-"を無視しないようにするのは無理なのでは?
545 :
539 :2008/10/16(木) 00:03:27
>543 リロードしてませんでした。一晩寝ると忘れますので、ご安心を。
で今夜は徹夜ですっと
購入日 保証年数 2006/10/05 2 2004/08/12 5 2005/04/22 3 という値があって、購入日から保証年数を足して、今日現在(Date)に達していない(つまりは保証切れ)の場合、 ・・・するという場合、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then 'もし列がA(1)なら ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then '今日との日付差がマイナスなら Target.EntireRow.Font.ColorIndex = 5 'その行のフォント色を青(5)にする Else Target.EntireRow.Font.ColorIndex = 0 'その行のフォント色は黒(0)にする End If End If End Sub 保証切れの場合、色をつけたいのですが、 ★をどのようにすればいいでしょうか?
ある日付から、 n年後 n日後などを求めたい時は dateadd 詳しくはヘルプ読んで あとそのコードだと保証期間内の時に青になるよ datediffのヘルプ読んで
549 :
526 :2008/10/16(木) 22:42:05
なんだかソートとマッチングの問題でいくつか質問をもらったみたいですが、 Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。 Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、 ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、 アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース してマッチングする処理にしました。 ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、 =のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの 並び順が異なるために、おかしくなっていました。 みなさんのおかげで、なんとか完成しました。ありがとうございました。
説明する気ないのか
551 :
526 :2008/10/16(木) 22:52:41
間違えたDo While oldキー >= Newキーはブレーク処理でした。マッチングは Do While マスターキー >= トランザクションキーでした。
もう来なくていいよ
そもそもマッチングを勘違いしてると思われる。
マイッチングまちこ てか、正規表現でも使うの?マッチングって事は。
ブレーク処理とかマッチング処理なんて言葉が出てくるのは業務系のコボラーに多いな。 COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。
ものすごくアフォな質問で申し訳ないんですが教えてください For〜Next文内で10回ごとにそれぞれ決まった作業を1回だけさせたい場合、 For I = 1 To 1000 「基本作業」 a = Right(I, 2) If a = 1 Then 「選択作業1」 ElseIf p = 2 Then 「選択作業2」 ↓ 以下、0まで選択作業計10個 ↓ Else End If Next I こんな感じでいいんでしょうか? 今実行環境が無いのでどなたかアドバイスお願いしますorz
>>556 あくまで自分ならだが
For I = 1 To 1000
'「基本作業」
a = I Mod 10
Select Case a
Case 1
'「選択作業1」
Case 2, 3
'「選択作業2」
End Select
Next I
といった感じにする
>>557 ありがとう
家に帰ったらいろいろ試してみます
559 :
デフォルトの名無しさん :2008/10/17(金) 17:54:59
セルの値が1のときセルの色づけ赤,2のときセルの色づけ青 とするマクロをVBAで組んだのですが,一回実行した後, セルの値を1から2を変更しても,実行ボタンをあらためて 押さないと色が青に変わりません。 2を入力すれば直ちにセルの色づけが青に変わるようにする ためにはどのようなコードを入れればよいのでしょうか。 よろしくお願いします。
>>559 ボタン押したら色が変わるようにしたんだろ?
だったら当然だな
入力してすぐに変えたければ
1.ボタンはやめてワークシートのChangeイベントで動かす
2.VBAをやめて条件付書式にする
どちらかだな
ところでテンプレ
>>1 の★5読んだか?
>>560 ありがとうございます。
まったくの初心者です。場所を間違えたようです。
失礼しました。
562 :
547 :2008/10/17(金) 20:36:21
> ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then なんですが、 dateaddをして、比較したいのですが、 If Dateadd("y", target.offset(0,1).value, target.value) < Date Then と、やってみてもダメでした、 Private Sub Worksheet_Change If Target.Column = 1 Then に、おいて、特定セルと特定セルの右隣を関数に入れて比較する方法は、 上記であっているのでしょうか?
>>562 ダメだった時はどうダメだったのかを書こうぜ
> 特定セルと特定セルの右隣を関数に入れて比較
そこは合ってる
で、右隣のセルに入ってるのは日数じゃなく年数でしょ?
後はもっぺんヘルプ読んで
>>559 条件付書式だかそんな感じの奴でマクロなしでできる
565 :
547 :2008/10/18(土) 04:21:40
>>563 もう一度考えてみました。
やりたいことと、セルの値
購入日 保証年数
2006/10/05 2 ←保証切れ(青色になって欲しい)
2004/08/12 5 ←保証が切れていない(色は黒色に)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
If DateAdd("d", Target.Cells.Offset(0, 1).Value * 365, Date) < Date Then
' 今日の日付に、Target.Cellsの右に入っている年数×365日を足して、今日の日付と比較
Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If
End If
End Sub
日付を入れると「全部青になってしまいます」
ちなみに
If DateAdd("y", Target.Cells.Offset(0, 1).Value, Date) > Date Then
と年数バージョンでもやってみましたが、同じ結果orzでした。
全然わかりません、足して日付が今日より前なら「保証切れ=青色」にしたいのですが・・。
日付と日付を比較できていないのでしょうか?単位が違う状態で比較しているのでしょうか?
>>565 おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ
今日の日付に足したら、何足したって未来になるだろw
>>562 のでほぼ合ってるんだよ
オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、
おまいのにはないのか?
567 :
565 :2008/10/18(土) 06:29:37
ありがとうございます。 yyyyでしたか・・・、さっそく書き換えるといけました!感動しました。 たしかにadddateで今ヘルプを見ると、 設定値 内容 yyyy yyyy y 年間通算日 yyyy・・・内容書いていませんwww (by Office 2003) でもyは、その年から何日後という意味なんですね、こんなの思いもよらなかったです。 しかし、大問題が発生しました。 xlsファイルを「開いたときに今日の日付を比較しないといけない」ので、 worksheet_changeじゃだめなんです。 workbookが開いたとき、な方法があればいいのですが、 worksheet_activate、selectionchangeでも反応しませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) ここをどのように書き換えれば、読み込み時に再判定してくれるのでしょうか?
568 :
565 :2008/10/18(土) 06:53:58
何度もすいません、 たぶん、worksheet_activateイベントで良いと思うのですが、 activateになった時に計算させるということは、 自動的に Private Sub Worksheet_Activate(ByVal Target As Range) If Target.Column = 1 Then If DateAdd("yyyy", Target.Cells.Offset(0, 1).Value, Target.Cells.Value) < Date Then Target.EntireRow.Font.ColorIndex = 5 '青 Else Target.EntireRow.Font.ColorIndex = 0 '黒 End If End If End Sub Private Sub部分を変えただけだと 違うシートを選んで、選択し直すと 「コンパイルエラー プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」 と出ますが、すでに上の言葉が理解できません。 if文以下も変更しなければならないのでしょうか? byヘルプ プロシージャの名前はイベントと同じ名前ですが、パラメータの数と型が一致しません。 イベント プロシージャに新しくパラメータを追加したときなどに、このエラーが発生します。 たとえば、フォームの Form_Load イベント プロシージャを次のように変更すると、このエラーが発生します。 ダメです、わけわかりませんorz
>>567-568 > yyyy yyyy
ちょwマジでw
おちおち「ヘルプ読め」とも言えんじゃないか
まあそっちは解決したようで良かった
イベント変更の方だが、worksheet_activateは引数を取らないから、
そうなるのは当然だな
引数を消して、targetを自前で指定してやればOK
つか、workbook_openイベントもあるんだが
つか、今さらだけど、
色変えたいだけなら条件付き書式でもできるがw
570 :
デフォルトの名無しさん :2008/10/19(日) 02:32:28
VBAにEffective C++やEffective Javaみたいなガイドラインってある?
571 :
568 :2008/10/19(日) 02:58:41
>>569 >色変えたいだけなら条件付き書式でもできるがw
こ、こんなのあったんですか・・。
春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。
わざわざVBAを使う必要無かったんだ・・・。
___________
||
|| ⊂⊃
|| ∧ ∧
|| ( ⌒ ヽ でも勉強にナターヨ・・・
∧||∧ ∪ ノ
( ⌒ ヽ 彡 V
∪ ノ フワーリ
∪∪
ほんとに色変えるだけなのかよwまいったw
>>559 もそうだし、こういう奴、実は多いのか?
何という時間の無駄
573 :
デフォルトの名無しさん :2008/10/19(日) 07:09:25
悪いけど笑わせてもらう ァ ∧_∧ ァ,、 ,、'` 。゚( ゚^∀^゚)゚。,、'` '` ( ⊃ ⊂) '`
関数でできることをマクロでやろうとしたり、案外よくあるよな
だんだんとワークシート関数がウザくなってくるんだよなw
576 :
デフォルトの名無しさん :2008/10/19(日) 17:15:03
暇だから何か問題だしやが……出して下さい
>576 Excel総合相談所74で質問が出てますよ。(レス番号325です)
プログラミング初心者かつエクセルにも詳しくない奴が、 この手ので延々悩むんよね 心理的ハードルを超えさせる書式の魔力おそるべし
>>577 ありがと
解決済みだった
>>579 全ての図形が4色で塗り分けられるとかなんとかだよね
図形の形とか定義あるのかな?
セルに色塗るなら二色で出来ちゃうし
二次元配列に書き出したセル範囲のデータををリストないしはコンボボックスに 格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?
>>581 あります
入力規則のリストなら、マクロの記録録ればわかります
コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます
但しフォームツールのコンボボックスなら多分セル書き出し必須
583 :
581 :2008/10/19(日) 22:50:06
>>582 すみませんコントロールツールボックスの方です
シートに書き出せばRowSourceプロパティで簡単なのは存じてますが…
585 :
デフォルトの名無しさん :2008/10/19(日) 22:59:02
>>584 ありがとう
1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす
2.領域ごとに、隣り合わせ同色にならないように色IDを付ける
3.色IDが1から4で収まっているか判定
っていうアプローチでよいかなあ
アルゴリズムの問題っぽいがw
セルに依存しない計算は速いのですが結果をセルに 出力するのに時間がかかります。たとえば Dim X(10000, 10) As Double Dim I As Integer Dim J As Integer '計算 For I = 1 To 10000 For J = 1 To 10 X(I, J) = Sqr(I) * Sqr(J) Next J Next I ' 出力 For I = 1 To 10000 For J = 1 To 10 Cells(I, J) = X(I, J) Next J Next I で出力の所要時間を計算時間と同程度にすることができるような 出力の書き方があれば教えてください。
For I = 1 To 10000 For J = 1 To 10 Cells(I, J) = Sqr(I) * Sqr(J) Next J Next I
ちらつき抑制でよいかな? forの前に Application.ScreenUpdating = False を入れると、シートの描画しないから早くなる 少しずつ描画見たいなら、例えばNextの間に Application.ScreenUpdating = Tlue Application.ScreenUpdating = False を追加すると、Iが一つ進むごとに描画される 例えばIが100ごとに実行したいなら J Mod 100 使ったりできる
つーか、配列を0始まりではなく1始まりにしてそのまま書き出したらいいやん
>588 21秒から13秒に8秒も短縮できました。ありがとうございます。 >589 具体的に「そのまま書き出す」ってどうすればいいんですか? よろしくお願いします。
>>590 >>589 じゃないけど、
range(cells(1,1),(cells(10000,10)) = X
592 :
591 :2008/10/20(月) 00:30:17
タイプミス range(cells(1,1),cells(10000,10)) = X
base 1 にするのはお勧めできない。 変数に+1しる。
592>> やってみました。1秒かからないんですね!ありがとうございました。
base 1 にするのはお勧めできないが 変数に+1するのもお勧めできない X(1 To 10000,1 To 10)にしる
すみません Range(Cells(1, 1), Cells(1000, 10)) = X(1 To 10000,1 To 10) とするとコンパイルエラーがでるんですが・・・。
>>596 違う違うw
1 to 10000 とかを書くのは dim のとこ
Dim X(1 To 10000, 1 To 10) As Double でしたね。失礼しました。 みなさんどうもありがとうございました。
EXCEL XP, 2000, 2003, 2007において、 VBAはクアッドコアに対応しているの? コア4つのVBAはやはり処理が早いんだろうか・・。
すみません 文字列の入ったセルをselectした際に、単にselectにするだけではなく、 編集中の状態にまでもっていきたいのですが、 そのような方法を御存じないでしょうか。 select後、sendkeys"{F2}"で実現できるのですが、 Sendkeysを使用しない方法を探しています。どうか宜しくお願いします。
数式バーで編集じゃだめなの?
Excel2003でSheet1のセルA1に日付を入れる(08/10/01)とSheet2以降のセルA1に次の日付になるように反映させるにはどうしたらいいですか?
>>603 Sheet2以降のセルA1に、「=Sheet1!A1」と入力。
+1忘れた
607 :
デフォルトの名無しさん :2008/10/20(月) 16:56:04
どこがVBAやねん
春から悩んでたかも知れないじゃないか
>>599 まず、複数スレッドを作ることが実質的に無理だ。
Excel自体も、2007から再計算を複数スレッドで行えるようになったくらい。
依存関係ありまくりの計算だからなあ。
オートフィルターがオンになっているシートの選択行について、ソートと処理を 行った後、再度元の並びに戻す方法を模索中です。 1)選択行範囲の最後(列n)に式["=ROW()"]を設定 2)列nの式を値に変更(コピぺ) *ソートと処理を行う 4)列nで昇順にソートした後、列nを削除 この方法だと選択範囲内に不可視のデータが存在すると、[2)]でコピーと貼付け の領域が違うため貼付けエラーになります。 1行ずつ行番号をセットする方法は件数が多いと時間が掛かる為オートフィルター 情報を取得しておき、一旦オートフィルターオフにしてからコピペしています。 他にもっと良い方法をご存知でしたら御教授願います。 選択データを他ワークシートにコピーして処理する方法が一番良い気もしますが データ量が三万件とかだとコピーにも多少時間が掛かるので...
>>611 仮に、"=row()" を入れた範囲を range("G5:G10") として、
G列を非表示にして、
range("G5:G10").value = range("G5:G10").value
ってのはダメ?
613 :
611 :2008/10/21(火) 18:27:03
>>612 助かりました、有難うございます。orz
だけど、非表示だと何故上手くいくのでしょう?
どこがVBAの問題なのか春先まで悩みそうだ
>>613 わからん。なんかやってみたらできた
仕様なのかバグなのかも知らんw
非表示だと pastespecial もうまくいくな どうやら仕様くさい
初めまして。自分は知り合いにVBAを教えて貰っているんですが、相手に人はPCが 無くよく分らなくてもし良かったら教えて下さい。 だだ走らせるだけの凄い簡単なプログラムらしいんですが私には走らせ方が分らな くて困ってます。 10 for m=1 to12 20 print m 30 next m 40 stop なんですが凄い初心者なのでエクセル開いた所から分らなくて教えて下さい。
それはVBAじゃない。VBでもない太古のBASICのプログラム。
らしいです。VBAを覚えたいなぁ〜って言ったら色々言われて私が全然分からなく なってしまったので、まず見れる簡単なの教えてと頼んだんですが、今のじゃ無理 なんでしょうか;
もしかしたら、その相手の人は(Excel) VBAを知らないという可能性も考えられる。 VBAも含めてナントカBasicってのは山ほどあるけど、どれも全く別物。 敢えて共通点をあげるとしたら名前にBasicが付いていることだけ、というのはさすがに言い過ぎだけど。 そして、お前は何をやりたいのか。Excel VBAで間違いないんだよな?
釣られすぎ
縦読みじゃないのね。
623 :
デフォルトの名無しさん :2008/10/22(水) 07:27:31
Interiorってクラス名としてはどうなんですか?
激しく紛らわしいからやめた方が良いかと
自作クラスのインスタンス380個ぐらい作ったらメモリ不足になった
そりゃクラスの内容に因るだろうな 個数や上限決めておらず、必要に応じて作る場合とか 1万や2万は当たり前に使ってることあるが ちゃんと配慮してれば全然問題ない
627 :
デフォルトの名無しさん :2008/10/24(金) 11:20:18
選択アドレスから重複を削除する方法はありますでしょうか? 例えば、選択したアドレスが[$A$2:$A$5,$A$5:$A$10]の場合、そのアドレス 範囲で集計(Subtotal)するとA5が重複して集計されてしまいます。 Excelのステータスバー(右側)には重複を除いた合計値が表示されます。 これと同様の値(特定の1列のみ)をVBAで取得したいのです。
>>627 Sub test1()
Dim rg1 As Range, rg2 As Range
For Each rg1 In Selection.Areas
If rg2 Is Nothing Then
Set rg2 = rg1
Else
Set rg2 = Range(rg2, rg1)
End If
Next rg1
Debug.Print WorksheetFunction.Sum(rg2)
End Sub
>>628 Unionは無理じゃない?
630 :
629 :2008/10/24(金) 12:20:32
今テストしてたんだが離れたセルを選択した時に期待どおりの動きしないな・・・
>>629 ? range("$A$2:$A$5,$A$5:$A$10").cells.count
10
? union(range("$A$2:$A$5"),range("$A$5:$A$10")).cells.count
9
? union(range("$A$2:$A$5"),range("$A$5:$A$10")).address
$A$2:$A$10
「特定の1列のみ」だそうだからOKかなと
632 :
629 :2008/10/24(金) 12:29:12
RangeをUnionに書き換えたらいけたような気がするw
633 :
デフォルトの名無しさん :2008/10/24(金) 14:52:48
有難うございます。 Set rg2 = Union(rg2, rg1) に変更したら上手くいきました。 もう1つ教えて下さい。 選択された範囲の行を対象に特定の列(例では8列目)を以下の様に集計して いますが、選択範囲から集計範囲(特定列)への変換にもっと簡単なやり方が ありますでしょうか? Dim vals As Variant, i As Integer, c As Integer, addr As String c = 8 vals = Split(Selection.Address, ",") For i = 0 To UBound(vals) With Range(vals(i)) vals(i) = Range(Cells(.Row, c), Cells(.Row + .Rows.Count - 1, c)).Address End With Next addr = Join(vals, ",") Debug.Print WorksheetFunction.Subtotal(9, Range(addr))
634 :
633 :2008/10/24(金) 16:24:56
列の特定と同時に重複を削除しないと駄目のようです。
>>629 さんの方法に組み込むと良い様に思います。
Set r1 = Cells(rg1.Row, 8)
Set r2 = Cells(rg1.Row + rg1.Rows.Count - 1, 8)
If rg2 Is Nothing Then
Set rg2 = Range(r1, r2)
Else
Set rg2 = Union(rg2, Range(r1, r2))
End If
635 :
デフォルトの名無しさん :2008/10/24(金) 16:33:53
質問です。 エクセルで資料を作ったがMacroで両面コピーの方法が分からないので両面コピーの方法を教えて下さい。
質問です 訳あって欧文(ウムラウトを含むラテン文字の文章)の書き込まれたExcelシートから 内容を読み出してテキストファイルに起こしたいのですが、 Cells(?,?).valueやCells(?,?).TextからStringsの変数に読み出した時点でウムラウトが飛んで 近しい形状の通常のアルファベットに置き換えられてしまうようです。 結構ぐぐって見たのですが、読み出せなくて困った的な話はいくつか見つけたのですが 対処法について言及しているページが無かったので、皆さんのお知恵をお借りできないかと 思って書き込みさせていただきました。 なにかお知恵などありましたらよろしくお願いいたします<(__)>
638 :
デフォルトの名無しさん :2008/10/24(金) 20:26:20
両面コピーって両面印刷の事?プリンタの話になるんじゃないの?
>636
元となるExcelファイルは、Excelのどのバージョンで作られたものですか?
あるいは、どこの国用のExcelで作られたものでしょうか?
VBAを利用せず、直接シートの必要な範囲をコピーしてエディタへ(ウムラウトは消えずに)
ペーストすることはできたのでしょうか?
↓このサイトは見ましたか?
http://www.microsoft.com/japan/office/ork/three/intd02.mspx Office XP リソース キット / 国際環境での導入計画 / 国際環境でのメンテナンス
Unicode サポートの活用
「多国語テキストのコピー」の項と、「VBA で Unicode 値を使用する」の項が参考になるかも。
あるサブルーチンをForループで回すと100回くらいなら一瞬で終わるんですが、 500回とかそれ以上になるとなぜか無限ループにでも入ったみたいに計算が終わってくれません。 オーバーフローのエラーメッセージが出ることもないし、実際オーバーフローするほど大きな数を扱っているわけでもない。 原因としてはどんなことが考えられるでしょうか?
サブルーチンのforカウント変数をステータスバーにでも表示してデバッグのヒントにするのだ。 その情報だけだと、メモリかCPU?としか言えない。
642 :
デフォルトの名無しさん :2008/10/24(金) 21:55:54
>>635 sub 裏表印刷()
印刷実行
Msgbox ゛用紙裏面をセットしてください゛
印刷実行
end sub
>>641 メモリっぽいですね。ちょっと調べてみます。
ありがとうございました。
636です
>>639 動作環境を書くのをすっかり失念してました
この手の質問には必須なのに…申し訳ありません
OSはXP日本語版でExcelは日本語版Office2000に含まれるものです。
現在VBA開発に使用しているxlsファイルは
Exciteの機械翻訳で出したものをコピペしてBOOKに張り付けてテストデータとして作成したものです
紹介していただいたリンク先を読むと、VBAではunicodeを標準ではサポートしていないようですね
(VBでは文字列関係の内部処理はUnicodeで処理されてるのに…変な気分…)
まあ、テストデータで使用している文章がUnicodeではなく単純に欧文ASCIIコードの文字列の可能性もあるので
Unicodeをサポートしていればうまく行くとは限らない気もしますが
でもちょっと手がかりをもらえたのでもう少し試行錯誤してみようかと思います。
オーバーフローの意味もしらないのかVBA厨房は
アクセスならともかく、エクセルでプリンタ設定いじるって難しいくね
>>633 unionでいいんなら
Sub test()
Dim rg1 As Range, c As Integer
c = 8
Set rg1 = Intersect(Union(Selection, Selection).EntireRow, Columns(c))
Debug.Print WorksheetFunction.Subtotal(9, rg1)
End Sub
649 :
デフォルトの名無しさん :2008/10/25(土) 15:46:42
どなたかお教えください マクロでたとえばですが ActiveCell.Replace What:="*", Replacement:="x" のように セル文字列の * の部分だけをxに変換したいのですが アスタリスクはすべて変換してしまいますよね。 A1*A1 という文字列を上記マクロ実行するとA1xA1 という結果になって ほしいのですが。実際は x 担ってしまいます どのようにすればよいのでしょうか。
>>649 ActiveCell.Replace What:="~*", Replacement:="x"
651 :
デフォルトの名無しさん :2008/10/25(土) 16:09:39
春先から悩んでた人多いな
しかし、エスケープシーケンスはもっとわかりやすくしてほしいよな。
655 :
デフォルトの名無しさん :2008/10/26(日) 03:08:58
教えてください VBAで、明日が三週目の日曜日だった場合A1に○○と表示するってやりたいんでがどうやればいいですか?
>>655 明日の日付はDate関数に+1すれば解る
特定の日付が日曜日か否かはWeekday関数で解る
3週目か否かは日を算術演算すれば解る
あとはそれらを条件に条件分岐してA1に値を代入すれば良い
この説明で解らなければ
>>1 ★5なので、さようなら
>>656 ありがとうございます。
算出演算ってのがよく解らないですががんばってみます。
だからエクセルでやれよ
だよな。数式でできるレベル
質問です。 Excel2003を使っています。 コマンドボックスをクリックするたびに、セルA1の数に1ずつ足していくマクロを作りたいのですが どなたか教えていただけませんでしょうか。 よろしくお願いします。
ちょっとは自分で調べる努力した?
663 :
660 :2008/10/26(日) 15:45:47
聞いておいて遅レスごめんなさい。 コマンドボタンの間違いです。 色々調べてみたのですが、変数の定義の仕方そのものがよく理解できていなくて わからないなりに考えたのが↓です Sub test_Click() Dim h As Long h = Range("A1").Value If h = 0 Then h = 1 Else h = h + 1 End If End Sub もうちょっと頑張ってみます
664 :
649 :2008/10/26(日) 15:48:36
お教え願いますか '=A1 という文字列を =A1 という数式に変換するマクロありますか。 同かよろしくお願いします。
665 :
649 :2008/10/26(日) 15:50:36
舌足らずでした あるセルに '=A1 という文字が書かれています。 マクロコマンド使って =A1 という数式に置換したいのですが。 どうかよろしくお願いします。
>>663 cells(1,1).value = cells(1,1).value + 1
>>665 Cells(1, 1).Formula = Cells(1, 1).Value
>>663 Range("A1").Value = Range("A1").Value + 1
こんなばかみたいな質問にいちいち答えるなよ
669 :
660 :2008/10/26(日) 16:47:26
変数の定義ができないとか、 単純な代入式も書けないレベルの奴は入門書買え いちいち他人の手を煩わすな
671 :
デフォルトの名無しさん :2008/10/26(日) 22:22:34
初めて質問させていただきます。 初心者ではないですが、レベルは低いですσ^^; セルを指定するときに、Range("A1")ではなく[A1]というふうにやってるんですが、 これだとなにか悪影響がありますか? 今のところ困るのは、説明書やhelpの類がすべてRange形式のものばかりなので、 書き方が分からない時がある、ってことくらいです。 単に字数が少なくて済むからという理由で[**]形式にしているんですが、 ちょっと気になってます。 というか、そもそも気にしたほうがいいのか気にしなくてもいいのか・・・
他の人が見たときに分かりにくいとか 少なくとも俺はわからん
動作自体には問題ない あとは使う場面やメンテナンス性などを考えて使えば良い 複数人で扱う物には使わない方がいいし、汎用モジュールも然り 個人専用の使い捨てマクロの類なら[A1]形式でも医員で内科医 連続しない複数セルもしくは範囲を扱う場合なんかは便利なので 俺も他人が弄る可能性のないものでは使うこともある 『 [A:A,C:C,E:F].ClearContents 』とか『 [A3,C3:F10,H3:H10] = 0 』とかね 因みにうちでは『r""』のキー打ちで『Range("")』が入力され、カーソルが""の間に移動するので Range("A1")は、『 R " " A 1 』で済む為、[A1]でもRange("A1")でも入力字数は大差ない 俺の場合RangeよりCellsの方がよく使うが、Cellsも同じく入力省略出来るようにしてある
簡単なマクロ程度をゴールにしてるならどんな形式でも良いけど、 本気で業務に使うプログラムやら、もっと高いゴールを目指すなら、 初心者のうちからcellsで指定する方が良いと思うよ。 rangeと言えば、あくまでrangeオブジェクトである訳で・・・。 何より変数絡めてセルの指定するようになると可読性が著しく下がる・・・。 タッチ数も増えるしで、良い事ない。
最後の3行が言いたかっただけちゃうかー
?
[A1]なんて書き方知らなかった……。もっと精進するわ。
>>671 結局は evaluate の省略記法だから、excel に渡して評価させる分、
多少処理の無駄があるんじゃないかと思う(たぶん)
[A1].value = 0
range("A1").value = 0
それぞれ10万回ループさせると数秒だが差が出る
evaluate("A1").value = 0
は、[A1]記法とほぼ同じになる
誤差レベルだけど、回数の多いループ内とか、速度が気になる場合は
避けた方がいいかもね
679 :
デフォルトの名無しさん :2008/10/27(月) 09:49:00
[A1]だと後ろにピリオド打っても入力候補が出てこねぇ。 Cells(1,1)も出てこねー。 Range("A1")だと出てくる。 どれもいったんRange型変数に入れりゃ同じだが。
680 :
デフォルトの名無しさん :2008/10/27(月) 10:57:11
682 :
633 :2008/10/27(月) 14:06:59
>>648 おぉー、素晴らしい限りです!
アクティブシート以外に対してIntersectは無理なのでしょうか?
683 :
682 :2008/10/27(月) 14:21:18
失礼しました。orz columns(c)を修飾したら出来ました。
>>682 書いた後で気づいたんだが、それ union いらないっぽいw
? selection.address
$A$1:$A$5,$A$5:$A$10
? selection.entirerow.address
$1:$5,$5:$10
? intersect(selection.entirerow, columns(8)).address
$H$1:$H$10
intersect かけた時点で重複してる行はまとめられるから、
Set rg1 = Intersect(Selection.EntireRow, Columns(c))
だけでいいようだ
685 :
682 :2008/10/27(月) 16:34:34
>>684 究極のリファクタリング有難うございます。orz
こういうの教えられると、VBコードでゴリゴリ作るのが馬鹿らしくなってしまう...
686 :
671 :2008/10/27(月) 22:41:20
みなさんいろいろご意見ありがとうございました。 RangeやCells形式も使いこなせるように、もっと勉強していきます^^
687 :
デフォルトの名無しさん :2008/10/28(火) 10:08:01
もう1つ教えて下さい。 選択エリアの全行数は For each r in Selection.Areas rcnt = rcnt + r.Rows.Count Next で求めていますが、一気に知る方法がありますでしょうか?
>>687 一気に知る方法は知らないがそのままだと重複している行もカウントされる
少し前で話題に出たIntersectを組み込んで
For Each r In Intersect(Selection.EntireRow, Selection.EntireRow).Areas
とかにしたほうがいいんじゃないか?
初心者って「一気に」とか「1行で」とか好きだよな
コードが長くなると理解できなくなるんだよw
関数型プログラミングなら、一気にやるという書き方でも割と珍しくない感じがする。 もちろん面倒なことをやるなら1文あたりが相応に長くなるんだけど。
学習が下手な奴ほど早く学習する事が1つだけある
それは「人に訊いた方がラクだ」という事だ
なんちてw
>>687 一般的なやり方じゃないかも知らんが一応これで行けそう
重複行込み
rcnt = selection.entirerow.cells.count / activesheet.columns.count
重複行抜き
rcnt = intersect(selection.entirerow,columns(1)).count
693 :
デフォルトの名無しさん :2008/10/29(水) 02:45:55
ループの中で =average() の引数を可変的に指定する方法を教えてください 具体例: (1)乱数で10個のデータを生成し,列方向に保存 (2)保存したデータから平均を計算し, 2つ下のセルに出力 (3)上記(1)から(2) を n回繰り返す(とりあえずn=3). 上記(2)がうまく計算できません(下から3行目のコード). --------------- Sub dice_siml01() Cells.Clear Dim i As Integer Dim j As Integer Dim n As Integer Dim nobs As Integer Cells(1, 1) = "試行回数" n = 3 nobs = 10 For j = 1 To n For i = 1 To nobs Cells(i + 1, j + 1).Formula = "=randbetween(1,6)" Next Cells(nobs + 3, j + 1).Formula = "=Average(Range(Cells(2, j+1), Cells(2+nobs-1, j+1)))" Next End Sub --------------- 【注】 randbetween(1,6) エラーの場合 rand()で置き換えてお願いします.
>>693 .formula に入れるのはセルにそのまま打ち込める式
範囲指定のところが "B2:B11" とかの形式になるように、
文字列を生成すればOK
695 :
デフォルトの名無しさん :2008/10/29(水) 09:46:54
>>694 どうもありがと。
できれば、具体的な変換方法もお願いします。
>>695 宿題か何か?
デカい誤り指摘してヒントも出したんだから、
そこからもっぺん自分で考えてみような
じゃなきゃこんな練習問題やってる意味ないだろ
697 :
687 :2008/10/29(水) 10:09:55
>>688 >>692 有難うございます。
「聞くは一時の恥じ...」
なんちてw
セル情報はExcelの基本関数知ってればコード記述で殆ど解決しちゃう
けど速度やメンテを考えるとコードは単純な程良い。
698 :
デフォルトの名無しさん :2008/10/29(水) 10:36:40
>>697 >けど速度やメンテを考えるとコードは単純な程良い。
これは少し間違ってる気がする
速度を考えるなら処理するデータを単純にした上でコードも単純なものにする
例えばセルのプロパティを変数に入れるとか
さらにメモリの使い方にも気を配れればいい
書くと短くても動かすと重たい処理なんてたくさんあるし
コードの見た目(行数、文字数とか)が単純なのと、
実際の処理が単純なのは違うよね
あと
>>699 の自己フォローなんだけど、
selectionの状態に依存するわな、、、w
areasが2-3ぐらいなら
>>687 の方が早いってことで
702 :
デフォルトの名無しさん :2008/10/29(水) 21:27:30
置換に関しての質問なのですが、 検索した2つ右のセルの文字の最後に1をつけたい場合どうすればいいでしょうか?
hoge = "あくまで一例" set piyo = cells.find(hoge).offset(0,2) piyo.value = piyo.value & "1"
【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2007 【3 VBAが使えるか .】 超初心者です 【4 VBAでの回答の可否】 VBAでお願いします。 行の挿入、削除を教えてください。 A B A B C A B C 1 1001 1001 1 1001 1001 1001 1 1001 1001 1001 2 1003 1003 2 1003 1003 1002 2 1002 3 1004 1004 3 1004 1004 1003 3 1003 1003 1003 4 1005 1005 → 4 1005 1005 1004 → 4 1004 1004 1004 5 1006 1006 5 1006 1006 1006 5 1006 1006 1006 6 1007 1007 6 1007 1007 1007 6 1007 1007 1007 7 1008 1008 7 1008 1008 1008 7 1008 1008 1008 @ AB列の数字は同じものが入っています。 A C列に数値が入ります。 B C列に合わせて、A列、B列を挿入、削除したいです。 C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は 行の削除がされると言う具合です。 業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
丸投げはやめようぜ。 自分で作ってみたけど、分からない所が出てきた。とかなら全然かまわないんだけど。 作成依頼所じゃないんで。
すいません、数値がずれまくりました。 もう一度書き込ませてください。 【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2007 【3 VBAが使えるか .】 超初心者です 【4 VBAでの回答の可否】 VBAでお願いします。 行の挿入、削除を教えてください。 @ A B A B A B C A B C 1 1001 1001 1 1001 1001 1001 1 1001 1001 1001 2 1003 1003 2 1003 1003 1002 2 1002 3 1004 1004 3 1004 1004 1003 3 1003 1003 1003 4 1005 1005 → 4 1005 1005 1004 → 4 1004 1004 1004 5 1006 1006 5 1006 1006 1006 5 1006 1006 1006 6 1007 1007 6 1007 1007 1007 6 1007 1007 1007 7 1008 1008 7 1008 1008 1008 7 1008 1008 1008 @ AB列の数字は同じものが入っています。 A C列に数値が入ります。 B C列に合わせて、A列、B列を挿入、削除したいです。 C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は 行の削除がされると言う具合です。 業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
708 :
デフォルトの名無しさん :2008/10/29(水) 22:22:44
>>703 さん
ありがとうございます!!
A列全部で検索かけたい場合どうすればいいでしょうか?
申し訳ございませんでした。 EXCEL総合相談所で聞いてきます。 マルチになってしまいますが、ご了承ください。 レベルが上がったらこのスレに来たいと思います。
>>708 2003だとFindのヘルプにちょうどいい例が載ってるんだが2007では載ってないのか?
他のレスと混同してた・・・
>>708 cells はセル全部
columns(1) は1列目
ヒントはここまで。
dim rg as range rg=activecell 処理 この処理後に、元のアクティブセルに戻る文が書けません。 どんなだったか、教えて。
もう一個、よろしく。 処理の中で範囲を指定してコピー、貼付をしている。 application.screenupdating=false を直前に入れても 画面が動くのですが、画面が動かないようにできませんか?
716 :
y :2008/11/02(日) 18:36:29
>>714 rg.Parent.Activate
rg.Avtivate
ついでに言うと、>714の2行目は構文ミスでエラーになるので修正が必要です。
>>715 CopyメソッドのDestinationプロパティに貼り付け先範囲を指定して、
一度にコピー・貼り付けを行うと、動く枠線が出ないようになります。
>>716 久しぶりなので、マクロの記録で、終わってましたorz
おかげで、思い出すことが出来ました。
サンクス。
719 :
デフォルトの名無しさん :2008/11/02(日) 20:57:01
プログラム用のVBAコードを記述した非表示ブックから、データ用の任意のブック を開き、データブックのイベントに対する処理をしています。 Excel2007はウインドウのタイトル右端の×ボタンが「閉じる」に対応している様 です。 Excel2007でも以前のバージョンと同様に「Excelの終了」にする方法を模索中です。 方法をご教授頂けると有難いです。
720 :
y :2008/11/02(日) 22:45:44
>>718 うは ご指摘ありがとうございます。
>>719 ×ボタンでBeforeCloseイベントが発生するので、
同イベントプロシージャ内に
Application.Quit
を記述します。
range型変数にsetしてないってのは突っ込んじゃいけない所? 最近、微妙な空気が読めなくなってきたよ・・・。
722 :
719 :2008/11/02(日) 23:24:17
>>720 自分もそれでExcelが終了すると思っていたのですが、ブックが閉じるだけです。
SnendKeys(Alt+F4)を試したら終了できました。orz
723 :
719 :2008/11/03(月) 00:23:33
訂正です。 SendKeys(Alt+F4)でもだめでした。 プログラムブック(A)からデータブック(B)を開いて、Bが変更された場合に 変更を保存するかどうかを確認するダイアログが表示されるので、Alt+F4 を送信するとダイアログが閉じられる事になるのでExcelを終了できません。
>>722 application.quit の前にワークブックの close やってる?
後にしてみたらどうなる?2007はわからんけど、、、
725 :
722 :2008/11/03(月) 00:44:26
>>724 もう少し具体的に教えて下さいませんか。
2007以外は×ボタンでExcel終了が終了するようになっています。
同じブックを2007の互換モードで動かして×ボタンでExcelを終了
したいのです。
この方法が分からないのです。
727 :
y :2008/11/03(月) 07:57:50
>>725 2007で試さずに>720を答えてました。2007ではQuitだとうまくいかないんですね?
一応、Shift を押しながら×クリックすれば一発で終了するので、それで用が済むなら。
VBAでのやり方は、後で職場の2007で探してみます。
range型ってsetしなくても使えるの?
範囲指定をしてコピー等をした後、コピーモードををフォルスにした 後のことです。 範囲指定を解除する方法は、どこかのセルをactivateやselectするしか 方法はありませんか。画面のちらつきを少しでも防止したいので、セル指定を したくないのですが、何か方法が無いでしょうか?
久々にExcelのVBA触って改めて思ったけど、本当にVBAっていうかVBって糞言語だな。
>>725 724は具体的に言ってるでしょ。
ダイアログが出るために終了できないのならダイアログが出ないようにすれば?
どうしてダイアログが出るの?
ブックが変更されてるのに保存されてないからでしょ?
だったら保存したら?
こんなのパソコン初めて一週間のオッサンでも最初に覚えることの一つじゃないか。
>>729 全体的に何がいいたいのかよくわからない気がする。
731 :
デフォルトの名無しさん :2008/11/03(月) 10:54:12
どうしてもわからないので 教えていただきたいのですが、 Book1を起動して Book1のマクロで Book2を開くことはできたのですが Book2の内容をコピーして Book1に貼り付けすることができません よろしくお願いします。
>>729 ググってもすぐ見つかるし
マクロの記録でもすぐ解るようなことを何故聞く?
そのものズバリの解除法が簡単に見つかるのに
>>731 Bool2を開くと、戻り値としてBool2のオブジェクトが返る
あとは好きなようにコピーなりなんなりすれば良い
733 :
725 :2008/11/03(月) 11:12:00
>>730 保存するかどうかはユーザーが決める事で、プログラム側で決められる
のは、×ボタンが押されたらWindows2007以外と同様な動作なんだけど。
説明不足?それとも...
734 :
725 :2008/11/03(月) 11:17:49
>>734 だから?
ついでに言えば、お前さんの言っている現象はExcel2007に特有の現象でもなんでもないはずだ。
お前さんが検証もせずそう思い込んでいるだけにすぎない。
全く同じ条件であれば、2003以前のエクセルでも全く同じことが起こるはずだよ。
736 :
デフォルトの名無しさん :2008/11/03(月) 11:43:21
>>735 確かに、Excel2000と2007で同じブックを動作した検証で違いが出た
だけですが...
API
もしかして、.saved や displayalerts の値はいじらずに、
組み込みダイアログをそのまま使ってるのかな?
>>733 組み込みダイアログ出た後の動作が 2007 とその他で異なる可能性あるし、
ユーザに選ばせるなら自前でやった方が確実かも
>665 たとえば、セル(4, 3)に '=A1+A2が記入してあり その式をセル(5, 1)に書き込む場合 Cells(5, 1) = Mid$(Cells(4, 3), 1) でどうでしょう?
いつの話だよ
741 :
デフォルトの名無しさん :2008/11/05(水) 10:16:29
? ActiveSheet.UsedRange.Rows.Count これを実行後するとワークシート上のUndo(元に戻す)が無効になっていまいます。 これって、仕様ですか?
>>741 イミディエイトウィンドウでやるとVBA動かしたの時と同じでUndoできなくなる
?1+1とかでも同じ
でもウォッチ式として使えば問題ない
743 :
742 :2008/11/05(水) 11:11:33
今試したらウォッチ式でもだめだった orz
744 :
741 :2008/11/05(水) 15:12:16
セルの選択範囲が変更になったとき、最終行を調べたいのですが ? ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row だと、保護されたシートの時エラーになってしまう。 他にUndoを生かしたまま最終行を求める方法あります?
>>744 ?WorksheetFunction.Max(ActiveSheet.Cells(65536, 1).End(xlUp).Row,ActiveSheet.Cells(65536, 2).End(xlUp).Row,ActiveSheet.Cells(65536, 3).End(xlUp).Row)
もしくは
Dim lg(2) As Long
lg(0) = ActiveSheet.Cells(65536, 1).End(xlUp).Row
lg(1) = ActiveSheet.Cells(65536, 2).End(xlUp).Row
lg(2) = ActiveSheet.Cells(65536, 3).End(xlUp).Row
Debug.Print WorksheetFunction.Max(lg())
でどう?
746 :
デフォルトの名無しさん :2008/11/05(水) 16:42:43
>>745 有難うございます。
? activesheet.cells(activesheet.cells.rows.count,1).end(xlup).row
で出来たのですが、列を特定しないと駄目なのですよね。
自分も気付いたのですが、
保護されているかどうかでUsedRangeとSpecialCellsを使い分けるという方法
もありますね。
超初心者なのですが、グラフ作成のところで詰まってしまいました。 B2を起点とするデータ B21を起点とするデータ この二つのデータのグラフを作成しようと以下のマクロを作ったのですが、 Set muSouce2 = Range("B21").CurrentRegion のところでエラーがでてしまいました。 この場合どうすればエラーが取れるのでしょうか? Sub Graph1() Dim mySouce As Range Set mySouce = Range("B2").CurrentRegion Charts.Add ActiveChart.SetSourceData Source:=mySouce, PlotBy:=xlColumns ActiveChart.ChartType = xlLine Dim mySouce2 As Range Set mySouce2 = Range("B21").CurrentRegion Charts.Add ActiveChart.SetSourceData Source:=mySouce2, PlotBy:=xlColumns ActiveChart.ChartType = xlLine End Sub
>>747 set mySouce = の時は、データの入ってるワークシートが
アクティブになっててその書き方で行けるんだけど、
set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、
range("B21") がどこにあるのかわからんってさ
>>748 なるほど!!明快な説明ありがとうございます。
つまり、set mySouce2 = の前に、
データが格納されているシートをセレクトすればよかったのですね。
対処だけでなく原因が分かりためになりました!
>>749 そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、
最初にまとめて下準備しちゃえば効率がいいよね
selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい
751 :
デフォルトの名無しさん :2008/11/06(木) 18:01:30
ある値xをアクティブセルの持つ書式に変換した値を取得したいのですが Dim rng as Range Set rng = ActiveCell rng.Value = x この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。 もう少しましな方法を教えて頂けるとありがたいです。
752 :
デフォルトの名無しさん :2008/11/06(木) 18:14:58
>>751 Format(x, ActiveCell.NumberFormatLocal)
セルの書式によってはバグるかも試練がw
そうなんです [G/標準]とかでエラーになる為、セル代入を考えたのですが...
「セルの書式に合わせた文字列に変換」でいいのね ? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal)) とかは?
TEXT関数か・・・ならば worksheetfunction.text(x, activecell.numberformat) これでどうかな?
>>755 書式に和暦や曜日が指定されてるとヘンになるよ
そういうの無視でいいならいいんだけど
757 :
デフォルトの名無しさん :2008/11/06(木) 19:35:05
しつこいようだけど、頼む。 セルについて指定無しの状態にするすることは可能ですか? set rg = nothing とか試してみたけどだめだったorz
>>757 ほんとしつこいなぁ、、、って誰?w
というか、質問の意味がわからない
>>756 自己レス
曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる
>>757 以前やってみようとした事があったけど見つからなかった
本当に出来るのかどうかも不明
>>758 お前頭悪そうだな
>>759 質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ
質問スレで分かってて答えないのは只の無能だと思われてもしょうがない。
>>761 そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ
質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ
喧嘩は他所でスレ立ててやれよ 目障り
自己紹介乙
765 :
デフォルトの名無しさん :2008/11/06(木) 21:53:02
俺も
>>757 の質問がよくわからないし
つか、前に質問したなら名前欄にレス番とか入れてくれ
767 :
569 :2008/11/07(金) 06:17:38
フォルダの中を検索して特定のExcelファイル(○○.xls)を見つけたいのだが フォルダを作る側が適当で(ここの部分は立場上どうしようもないです・・・) Aフォルダ Bフォルダ ○○.xls というパターンもあれば Aフォルダ/Cフォルダ/○○.xls Bフォルダ/○○.xls というパターンもあり、○○.xlsが無いことも2個あることも5個あることもある。ただ幸い○○.xlsの名前は固定です。 このフォルダ内から存在する全ての○○.xlsを開いて中身から数字を 取り出す機能を持ったVBAを作ろうとしています。 フォルダのパスはFOを使って配列に入れてそれを 全てのフォルダパターンを使って○○.xlsを探そうとしています。 そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか? 階層固定のフォルダ抽出、Excelファイルは問題ないのですが 階層実固定のフォルダ抽出で詰まっています。 例えば手抜きですが↓みたいな流れでうまく出来そうですかね? Private Sub AAA() 今のパスを配列に格納 if フォルダが有る時 then call AAA end if End AAA
すんません。上のやつ
>>569 さんじゃないです・・・。名前に入っちゃいました。
>>767 >そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?
試した?
試してもいないのに質問しに来てない?
770 :
751 :2008/11/07(金) 09:34:48
771 :
751 :2008/11/07(金) 09:47:36
ついでにもう1つ教えてください。 xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別 するにはどうしたらよいのでしょうか? ? Application.WorksheetFunction.IsError(x) だとエラーにならないのですが...
どういうエラーでそのxが何か分からないと答えられない セル(Range)なのか数値や文字なのか
>>767 「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ
774 :
771 :2008/11/07(金) 10:50:19
入力したテキストxでAutoFilterの設定・解除をしています。
(フィールドはアクティブセルの列)
この時、xの書式をアクティブセルの書式への変換は
>>751 さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に
Set rng = ActiveCell: rng.Value = x
if WorksheetFunction.Iserror(rng)
とすると、アクティブセルの保存が必要になってしまう為もう少しましな
方法を模索中なのです。
>>769 ちょっと試せない状態だったのでとりあえず聞きました。
>>773 ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。
お騒がせしました。
776 :
デフォルトの名無しさん :2008/11/07(金) 13:14:43
初歩的な質問なんですが、 intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。 二つ目の変数に別のアクティブセルを代入するとerror13が現れます。 どなたかご教授願えないでしょうか?
>>776 アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?
>>776 Error 13は「型が一致しません。」だから
単純にint型に文字列(スペース含む)を代入しようとしてるとか?
セルが空なら0が入るし
膨大な量じゃないならコード貼ってどこでエラーがでたか書いてくれよ
>>774 x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ?
いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな
説明が下手な奴大杉
説明もまともに出来ない不出来な頭だから、問題も自分で解決できずにここに質問に来るんだよ もちろん、本当に難易度の高いことをやっていて、行き詰まって来る奴も居ないわけではないが 殆どが能無しどころか脳無し(調べる考えるという知能的行為そのものが出来ない奴)なんだから ここに居座る(質問者としてではなく)ならそのことは覚悟しなくちゃならない
わからんではないが、そこまで言い放つことでもない 甘え放題も困るが委縮させ過ぎるのもよくない 意味不明な質問を差し戻したり、時々愚痴るぐらいで丁度いい
ヒマだからスレ読み返してたらわかったw
>>757 =
>>729 だね。たぶん
>>715 も同じ人っぽい
screenupdating = false をやっててもちらつくのは、おそらく on / off のタイミングが悪い
たびたび on / off すると、on になった一瞬のスキも見逃さずに画面更新するからちらつく
off にしたらしっぱなしになる位置でやらないと
範囲指定を解除(セルが select されていない状態に)する方法だけど、
高さ・幅 0のイメージを用意してそれを select すれば、
selection が range でない状態にすることはできる
activecell の参照は直前のまま保持されるけど、シート上の囲み枠は出ない
でもさ、解除ができても、指定/解除を繰り返せばどのみちチラチラするよ
ちらつき防止なら、screenupdating のタイミングを確認するのがいいと思う
786 :
デフォルトの名無しさん :2008/11/08(土) 17:49:36
>>785 ベリー、ベリー、サンクス
お見込みのとおり、その3つは折れです。
展望が開けました。
サンクス。
Enumとして宣言さている列挙型のmember名をStringとして取得できますか?
販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。 ・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述 ・実行ボタンを押す ・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す
だれのための、どういう報告なの?
790 :
788 :2008/11/09(日) 11:36:43
販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。 ・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述 ・実行ボタンを押す ・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す そんなマクロなんだけど、毎日販売管理ソフトから吐き出されたxlsファイルをBook1.xlsと同じ階層にコピーして、ファイル名を記述しないといけないのだけど、 xlsファイルをxlsファイルにドラッグアンドドロップとかでファイル名を取得して実行できるようにする方法ってありますかね?
>>787 スレ違い
それはVBAではなくVB言語の質問だ
>>790 あるけど、それはWindowsの設定の問題だ
windows弄ったら出来るのかー。 ほんと言うとVisualStudioでEXE形式にできたらいいんだけどね。 VisualStudioからEXCELのコントロールわからんしな;;
できないだろ 無理にやると普通に開けなくなるだろ バッチファイルかWSHにドロップして 引数を環境変数に設定して xlsファイルを開き 環境変数を見る
いつもそんなことやってるの?
>>790 普通にアドインを作れば解決するケースに思えるけど。
アドイン??
「Excel アドイン」でググってトップのところに詳しい説明があるから それを読んだ方がいいよ。 VBAのコードが普通に書ける人ならすぐに理解できると思う。
799 :
788 :2008/11/09(日) 21:34:13
800 :
655 :2008/11/10(月) 00:15:33
>>655 If Weekday(Date) = 7 And (Day(Date) + 7) \ 7 = 3 Then
Range("A1").Value = "明日は第三週の日曜日"
End If
正直な話、説明がさっぱり理解できてませんでしたが、がんばったらできました。
>>786 書いて良かった。誰?とか言ってゴメンなw
>>790 処理対象ファイルが自動的に特定できれば一番ラクそうだけど、
人間が見ないと特定できないの?
あるフォルダ内でタイムスタンプが今日付けの .xls とかでも無理?
正直、アドインにする利点がピンと来ない、、、
>>801 販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
たとえは今日なら20081110.xlsって手打ちで名前をつけてね。
それをこのマクロの入ったBook1.xlsから呼び出すんだ。
それを、アドインにしておけば、xlsを吐き出すことなく、読み込むcsvの名前をつけて保存すればよくなるだけだなと思ったら、これはいいアイディアだと思う。
>>802 >販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
保存する前の段階でBook1.xls開いてマクロ動かせばいいだけじゃね?
一々保存してからマクロ動かさないといけない理由でもあるのか?
>>802 なるほど理解した。けど単にツールバーにマクロ登録でいいような、、、
今までが無駄過ぎただけだな。
>>803 保存しないとファイル名がないから別のブックからコントロール奪えないと思ってたorz
>>804 それがアドインかと思ってたorz orz
>>804 そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。
>>808 ツールバーにマクロ登録すると
その販売管理ソフトが吐き出したブックをExcelで開いたときにマクロを動かせます。
うーんだからマクロっていうのはだなあ.....ってところから説明しないとダメ?
マクロが記述してあるだけのブックを用意して そのマクロをツールバーに登録するんだよ ネットワーク越しでも大丈夫だし
812 :
デフォルトの名無しさん :2008/11/10(月) 23:38:11
初心者なので、丸投げでお願いします。 application on timeを使って、 開始したら、 a時に処理1をやって、その20秒後に処理2をやって、その8秒後に処理3を やって、終わる。 というものです。 どうにも、最近、頭が回らなくなって困ってます (~.~)
はい次の話題
812の追記 処理1は、マクロ1。処理2はマクロ2。処理3はマクロ3と いうことでお願いします。
A1に「08/11/11」と入力されているのをB1に「20081111」と変換させるマクロを作りたいと考えています。 Cで書くと下記みたいな流れになるかなと思うんですが・・・(間違ってるかもしれませんが) abc ="08/11/11"; sscanf(abc,"%d/%d/%d",&a,&,b,&c); printf("20%02d%02d%02d",a,b,c); VBAで書くにはどんな関数使えばいいのでしょう。
816 :
812 :2008/11/11(火) 01:45:58
自己解決できましたので、
>>812 814はスルーでよろっ。
817 :
815 :2008/11/11(火) 02:02:40
文字列操作でこうやってみた tmpdate_y = CStr(Left(Sheet1.Range("A" & i).Value, 2)) tmpdate_m = CStr(Mid(Sheet1.Range("A" & i).Value, 4, 2)) tmpdate_d = CStr(Right(Sheet1.Range("A" & i).Value, 2)) tmpdate = "20" & tmpdate_y & tmpdate_m & tmpdate_d スマートじゃねえよなーorz
>>815 いったん日付型にしてから書式変換するとラクだと思う
文字列→日付型への変換は cdate()
日付型→書式付文字列変換は format()
詳しくはヘルプ読んでね
すいません質問です エクセルのマクロで module1内にコード書くのと sheet1内にコード書くのとでは 動作にどんな違いがありますか? sheet1から他のシートを対象としたselectionメソッドが失敗するようなのですが・・・
訂正)Selection→Select
こんばんは 複数のセルの値を一度に比較することってできますか? Sheet1のA1:B5とSheet2のA1:B5のValueが 同じであるかどうか、が分かるだけでokなのですが。
各シートは配列のようにアクセスできるが
Excel2003を使っています。 羅線の太さを調節する方法ってありますか? できるだけ細くしたいのです。
>>825 マクロの記録使って保存すればおk
単純に細くするだけの質問ならスレチ
Excel2000:WindowsXP/Pentium4(1.8GHz)/RAM512 セルA1とA2を結合したシートに対して 下記のコードの実行時間は 1回目:13秒 2回目以降:54秒 (Pasteに変更すると29秒) 1回目と2回目以降の違いの理由は何なのでしょうか? rows(1).select selection.copy selection.offset(1).resize(20000).select selection.insert shift:=xlDown selection.mergecells = false selection.delete shift:=xlUp range("A1").Select どうやったら速度アップできるか知りたいのですが...
羅線ってなんだ? らせん?
螺旋 罫線 新羅 確かに間違える人は居るかも
830 :
827 :2008/11/12(水) 14:59:51
やりたい事は シート・アクティブ時にコピー挿入し編集 シート・ディアクティブ時に挿入データを削除(元の状態に戻す) なのです。
> 1回目:13秒 > 2回目以降:54秒 (Pasteに変更すると29秒) 単位、「秒」じゃなくて「_秒」の間違いだよね?
秒です。
セルを結合していなければ1秒未満です。
いや、結合していても_秒でしょ
結合云々は関係なく1秒かからんな データは何かあるのか? とりあえず高速化のために Application.ScreenUpdating=False はやってるよな?
新規ブックでセルをマージし、
>>827 のコードを走らせただけです。
ScreenUpdating, EnableEvent, Calculation等もやってみています。
マシン・スペック(5年前)の問題でしょうか?
スペックは漏れのマシンのほうが悪いくらいのはずw 計測方法の問題じゃないか?
すまん、Mobile Pentium4の間違いだったorz
Mobile Celeron(1200MHz)512MB RAM Mobile云々は置いといてこっちは1.2GHzなんだよw OSが2kだからってここまで差は出ないよな? 体感でも1秒以上かかってるのか?
excel2003:WindowsXP/Pentium4(2.8GHz)/RAM512 でセルA1とB1を結合して走らせてみたら 1回目:9秒 2回目:40秒 体感で1秒未満は、セル結合無しの場合だけ
あぁA1とB1を結合かw それなら確かに遅くなるな
842 :
827 :2008/11/12(水) 18:00:26
>>827 のA1とA2はA1とB1の結合に訂正願います orz
俺の古典的環境だと1回目20秒、2回目1分40秒w 遅過ぎワロタw
>>830 どこまでが編集前でどこからが編集後?
編集は .mergecells = false の前?後?
*)シート(A1とB1結合)アクティブ時の処理 rows(1).select selection.copy selection.offset(1).resize(20000).select selection.insert shift:=xlDown 'コピー挿入した行に名前を付ける(後で削除の為) *)コピー挿入したデータへの編集 *)シートディアクティブ時の処理(アクティブ時点の状態に戻す) '実際にはSelectionでは無く名前で削除 selection.mergecells = false '<- これ無しだと遅くなる為 selection.delete shift:=xlUp range("A1").Select
メモリ1ギガとか積んでいる人だと1回目と2回目の差が無いなんて事ないですか?
>>845 了解
多数の結合セルを含む範囲で挿入/削除を続けてやると、後でやる方の処理が遅くなる感じ
メモリ上のシート情報がややこしくなるのかな?1回目をやった後ブックを閉じて開き直すか、
シートコピーでリフレッシュすれば2回目が遅くならないけど、イベント拾うならキツイよね
オレなりに試してみた限りでは、
挿入時: .insert を使わず、2行目以降にデータがあった場合は 20000行ずらした位置へ
コピーし、狭間へ 1行目を 20000行分コピー
削除時: 最初にシートコピーでバックアップを取っておいて、.cells.copy でコピーし戻す
( .mergecells = false もいらない)
ってなやり方が一番早かった。1回目は大差ないけど 2回目が 1回目より早くなる
848 :
845 :2008/11/13(木) 13:26:06
>>847 有難うございます
挿入処理は、
insertを使わない方法(Paste)は、定義されている名前がある場合面倒そうです
削除処理は、
ご指摘のシートコピーを戻す方式を実際の処理に組み込んでテストしてみます
>>848 名前か。それは厄介だ
挿入に insert 使ってコピー書き戻すと名前付き範囲の内容書き変わるし
insert だけでも 2回目は遅くなるし
後は、編集時にシートコピーしたシートを使っといて、deactivate されたら
シートごと削除とかかなあ。イベントあるからいろいろめんどくなるんだよな、、、
シートのコピーから戻す方式を試したら更に時間が掛かる様になってしまった
>>850 データ量や数式、書式設定その他によってかなり違うだろうね
オレのはあくまで
>>827 の条件で試しただけだし
>>847 の処理における名前付き範囲は、挿入時に
range("namedarea").offset(20000).name = "namedarea"
コピーバックの後に .offset(-20000) で、わりと簡単に対応できた
画期的なやり方は見つからんね。構成とか見直すしかないかも、、、
853 :
851 :2008/11/14(金) 00:13:24
とりあえず、A2:Z3000 をテキトーな数式で埋めて試して見たけど、
やっぱ
>>847 のが早かった。calculation 切れば数式なしの時とあんま変わんない
とにかく insert (特に 2回目)が遅いんで、insert とコピーバックの組み合わせでは
効果ないかも
854 :
デフォルトの名無しさん :2008/11/14(金) 21:41:28
はじめまして、こんばんは。 今日はじめて本屋にて VBA の存在を知りました。 初心者質問ですみません、例えば、、、これができるようになるとなにができるようになるのですか? 詳しいかた教えてください。
855 :
デフォルトの名無しさん :2008/11/14(金) 22:05:58
>>854 例えば野球データベース
選手名を入力すればその選手のプロでの全成績が一覧表示されるとか
インベーダーゲーム作ってる人もいるよ
とにかくExcelをVBAプログラムで自在に操れるって事
>>854 業務で言うと、データベースをexcelに展開して、
色んなチェックプログラムを掛けて品質保証したりとか。
ワークシートで使える関数を作って会社内に配布したり。
excel上に検索エンジン作ってる人もいるし、まぁ、何でもあり。
857 :
無職カス :2008/11/16(日) 02:50:07
みなさん、こんばんは、
>>854 です。
>>855 >>856 さん 返答ありがとうございます。かなり使える機能ですね。
最近アルバイトをやめました。時間はたっぷりありますのでそこそこ使えるレベルまでもっていきます。
これからVBAを勉強していきます。
多々質問すると思いますが、みなさんよろしくおねがいします。
858 :
デフォルトの名無しさん :2008/11/16(日) 03:45:10
下に全員の成績表があって、 そこから各部門のトップ5を上の小さい表に抽出したいんだけど、 ランクとは違う気がするし行き詰っています。 どなたかご教授願えますでしょうか?
officexpのマクロと関数の処理順(と思われる事項)で知恵を貸していただきたく書き込みいたします。 セルAの値によってセルBの値が変わるよう関数を設定しているの状況で、 セルBの書式が自身の値によって変わるようにマクロを組もうとしています。 (書式は4種類以上なので条件付き書式は使えません) worksheet_changeで書式変更を自動実行するようにしたのですが、 マクロを実行してみるとAの値を変えてもBの書式が変わりません(Bの値は通常通り変わります) その状況で、まったく関係ないセルCの値を変更するとBの書式が変わったので、 マクロ自体には問題はないようです。 おそらく、A変更→マクロ自動実行→関数でBの値変更、という内部処理があるために マクロによる変化が見られない状況であると思っています。 (違っているなら根本から考え直さないといけないかもしれませんが) このような構成の場合、関数による値の変更が反映された後で 書式変更などのマクロが実行されるようにすることはできないのでしょうか? ご教示お願い申し上げます。
Calculate
>>860 ご回答ありがとうございます。
5分前にcalculate使えばいいと気づいて、自己解決した旨書きにきたら
既にお答えくださっていたのですね。
初歩的な事でお手を煩わせてしまい、申し訳ございませんでした。
>>857 基礎を勉強するには独学でも全然問題ないけど、
プログラム未経験で、かつ仕事に就いてないとなると、
プログラムの基本的な事を理解するまでに半年か1年かはかかると思う。
んで、そこから先は明確な目標が無いと無理。
やれる事が多いんだけど、ぶっちゃけた話、特化したプログラムには敵わない。
例えば
>>855 でゲームの話が出てたけど、確かに作る事は出来る。
けど、VBAからAPI呼び出してるに過ぎないし、更に言えば
タイムラインって概念がある&ドローツールのFlashなんかには到底及ばない。
ExcelVBAはあくまでExcelの処理系統のプログラムだと俺は考えてる。
Excel上での処理に関してはVBAがぶっちぎり。当然だけどね。
何か目標持った方が良いよ。
>>859 calculate使う理由が分からん・・・。
VBAで処理してるなら、VBAでBの値も弾き出せば良いんじゃないか?
というか、条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に 問題ありかと... それがExcelのポリシーというのであれば、そういうアプリめいたものを Excelで作ることが間違いだったということになるか...
> 条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に > 問題ありかと... という意見が多いので、2007で設定数が 3 から 無制限 に、 優先順位も設定を書き直さずに変更できるようになった。
ということで、Excel2007以降の購入をお勧め
てゆーか、条件によって変化するセルの書式の種類は3つに留めておく というのが無難かと
>>864 selection changeイベントで好きなだけ設定しろ。
おまいのVBAは飾りもんか?
869 :
デフォルトの名無しさん :2008/11/18(火) 17:07:45
870 :
デフォルトの名無しさん :2008/11/18(火) 20:26:27
質問です。バージョンはexcel2007です。 Dim a As Byte a = 5 Do Until Cells(a, 5).Value = "" Cells(a, 3).Interior.ColorIndex = 10 a = a + 1 Loop cells(a,3)から(a,15)まで同じ処理をしたい場合はどう記述すればいいですか
>>870 Dim a As Byte
a = 5
Do Until Cells(a, 5).Value = ""
Cells(a, 3).Interior.ColorIndex = 10
a = a + 1
If a = 16 Then
Exit Do
End If
Loop
>>870 byte型宣言はいくらなんでも無いんじゃないかな・・・。
aの使用目的が行数って分かってるんだし、そこはlongに宣言すべきだと思うんだけど。
Dim i As Long
For i = 5 To Cells(5, 5).End(xlDown).Row
Range(Cells(i, 3), Cells(i, 15)).Interior.ColorIndex = 10
Next
短い構文でも同じ処理は出来るんでないかな。
870って無限ループじゃないの
Range(Cells(5, 5), Cells(5, 5).SpecialCells(xlCellTypeLastCell)).Offset(, -2).Resize(, 13).Interior.ColorIndex = 10 こうか?
>>874 の説明でなぜかものすごく納得してしまったw
878 :
877 :2008/11/19(水) 08:48:08
Const adLF = 10 宣言しなくても出来ちゃったんだけど問題ないのかな?
参照設定したんならいらないでしょ
どうして?
参照先で宣言されてるから
なるほど、 ADODB.Streamが良く分らなくても動いて良かったです^^
885 :
デフォルトの名無しさん :2008/11/22(土) 00:09:26 BE:208299124-2BP(1028)
automation error The object invoked has disconnected by the client これ、どうやって解析したらいいの? ユーザフォームからFiledialogでファイルを開くと 出るんだけど・・・ で、そのうちFM20.dllでメモリアクセスバイオレ〜ションになる
CreateObjectでIEのフォーム送信を操作して、 帰ってきたページのリンク先の情報を取得したいと思ってます Debug.Print objIE.Document.Links.Length で見ると値は4なので フォーム送信前のリンク先の総数は4だと分かるんですが、 送信後に帰ってきたページのそれの総数(その他もですが)の取得ができません set objIE = Nothing で一度解放してから再度 CreateObject("InternetExplorer.application") でバインドするだけでは駄目なのでしょうか "システムエラーです: &H800004005 (-214767259) エラーを特定できません" というエラーが出てしまいます あともうちょいの様な気がしますので、どなたかご教示お願いします
なんでわざわざ解放するの?
888 :
886 :2008/11/22(土) 21:43:56
>>887 きちんと取得できるのであればわざわざしないので、
取得方法を教えて頂きたいのですが…
>>888 読み込み終わるまでウェイトは入れてる?
890 :
886 :2008/11/22(土) 22:30:48
>>889 一応前後に1回ずつ入れてます。こんな感じでしょうか
READYSTATE_COMPLETE = 4 をWhie〜Wendでループさせて待ってるので合ってると思いますが…
Debug.Print "objIE.Document.Links.Length = " & objIE.Document.Links.Length ←リンクの数(=4)
Call WaitBrowserResponce ←ウェイト
With objIE.Document.Forms("SQL_FROM") 'フォームにSQLのコマンド(WSQL)をぶち込む
.Item("SQL").Value = WSQL
.submit
End With
'ここでフォーム送信されます
Call WaitBrowserResponce ←ウェイト
Debug.Print "objIE.Document.Links.Length = " & objIE.Document.Links.Length ←こいつが4のまま
ここでリンクの数を再取得(前のページのでなく新しいページのが欲しい)したいのです
891 :
886 :2008/11/22(土) 22:32:45
念のためIEのウェイト処理をば Private Sub WaitBrowserResponce() 'IEの処理が終わるまで待機 While objIE.ReadyState <> 4 'READYSTATE_COMPLETE = 4 Debug.Print ".ReadyState = " & objIE.ReadyState Debug.Print ".Busy = " & objIE.Busy While objIE.Busy = True DoEvents Wend Wend Debug.Print "------------------------" ←単なるイミディエイト窓の区切りです End Sub
他のxlsファイルを開きたいんだけど、想定されるフルパスが特定できないので、今開いてるxlsからの相対参照したいんだけど、マクロの記録でやると絶対参照で記録されるよね;; 相対参照ってどう記述すればいいんでしょう
>>892 まず、chdir thisworkbook.path で今開いてるブックのフォルダに移動してから
同じフォルダ内なら workbooks.open filename:="Book1.xls"
下のフォルダ内なら filename:="\Folder1\Book1.xls"
上のフォルダ内にある別のフォルダの中にあれば filename:="..\Folder2\Book1.xls"
ふたつ上のフォルダ内なら filename:="..\..\Book1.xls"
んな感じで
>>893 すげーーーー!
書き込んだあと、いろいろ探してそれっぽいのは見つけたんだけど、このソースが一番短い!!!ありがとう!!
>>891 ちゃんとループ内に入ってることは確認済?
.readystate が変更される前に飛んで来てたりしてないよね
.document.readystate とか、document_completeイベントとかでのチェックはもう試した?
IE が値を返すタイミングはあんまり信用できないから、いろいろ試した方がいいかも
RANGE("A1")の 1を変数にしたい場合⇒RANGE("A" & format(i))というのを見つけたのですが、 Aを変数にしたい場合はどうすればよいでしょうか?
>>897 普通に変数を & で繋げばOK
dim a as string: dim i as long
a = "A": i = 1
debug.print a & i ' ←これでも行けるけど
debug.print a & cstr(i) ' ←ちゃんと型を揃えたければこっち
つか、cells 使った方が効率いいよ
>>898 ありがとうございます
とりあえず、a="A"(列名)を列番号からmid関数で取得して、使ってみます。
900 :
886 :2008/11/23(日) 22:24:38
>>896 ようやく仕事から帰りました
ループの囲みや最初のreadystateのチェック自体はOKだったのですが、
どうやら2回目以降のループで実際は読み込みが間に合ってなかった模様です
Do
Do
Application.Wait Now + TimeValue("0:00:01")
DoEvents
Loop Until objIE.Busy = False
Loop Until objIE.ReadyState = 4
として、最低1回以上のウェイトを挟んだ上でreadystateの値が4になるまで
ループを回す事で、きちんと最後まで読み込めるようになりました
>>899 なんか回りくどいことするんだね、、、いいけどさ
>>900 オレなら外側のループにも doevents 入れたくなるんだけど、
動いたんならいっかw
>>899 cells(1,1).select
ってやってみ。
2007を持ってる人に聞きたいんだが、2007のFindメソッドのヘルプの使用例は2003同様間違ってる?
904 :
デフォルトの名無しさん :2008/11/25(火) 01:56:12
VBAでHTML形式のメール送信する場合に使用可能な フリーのオブジェクトって何があるか教えてくださいエロイ人 BASP21なんかフリーだけど、送れるのはテキストだよね 試しにBodyにHTML書いてみたら、そのままテキストで着ちゃったよママン
>>905 即レスありがとう
ありゃ?これは有料じゃなくて無料でもできるのですか?
ちょっと読んでみても区別がつかなかったので、あとでじっくり読んで見ます。
あるwebページをIEオブジェクトで操作して、リンクをクリックさせたら別窓でリンク先が表示されました 今後この別窓のIEオブジェクトを掴んでアクティブにして操作するにはどうすればいいのでしょうか? 文系のなけなしの知識でウィンドウハンドルを取得すればいいと思い当たり、 For Eachで各ウィンドウのそれの取得だけはできました(たぶん) Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long (中略) hWnd = GetForegroundWindow Set objShell = CreateObject("Shell.Application") For Each objIE In objShell.Windows Debug.Print objIE.hWnd Next ウィンドウハンドルの値は取得できても、アクティブにしたい(操作したい)ウィンドウの それだと判別する方法が解らないので、どなたかご教示&ご解説お願いします
910 :
903 :2008/11/25(火) 22:02:32
>>907 そっか、相変わらずか。
報告は山ほど行ってるはずなのに。
>>910 俺も勉強してる時、ヘルプの使用例には
何度も泣かされたよ。
912 :
デフォルトの名無しさん :2008/11/26(水) 08:19:57
10日で覚えるシリーズの入門編を読んだけど、 次ぎは、どの様な本がお勧めですか?
本屋に行って自分の好きなん選べ
Excelを使う必要はないわな。
>>914 教えてもえらなかったからって逆切れですか?
917 :
デフォルトの名無しさん :2008/11/28(金) 09:55:34
VBAのクラスやデザイン・パターンを解説している書籍やサイトは ありませんでしょうか?
OOP
酔ってるから間違えた OOP極めてるオレに聞け
vbaでデザパタとかw
921 :
917 :2008/11/29(土) 00:15:40
エクセルVBAでユーザーとパスワードで制限されたネットワークドライブのディレクトリにあるファイルの タイムスタンプとファイルサイズを取得することはできませんでしょうか?
ネットワークドライブとは?
>>923 社内LANで繋がれたネットワーク上のドライブですよ。
VB.netでやった方がいいのかな。
別にどっちでやってもいいけど、Excelに関係ないことはここでは聞かないでね
>>1 ★3,★4
926 :
デフォルトの名無しさん :2008/11/29(土) 10:11:34
EXCEL VBAで将棋とか囲碁とかオセロって作れますか?
930 :
デフォルトの名無しさん :2008/11/29(土) 13:45:58
FormulaR1C1って何? Range("A1").FormulaR1C1 = "hello" と Range("A1").Value = "hello" だと何が違うの? Range("A1").FormulaR1C1 = "=R[1]C + R[2]C" と Range("A1").Value = "= A2 + A3" も同じ結果になるね。 FormulaR1C1はダブルコーテーションの中をパースして「あ!RとかCがあるからこれはセルだな!」とか 独り言をつぶやきながらR[1]CをA2に置き換える作業をするところがValueへの代入と違うトコなの?
>>930 a = 1とa = 1; b = aと何が違うの?
VBA BrowseForFolder この引数について、詳しく 書いてあるサイトありませんでしょうか。
あまりの酷さに涙が出てきた・・・。
たしかにムンバイのテロは酷かったなあ。 死者が200人を超えるとも言われてるし。
937 :
デフォルトの名無しさん :2008/11/30(日) 10:08:03
Vista 2007です。 VBAって参考本みると簡単な操作で いかにも思考ルーチンなんか作れなさそうなんですが そんなことはないのですか? VBAって入門書が多くて上級本がないように思うのですが
なに思考ルーチンって オセロとか将棋か?
VBAで行う必要はありません。
入門書いらないレベルなら自分で考えればいいじゃん
>>937 言語の能力としては可能だが、VBAで組む必然性がない
複雑なアルゴリズムならVBAでやらないほうがいい。 言語としての記述力に欠ける。
あんな入力中にいちいちエラーだとか騒がれたんじゃ 落ち着いて作れないしな。
Cとかで書いておいたアルゴリズムをモジュールとして VBAに取り込む方法があるんですか?
>>944 APIが使えるから似たような感じでなら使えるんじゃないかな?
自作DLLではやったことないけど
Cの関数でDLLを作ってDeclareで取り込むか、ActiveX(COM)コンポーネントとして作って 「参照」で取り込むかのどちらか。 前者の方が簡単。
VBから逃げたいだけなら、 JavaScriptを使うか(もちろんScriptのCOMを使って)、 WSHでXML書いてCOMオブジェクトに仕立てあげるか。
948 :
デフォルトの名無しさん :2008/12/01(月) 20:13:06
VBAは専門家の人から見ると、エクセルの補助的なものに使用するという認識ですね。
>>943 チミプログラム書いたことないでしょ?w
エラーチェックはオプションで切れる
XP&Excel2003で、フォーム上にコンボボックスを作りました。 コンボには複数のアイテムを入れるんですが、 その中で最も長いアイテムを表示できるよう、 最初に表示する時点で自動的にサイズ調整はできるでしょうか?
VBAのコントロールなんてただでさえ標準コントロールのサブセットみたいな 扱いなのにそんな妙なところだけ親切(いや俺にはそんな機能が親切とは思えんが) だったりするわけないだろう常識で考えて。。
>>948 だってそれが主目的じゃん。
photo shop持ってるのに、paintでレタッチするようなもんだ。
>>948 別にExcelにひっつける必要はないと思うよ。
MSXMLでXMLをいじくったりしてるし。適当なVBのメモパッドだと思えば。
Excelだとデータをそのままシート上で
表現できるからいろいろとぬるぬる処理できて便利なんだよね。
>>951 自分で文字列の長さ測って適当なサイズ設定してあげるしかないんじゃないかな。
プロポーショナルフォントはもちろん解除してね。
>>951 自動で調節する方法はない。
どこか作業列にアイテムを入れてセル幅を自動調節して結果をチェックするのが一番簡単。
完璧にやるならWin32APIのGDI関数で文字列の幅を取得。
956 :
デフォルトの名無しさん :2008/12/02(火) 21:22:57
Excel VBAの良書ありませんか? 業務でたくさんの仕様書を書いたりしているわけですが、 作った大量のブックの書き方が間違っていた場合など、 これを一つ一つ開いて、手で同じセルに同じ文字を打ち込むわけです。 これがバカらしいのでマクロを作りたいです。 当然必要になるであろう機能といえば、マクロでブックを開くとか、上書きするとか、閉じるとか、上書きで閉じるとか。。 つまりこういうことをするのに便利なリファレンスマニュアル的な本が良いです。 三角関数だの、キューブだの、そんなものはどうでも良くて。 で、逆引き系で、「ブックを閉じるには」っていう一見気の利いた見出しが合って 開いてみると、実はブックの閉じ方だけが載っていて、関連するであろう 「保存して閉じる」とか「上書きで閉じる」とかそういう機能はまったく触れてないような やっつけハウツー本はいらないです。 m(_$_)mよろぴこ
最近VBA本の質問多いけど、本見るよりもググった方が早いと思うけど
ああ。そうだよねぇ。普通そうだよね。そうなんですよ。 でも客先だとグーグル禁止なの。・゚・(ノД`)・゚・。
>>958 VBAのヘルプ以上のことが書いてある本はまずない気がする。
というか、VBAなんてヘルプがあれば当たり前の作業は当たり前にできるでしょ。
Win32API使わないとできないようなこと(まあ普通に多い)が書いてある本はまずない。
まず客を説得することを考えるべきだろうね。
客が余程の馬鹿か君の説明能力が欠如してなきゃweb閲覧ぐらい許可するでしょ。
しかし、そんなレベルの人を使ってる「客先」が気の毒になるな。
グーグル禁止どころかネット禁止の職場なんていくらでもあるが
合理性の話をしているのであって「ある/ない」の話なんぞした覚えはないが。 しかし、なんて馬鹿って得意げなんだろう。 20年30年生きてりゃ自分の知能が如何程かわからんわけでもあるまいに。
> まず客を説得することを考えるべきだろうね。 > 客が余程の馬鹿か君の説明能力が欠如してなきゃweb閲覧ぐらい許可するでしょ。 許可するしないとか問題外なの どうやっても"できない"職場なの
俺はエスパーじゃないからそんなこと知るかよ。
>>958 になんて書いてあるんだよ。
久々に見たわこんなトンチキ。
久々に見たわこんな上から目線のやつ。
禁止というか、そもそもそこにネット回線が引かれてないとかね。
>>962 その通り。
そしてWebの許可をもらうとかそういうことは論点でもない。>なんかやたら威勢の良い世間知らずの方
ExcelVBAでユーザーコントロールって作れる?
>>966 >>958 本人かどうか知らないが、そういう台詞は状況を正確に書いてから言ったらどうだ。
まあこの手の馬鹿に何いっても無駄だろうけど。
まあこの手の自意識過剰で偉そうぶった馬鹿は何いっても無駄だろうけど。
Excelに付属のオフラインヘルプだとちょっと足りないんだよなあ。
昔はMSDNのCDに詳しい追加のヘルプファイルが入ってたけど、今でもそういうのはあるんだろうか。
VBとWIN32のヘルプをノートパソコンに入れて持ち歩いてたよ。
とりあえず持ち歩くなら技術評論社のポケットリファレンスが小さくてオヌヌメ。内容はちょっと薄いけど
ちょっとセルにデータを入れたいとか簡単なプログラミングならこれで十分。
ttp://www.amazon.co.jp/dp/4774135674
本の有無を質問するのにネットワーク環境まで書きたくないです。もう良いです。
と、思ったら
>>970 ありがとうございます。早速チェックします。
よく書店に売ってる分厚い本でいいと思うんだけどなあ。 正直、必要な記憶つったって仕様書とか扱うだけならごくごくわずかだし、 リファレンスが必要とは思えない。 分厚い本の最初だけ懇切丁寧にやって 後は興味のあるプロパティとメソッドだけおぼえりゃしたいこと出来る。
モバイル持ち込むか、ダメなら携帯でググれよ。 馬鹿か?
俺秀和システムの「〜大全」の本、仕事半分趣味半分で10冊以上は持ってるけど、 いざって時にピンポイントで役立つのはやっぱネットの情報だなぁ 先人はみな自分が考えるような疑問や壁に既にブチ当たっているものであり、 自分が天才か途方も無いアホでない限り、そこには大体たどり着けるしね でもそれ専門で食ってでもない限り、少しずつ腕は錆びるものだし 覚えた知識もすぐに薄れていくから、それを繋ぎとめるためにも書籍はやっぱ必要 俺は自宅のトイレで本読む癖あるから、半書斎化してるよ
>>974 ネットが駄目というくらいだから、持ち込み制限とかありそう。
持ち込みとか当然無理に決まってるだろう。 携帯は仕事中にいじるのは良くおもわれないからひかえてる。 いちいち「VBAの文法調べてるんですよ」とか弁護しながら使うのは嫌だw
無能だと思われるのは気にしないんだ。 好きにすれば?
>>977 間違いなくお前さんが勝手に思い込んでるだけ。
いや正確に言うと、「そう思い込むことにした」だけ。
自分のコミュニケーション能力の欠如を直視する代わりに、ね。
だから余程馬鹿な客でもなければ、「自分が雇ってる人間の生産性の向上に繋がること」
=「自分が得すること」を拒否なんかするかよ。
本当最近こういう社会人として最低限のコミュニケーション能力が欠如してる奴が多くて困るんだよ。
日本国内でラボに携帯電話、ノートパソコン、USBメモリなど一切持ち込み禁止の会社なら知ってるけど、 書籍の持ち込みまで禁止ってのはちょっと聞いたことがない。 たぶん俺が知らないだけなんだろうけど、世界は広いんだなあ。
俺の職場は入館するときに金属探知機通るんだぜ
勝手に下にいるだけだろ
>>979 ここは社会人指南スレッドじゃありませんので、
いい大人が説教こくのはやめてください。
985 :
デフォルトの名無しさん :2008/12/03(水) 01:20:17
>>985 hatenaを読んでも判らないのならhatenaで聞くか諦めるのが宜しいかと。
メモ帳に張る必要はないんじゃ? ただ単にセルにある値を順に.txtで保存するだけでしょ。
988 :
デフォルトの名無しさん :2008/12/03(水) 01:38:42
実はデータが2000ほどあってとても手作業では・・・ .write Replace(ActiveSheet.Cells(i, 2).Value, vbLf, vbCrLf) の部分で引っかかってしまって。
>>988 Sub a()
F = "c:\data1\" 'フォルダ指定
r = 1
While Cells(r, 1) <> ""
Open F & Cells(r, 1) & ".txt" For Output As #1
Print #1, Cells(r, 2)
Close #1
r = r + 1
Wend
End Sub
>>989 さま
本当にありがとうございます。
助かりました!
991 :
デフォルトの名無しさん :2008/12/03(水) 08:03:12
入門書を読んだだけの私にはサッパリ・・・
>>984 いい大人じゃないだろ。社会経験ほとんどない青二才丸出しだろ。
>>979 Web閲覧を許可した場合のリスクとメリットの比率の問題だろ
メリットのほうが大きく上まれば許可するかも知れんが
そんなことはまずないなw
ところで誰か次スレを・・・
てか、その程度の事が出来ないような奴に仕事頼むなよ。 マジで。
>>975 excelで判らないことがあるとトイレに駆け込む姿を想像した
996 :
975 :2008/12/03(水) 20:32:08
>>995 便意を催すとExcel本掴んですごい勢いで入る事は結構あるよw
まぁExcelに限らず専門書の類なら何でもだけど
次スレをVBAを駆使して立ててください。
1000なら次はなしw
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。