Excel VBA質問スレ Part8
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/08/25(月) 23:16:33前スレ 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)
0002デフォルトの名無しさん
2008/08/25(月) 23:18:5401 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
0003デフォルトの名無しさん
2008/08/25(月) 23:28:51乙
0004デフォルトの名無しさん
2008/08/25(月) 23:31:24入力文字列の書式が「999-9999-9999」か「9999-99-9999」だけなら、
x = split(入力文字列,"-")
x(0)="(" & x(0) & ")"
debug.print join(x,"-")
0005デフォルトの名無しさん
2008/08/25(月) 23:32:460006デフォルトの名無しさん
2008/08/25(月) 23:51:55これだけコンパクトに洗練されたIDEってほかにないだろ?
しかもお手頃。Excelに最初からついてくるんだぜ。
そんでExcelからマクロの記録とかやれば馬鹿でもチョンでもコードがかけるの。
こんな素晴らしい機能は他に類をみないよね。
もうビルゲイツさまさまってかんじ?
ろくにシェルスクリプトもかけないのにわざわざLinuxとか使ってる奴もったいねーw
とりあえずビルゲイツさまが提供してくださるOSとソフトウェアを使っていればいいんだよ。
0007デフォルトの名無しさん
2008/08/26(火) 00:00:040008デフォルトの名無しさん
2008/08/26(火) 20:56:28ならんぞ。どういうパターンの話?
もしかして型変換起こしてるとか?
0009デフォルトの名無しさん
2008/08/26(火) 22:43:02です。
いろいろなことを教えていただきありがとうございます。
ひとつひとつやってみます。
またなにか聞くかもしれませんそのときはお願いいたします。
0010デフォルトの名無しさん
2008/08/27(水) 12:59:04関数も持たせたいのですが可能でしょうか?
0011デフォルトの名無しさん
2008/08/27(水) 13:56:150012デフォルトの名無しさん
2008/08/27(水) 15:18:29ちょっと調べてみます。
0013デフォルトの名無しさん
2008/08/27(水) 22:06:17並べて表示させるのはなんとなくわかるのですが、すべて削除するマクロがわかりません。
その列以外にもオートシェイプがあるのでDrawingObjects.Delete は使えないと思いますし、
マクロを記録しながら、オブジェクトの選択を選んで消したい箇所をドラッグしてDELしても
ActiveSheet.Shapes.Range(Array("AutoShape 260", "AutoShape 261")).Select
Selection.Delete
とオートシェイプの番号を指定して削除しているのでマクロには使えなさそうです。
マクロで使えるオートシェイプの削除方ってありませんか?
0014デフォルトの名無しさん
2008/08/27(水) 22:19:540015デフォルトの名無しさん
2008/08/27(水) 22:50:39もう少し詳しくお願いします。
0016デフォルトの名無しさん
2008/08/28(木) 00:40:08んで作成時にkeyプロパティに座標(行,列)を文字列で格納しておくんだ。
あとはActiveSheet内のシェイプを走査して、特定の座標のシェイプを指定
して削除できると思うよ。
ActiveSheetの行or列orセルが削除されたらシェイプのkeyプロパティに格納
されている座標を更新する処理を加えれば完璧じゃね?
0017デフォルトの名無しさん
2008/08/28(木) 20:54:48ExecuteExcel4macroでやると速いんですが、
書式が通常と全く異なるので記述が難しい。
順番が決まってるし、""で囲む部分とかどうやったら良いのやら。
誰か上手いこと解説して下さい。
0018デフォルトの名無しさん
2008/08/28(木) 22:37:59何度も同じ処理をcallする場合に、処理を記述するのは、
sub と function、どちらにすべきでしょうか。
引数無しの記述なので、どちらで記述して呼び出しても同じ結果が出るのですが、
正しい使い方を覚えたいと思います。
よろしくお願いします。
0019デフォルトの名無しさん
2008/08/28(木) 22:39:390020デフォルトの名無しさん
2008/08/28(木) 22:40:420021デフォルトの名無しさん
2008/08/29(金) 08:38:25Excel でコンマおよび引用符を区切り文字としてデータをテキスト ファイルにエクスポートするマクロ
http://support.microsoft.com/kb/123183/ja
上記のようなマクロを求めています。
例えばexcel上に、
1 2 3
4 5 6
という表があれば、
"1","2","3"
"4","5","6"
というテキストファイルに吐き出したいのです。
例では、囲い文字='"' 、 区切り文字=',' としましたが、両方とも簡単に変更出来るとなお良いです。
どなたかとっかかりでも良いですからアドバイスを下さい。よろしくお願いします。
0022デフォルトの名無しさん
2008/08/29(金) 08:43:20釣りじゃないなら、「名前をつけて保存」のcsvを飽きるほど試してみるんだ。
0023デフォルトの名無しさん
2008/08/29(金) 08:54:11回答ありがとうございます。
保存形式にcsvを選べばカンマ区切りのテキストファイルが得られるのは知っていますが、
それでは囲い文字までは指定できないと思います・・・。
それとも私の知らない機能があるのでしょうか?
0024デフォルトの名無しさん
2008/08/29(金) 09:33:100025デフォルトの名無しさん
2008/08/29(金) 10:27:01セルの書式を文字列に変更してcsv形式で保存しましたが、
""で括られることはありませんでした。ごめんなさい。
ちなみにセルの内容自体を"1"などとしてcsvで保存すると、
なぜか"が増えて"""1"""となってしまいます。
EXCELの機能のみで実現できるのならばそれにこしたことはないのですが、
色々調べた結果、これはマクロを組まなければ実現できないみたいなんです。
どうか、マクロを使った方法を教えていただけないでしょうか?
私の足りない頭では、まずベタにcsvで吐き出した後、
テキストエディタを使って正規表現で , や先頭を置換していく方法しか分かりません。
1ファイルだけならそんなに手間はかかりませんが、大量のファイルを処理したい場合、
マクロを使えたら便利だと思い質問させて頂いてます。
002624
2008/08/29(金) 10:46:51んじゃ、1を'1にしたらどう?
# つーか、理由が判らんから喰い付きが悪いんじゃないだろか。
0027デフォルトの名無しさん
2008/08/29(金) 11:30:21>んじゃ、1を'1にしたらどう?
書式を文字列にしたのと同じ結果で、""では括られませんでした。
># つーか、理由が判らんから喰い付きが悪いんじゃないだろか。
理由をお話ししますと。
仕事上、囲い文字付きのcsvファイルを良く扱うんです。
それはoracleデータベースから吐き出されたテキストデータなんですね。
"00","123","789"
"01","456","098"
上記のような形式のものです。
それを修正する時、テキストエディタで直接編集するのが難しい場合、
一旦excelに読み込ませてexcel上で編集するんです。
そのデータを再び上記のような形式に保存し、データベースに取り込むということをするんです。
その際、単にexcelでcsv形式で保存すると、囲い文字""が無くなってしまいます。
囲い文字""がないとうまくツールでデータベースにロード出来ないので困っているわけです。
単にただのcsvから囲い文字付きcsvに変換したいなら、
そのようなシェルスクリプトを作るなり、手動で置換するなり出来るのですが、
今回excelを使用しているので、マクロを使って自動化することに挑戦したいのです。
ヒントでもリンクでも構いません。とっかかりをどなたかご教示願います。
0028デフォルトの名無しさん
2008/08/29(金) 12:04:25ファイル保存のコードを流用しているみたいですけど、すべての値を'"'で囲んで、,'で連結してファイルに書き出すコードを書けばいいですよ
囲い文字や区切り文字は変数にしとくと変更も簡単にできます
会社として問題がないならファイルを経由せずに直接DBを更新するとよいかもしれません
「excel oo4o」とかでぐぐれば参考ページが出てきたと思います
0029デフォルトの名無しさん
2008/08/29(金) 12:55:59組込ダイアログボックスから操作することは可能でしょうか?
やりたいことは、
[書式]>[条件付き書式]で表示されるダイアログの
[書式(F)]ボタンをクリックしたときの動作を自作フォーム上で再現したいです。
よろしくお願いします
0030デフォルトの名無しさん
2008/08/29(金) 13:22:28予定表に書き込む事はできます
でしょうか。
予定をExcelでガーッと書いて、
ポチッとOutlookに流し込みたいです。
MS Exchange serverを使ってます。
VBAについては初心者で、
「Excel Outlook VBA 予定」等でググってみたのですが
見つける事ができず・・・
もしサンプルコードがあればそれをもとに勉強させていただきたいと思っています。
0031デフォルトの名無しさん
2008/08/29(金) 20:20:33Outlook20033はできない
0032デフォルトの名無しさん
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日・・)と付けて作成する方法を
教えてください。
参考になりそうなサイトでも構わないです。
よろしくお願いします。
0033デフォルトの名無しさん
2008/08/29(金) 21:45:36あぁ!?そうなんですか!?
ほかのバージョンではできるんでしょうか?!
かいかえようかなぁ・・・
0035y
2008/08/29(金) 22:39:09「プロシージャ内で宣言したRange型変数の書式」とありますが、
宣言された時点でのRange型変数は、まだどこのセルを指すか
決まっていないため、書式を設定することはできません。
Range型変数に任意のセル範囲をSetした上で、そのセル範囲の
条件付書式の書式をVBAで設定する方法を、ということでしたら、
まずは条件付書式設定の作業を「マクロの記録」(>>1 ★6)を
使ってコード化し、「Selection」となっているところを任意のセル範囲
に対する操作になるよう書き換えてください。そうして出来上がった
コードを、自作フォーム上のコントロールのイベントプロシージャから
呼び出すようにすれば、自作フォームから操作できます。
始めに「組込ダイアログボックスから操作する」とあり、
後で「自作フォーム上で再現したい」とありますが、
組み込みダイアログボックスと自作フォームは別物です。
おそらく「自作フォーム」のつもりだと思いますが、
混同しないよう気をつけてください。
0036デフォルトの名無しさん
2008/08/29(金) 22:49:23マクロを記録して、やりたいことやってみろ
0037デフォルトの名無しさん
2008/08/29(金) 23:36:33そもそもOutlook20033なんてない。
0038デフォルトの名無しさん
2008/08/30(土) 19:44:370039y
2008/08/30(土) 21:14:32Excel20033の検索結果 8 件中 1 - 8 件目 (0.15 秒)
0040デフォルトの名無しさん
2008/08/30(土) 23:17:120041デフォルトの名無しさん
2008/08/31(日) 02:30:400042デフォルトの名無しさん
2008/08/31(日) 03:15:03【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へ書き込みたいのですが、自分の知識ではどのようにコーディングすればいいのか
全然判らないので、よろしくお願いします。。。
0043デフォルトの名無しさん
2008/08/31(日) 06:07:21>>1★5
「なつやすみのしゅくだい」はじぶんでやりましょう
0044デフォルトの名無しさん
2008/08/31(日) 07:18:590045デフォルトの名無しさん
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"
0046デフォルトの名無しさん
2008/08/31(日) 10:28:55http://www.amazon.co.jp/s/ref=nb_ss_gw?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Daps&field-keywords=Excel+access+
0047y
2008/08/31(日) 11:07:20という課題は荷が重すぎるような...。>>42の学校ではどういうカリキュラムでVBAを教えているのか
わかりませんが、最低限その課題を解くために必要な授業を受けるか、必要な説明が書かれた
テキストが配布されているなら、とにかくそれらを参考に自分で何かコードを書いて、
再度質問してみてください。
0048デフォルトの名無しさん
2008/08/31(日) 11:36:111日ぐぐって、サンプル試すだけでできるようなるっしょ。
0049デフォルトの名無しさん
2008/08/31(日) 11:43:56あんた優しいな。
経験皆無なわけないじゃん。
>>42が授業聞いてないだけだよ。
0050y
2008/08/31(日) 11:48:33GroupItemsプロパティから、そのグループに含まれているすべてのシェイプのコレクションを取得できます。
グループを解除する前に、その情報をCollection型変数にでも保管しておいて、
それぞれのテキストを書き換えた後、その情報をもとに再びグループ化すれば、グループ名を使わずに実現できます。
>>48, >>49
情報系の学生で、ちょっとでも他の言語の経験があれば何とかなるかも
あとは>>42の頑張り次第ですね。
0051デフォルトの名無しさん
2008/08/31(日) 12:28:05コードくれよ
0052デフォルトの名無しさん
2008/08/31(日) 12:32:00おまえのことをおもって、今後誰もレスをせんだろうな。
0053デフォルトの名無しさん
2008/08/31(日) 13:11:220054y
2008/08/31(日) 13:46:53それについて私も気になってました。>>16に書いてある方法を自分でも
調べていたんですが、シェイプに「keyプロパティ」ってあるんでしたっけ?
オブジェクトブラウザで探しても見つかりません。
005545
2008/08/31(日) 15:17:38複数のグループ化されたオートシェイプのうちの一つを指定するのに
ActiveSheet.Shapes("Group 526").Select のようにではなく、例えばRange("B5")の上に掛かってるグループを指定する、
というような方法はありますか?
シートもどんどん複写して使いますので名前やインデックスだと手に負えない気がします。
0056デフォルトの名無しさん
2008/08/31(日) 15:59:55役に立ちそうで立たないからな。
0057デフォルトの名無しさん
2008/08/31(日) 17:56:34それすらできないなら文句言うな
0058デフォルトの名無しさん
2008/08/31(日) 22:36:57>>54
keyプロパティはないけどidプロパティでシェイプを特定できるから、(id,座標)のような配列や
コレクションを用意しておいて座標<->シェイプの関連づけをすれば解決するんじゃないかな。
0059デフォルトの名無しさん
2008/09/01(月) 03:45:00TopLeftCell プロパティとか BottomRightCell プロパティを利用するのだと思います
0060デフォルトの名無しさん
2008/09/02(火) 00:34:420061デフォルトの名無しさん
2008/09/02(火) 00:49:54で、ユーザーフォームで「電話番号入力」欄を作り、そこに電話番号を入れて「検索」ボタンを押すと、
電話番号が一致した「顧客名」、「住所」を同じユーザーフォームに表示するようにしたいのですが、
どんなコードを使うと良いのかヒントを教えていただけませんか?
シートには、
A B C D
顧客名 電話番号 住所1 住所2
1 あいだ 090xxxxxxxxx 東京都 杉並区
2 いとう 080xxxxxxxx 北海道 札幌市
という風に記入しています
B1の電話番号「090xxxxxxxx」を「電話番号入力」欄に入れて「検索」ボタンを押すと
「顧客名」 あいだ
「住所1」 東京都
「住所2」 杉並区
という風に表示できるようにしたいのです。
Excelは、2000
OSは、Winddows XP SP3です
0062デフォルトの名無しさん
2008/09/02(火) 00:51:35「検索」ボタンを押すと該当するデータがない場合にメッセージが出るようにはしたのですが、
そこから先が(というか、ほとんど進んでいないのですが)見当がつきません
0063デフォルトの名無しさん
2008/09/02(火) 02:35:21あとはCellsでデータを取ればいい
0064デフォルトの名無しさん
2008/09/02(火) 18:47:07Chdrive ThisWorkbook.Path とやって作成した奴を
他人のPCで実行させても同じフォルダ内のファイルを探せなくてエラーが出ます。
デスクトップのフォルダで動作させても
msgbox ThisWorkbook.Pathでは〜¥Tempとなっています。
ユーザー設定のカレントは空白にしても変わりません。
XPの2003で作成し、会社の2007では動作しましたが他のPCのXP、2003で発生します。
どのように対処すべきですか?
0065デフォルトの名無しさん
2008/09/02(火) 20:52:52006664
2008/09/02(火) 22:13:35なぜ関係ないC:\〜¥〜¥Tempになってしまうのか?ってことです。
0067デフォルトの名無しさん
2008/09/02(火) 23:44:42OfficeXP・2003からOffice2007にアップグレードすればおk
0068デフォルトの名無しさん
2008/09/03(水) 19:41:38以下のコードで、実行時エラー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
0069デフォルトの名無しさん
2008/09/03(水) 21:50:310070デフォルトの名無しさん
2008/09/03(水) 21:51:170071デフォルトの名無しさん
2008/09/03(水) 23:46:30いまいち理解しているのかどうかがわかりません。
勉強の仕方はネットで調べながら・・・なのですが、
みなさんはどのように勉強してましたか?
課題をもらえるとやりやすいのですが、一人でやってると自分が何をしているのか
わからなくなります。覚えるコツなどありましたら教えてください。
0072デフォルトの名無しさん
2008/09/03(水) 23:53:34興味あるものを作るところから始めたら?
仕事なら、覚えるしかないからかえってそういう事を悩まずにすむけど。
0073デフォルトの名無しさん
2008/09/03(水) 23:57:43おれはシューティングゲーム→ギャルゲー→RPGと作って
無駄な時間をすごした。
0074デフォルトの名無しさん
2008/09/04(木) 03:13:53VBは最初はいろんな小物ツールとかつくって覚えたなぁ。
0075デフォルトの名無しさん
2008/09/04(木) 03:29:37VBA全体を勉強したいならWin32APIやWindowsCOMオブジェクト
についても勉強する必要があると思うなぁ。
最初はコードが公開されているサンプルを眺めたり流用して何か
役に立つものを作ったらいいと思う。その内にコードが公開されて
いないけど実現したい機能とかも自力で作成できるようになるよ。
Officeだったらコードが公開されていなくてもパスワードクラックの
ツールがあるからそれ使ってちょっと高度なコードにも目を通すと
いいかも。
0076デフォルトの名無しさん
2008/09/04(木) 03:57:220077デフォルトの名無しさん
2008/09/04(木) 11:53:25質問掲示板の「回答者」になるのが良いでしょう。
どの掲示板が良いかは自分で判断して下さい。
別に書き込まなくても良いので、色々な方のコードと自分のコードを比較する事が勉強になる。
0078デフォルトの名無しさん
2008/09/04(木) 16:15:580079デフォルトの名無しさん
2008/09/04(木) 18:43:380080デフォルトの名無しさん
2008/09/04(木) 19:18:16分類的にはOO言語寄りではあるな
008168
2008/09/04(木) 19:49:36レスありがとうございます。
cはゼロにも1にもなっていないですが・・・。
0082デフォルトの名無しさん
2008/09/04(木) 20:41:230083デフォルトの名無しさん
2008/09/04(木) 20:45:170084デフォルトの名無しさん
2008/09/04(木) 21:56:37sheets(hoge).range(
の形でどうかな?
sheet changeイベントで、rangeオブジェクトが保持してるシート名が対象rangeと異なるからエラー出してるとか。
適当だけどw
0085デフォルトの名無しさん
2008/09/04(木) 22:23:24体系だった入門書を通読しろよ、糞ゆとりが
0086デフォルトの名無しさん
2008/09/04(木) 22:44:220087デフォルトの名無しさん
2008/09/04(木) 23:45:43cに1が入った場合の処理をしていないから
Changeイベントループして最終的に >>70の言う事になってるだけ
0088デフォルトの名無しさん
2008/09/05(金) 00:09:51という命令でA1:A5の範囲のセルを結合させたり結合解除させたいのですが、
実行させても何も起こりません。エラーすら起こりません。
ばらして同様のことをやるとちゃんと動きます。何が悪いのでしょうか。
以下そのコード
Sub toggling(ByRef obj As Variant)
obj = Not obj
End Sub
Sub toggleMerge(ByVal str$)
toggling Range(str).mergeCells
End Sub
0089デフォルトの名無しさん
2008/09/05(金) 00:35:04モジュールで有効な変数宣言しようとすると
Dimとか打ってたらエラーダイアログが0.2秒ぐらいで6連続くらい連発して打ち切れない
Excel2008なんだけど構文チェックスピード早すぎて打てない
どうしたらいいのか教えて頂けないでしょうか
0090デフォルトの名無しさん
2008/09/05(金) 00:46:23"c"にミスがないのであれば
Sheets(hoge).Range((Sheets(hoge).Cells(r, c - 1), Sheets(hoge).Cells(r, c - 1)).Value = rgbnum
↑のようにしてみてはいかがか
0091デフォルトの名無しさん
2008/09/05(金) 00:50:36http://namidame.2ch.net/test/read.cgi/slotj/1216400588/
のスレで確率についてバトルしています
問題はサイコロで1が8回連続して出る確率です
バカが多すぎて疲れました
頭の良い皆様、論破してください
お願いします
0092デフォルトの名無しさん
2008/09/05(金) 01:15:08Worksheet_Changeイベントに記述しているから
セルに値を入れる前にイベント発生を止める処理を入れるか
cが0にならないようにする処理を入れないと
Changeイベントが連鎖してエラーになる
0093デフォルトの名無しさん
2008/09/05(金) 01:20:01めっちゃ早く打つ
0094デフォルトの名無しさん
2008/09/05(金) 01:28:59でもさ、質問する前に日本語で質問できるようになってから来いよな。
たのむから。
0095デフォルトの名無しさん
2008/09/05(金) 02:00:19なるほど。ちょっと賢くなりました。
009668
2008/09/05(金) 08:57:53cが特定の値の時にしか、
セルに値を入れないようにしたら
うまくいきましたm(__)m
0097y
2008/09/05(金) 17:45:41おやっ、と思うようなコードですね。
たぶん、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
0098y
2008/09/05(金) 18:04:43何をした瞬間エラーメッセージが出た、というあたりをもう少し詳しく。>93w
>>58
ありがとうございます。やっぱりKeyプロパティはないんですね。
0099デフォルトの名無しさん
2008/09/05(金) 20:14:320100デフォルトの名無しさん
2008/09/05(金) 23:31:49どうもありがとうございます。
Boolean型のオブジェクトを渡していたからだったのですね。
でもできれば、汎用的にtoggleプロシージャをつかって実装したいです。
Sub toggle(ByRef obj As Variant, ByVal propertyName$)
obj.propertyName = Not obj.PropertyName
End Sub
という感じです。
そこで、新たに質問なのですが、”.”を使わずにプロパティを参照するには
どのようにすればいいのでしょうか。
たとえば、Javascriptだとobj["PropertyName"]でプロパティ参照できるのですが、
VBAには類似の呼び出し方法は存在しているのでしょうか。
0101デフォルトの名無しさん
2008/09/05(金) 23:43:02http://pc11.2ch.net/test/read.cgi/bsoft/1219830884/l50x
こちらのほうでも同様の質問をしようと思います。
マルチポストはするな、といわれたくないため、先に宣言しておきます。
0102デフォルトの名無しさん
2008/09/05(金) 23:50:31a += 1
a ++
はだめでした。
(下は別言語なので当然ですが・・・。)
0103デフォルトの名無しさん
2008/09/06(土) 00:39:09CallByName
>>102
諦めろ。
0104デフォルトの名無しさん
2008/09/06(土) 01:25:110105デフォルトの名無しさん
2008/09/06(土) 02:05:01というマクロを作ろうと思っているのですが、セルの入力判定の方法を教えていただけないでしょうか?
宜しくお願いします。
0106デフォルトの名無しさん
2008/09/06(土) 03:17:520107105
2008/09/06(土) 07:39:52A列からF列までそれぞれの列に情報を入力してリストを作っているのですが、
既に何百行も情報を入力していて、都合上同じ情報を追加で入力してしまう恐れがあり、
現在は毎回入力の前にCtrl+Fの検索で既に入力された情報かどうか調べています。
そこでA列のセルに入力があれば入力されたセルより上の既に入力された全てのセルの文字列と比較して、
既に同じ入力があればエラーメッセージを出すというマクロを作りたい次第です。
マクロを作成するにあたって、「A列に入力があれば」という部分をどう書けばいいかわからなかった為質問させていただきました。
A列に同じ情報が入力されるという事は都合上絶対に有り得ない事なのでA列のセルを比較しようと考えています。
・A列には1行目から空白なく順番に情報が入力されている。
・新規に入力する際は現在のリストの最終行の次の行に情報を入力している。
という条件があるので、A列に入力があればというよりA列の最終行の次の行に文字が入力されればという方が正しいかもしれません。
説明が下手で申し訳ありません。
宜しくお願いします。
0108デフォルトの名無しさん
2008/09/06(土) 09:22:13Worksheet_SelectionChange
0109デフォルトの名無しさん
2008/09/06(土) 09:27:52VBAって自分でイベントの作成は出来るのかな。あまり詳しくないんで分からないや:(
若干重くなるけど、sheetのchangeイベントで、セルを移動した時に、A列の最終行の内容と同じ物をチェックするとか。
うーん・・・あまり美しくないよね。
自分でイベント作成出来るのか、私も知りたいです。
詳しい人お願いします。
0110デフォルトの名無しさん
2008/09/06(土) 10:56:04ありがとうございました。
0112デフォルトの名無しさん
2008/09/06(土) 14:45:53重複データがあるかないかを調べるだけでよければ
VBA使わなくても条件付き書式でできる。
0113デフォルトの名無しさん
2008/09/06(土) 16:14:55C では
// 関数の定義
void abc(void)
// メインルーチン
void main(void)
{
// 関数名
abc();
}
void abc(void)
{
---
}
上記の方法で関数を呼び出そうとして、
Sub 名前()
abc()
End Sub
:abc()
---
return
上記記載の方法では動きませんでした。
素人な問い合わせで申し訳ありませんが宜しくお願いします。
0114デフォルトの名無しさん
2008/09/06(土) 16:25:59仮に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
0115デフォルトの名無しさん
2008/09/06(土) 17:04:48113 です。早速のお教え有難う御座います。
なんらか値を返す様に変更します。
0116デフォルトの名無しさん
2008/09/06(土) 17:10:04Sub main()
Call abc()
End Sub
Sub abc()
---
End Sub
戻り値の型がvoidの関数はSub、それ以外はFunction。
戻り値を受け取らない場合、Sub/FunctionにかかわらずCallを付ける(Call使わない記法もあるけど)。
0117デフォルトの名無しさん
2008/09/06(土) 17:30:42113 です。いろいろお教え戴き有難う御座います。
この方法が簡単なので採用させて戴きます。
0118デフォルトの名無しさん
2008/09/06(土) 18:07:40>>116
113 です。プログラム作成途中ですが、両方とも必要になりましたので、
共に採用させて戴きます。いろいろと、有難う御座いました。
0119デフォルトの名無しさん
2008/09/06(土) 21:14:050120デフォルトの名無しさん
2008/09/06(土) 23:37:07身に染み付いてるから、SubとVoid関数は非常にきもちわるい。
0121デフォルトの名無しさん
2008/09/06(土) 23:38:230122デフォルトの名無しさん
2008/09/07(日) 00:36:46よほどのことがないかぎり作らない。むしろ121がしろうと
0123デフォルトの名無しさん
2008/09/07(日) 00:52:19VBAスレで恥ずかしい事いうなよおっさん。
0124デフォルトの名無しさん
2008/09/07(日) 01:49:03VBAで純粋関数型プログラミングは無茶があるだろ、常識的に考えて。
012589
2008/09/07(日) 03:31:47必殺コピペです。
グローバルエリアに変数定義しようとしたらDimと打った時点でエラーメッセージが頻発
変数書こうとしても打っている途中でメッセージ頻発して書けない。
どこかにエラーチェックのタイミングプロパティがあると思うがコピペで解決したから諦めようかと思います
0126デフォルトの名無しさん
2008/09/07(日) 07:55:300127デフォルトの名無しさん
2008/09/07(日) 10:23:410128デフォルトの名無しさん
2008/09/07(日) 14:27:52AccessのTransferSpreadsheetでエクセルの任意シートへデータを出力していますが、
エクセルファイルを開いた時に、値を出力したシートがアクティブになっているようにしたいのです。
0129128
2008/09/07(日) 14:30:040130デフォルトの名無しさん
2008/09/07(日) 14:45:07Sheets("hoge").Activate
Sheets("hoge").SaveAs "c:\hoge.xlsx", xlWorkbookNormal, , , True
0131128
2008/09/07(日) 15:15:51そのやり方だとインデックスエラーになっちゃうんですけど。
0132デフォルトの名無しさん
2008/09/07(日) 15:26:27ファイルオープン(非表示)
シートをアクティブにする
保存
0133デフォルトの名無しさん
2008/09/07(日) 15:30:41結局ファイルを開かなきゃいけないってことですね。どうもありがとうございました。
0134デフォルトの名無しさん
2008/09/07(日) 15:39:470135デフォルトの名無しさん
2008/09/07(日) 15:45:400136デフォルトの名無しさん
2008/09/07(日) 15:46:46知ったか振っててうざいんだもん
これぐらい言わせなよ
0137デフォルトの名無しさん
2008/09/07(日) 15:51:180138128
2008/09/07(日) 15:52:01言われた事から、相手がなぜそうしたいのか、ではどういう方法が適切かくらい想像しろよ、と思うね
おまえら自分の知ってることが唯一の回答であるようにこじつけてるだけだろ。
そういうのをバカの一つ覚えって言うんだよ。
でも回答ありがとう。じゃね。
0139デフォルトの名無しさん
2008/09/07(日) 15:52:320140>137
2008/09/07(日) 15:53:300141デフォルトの名無しさん
2008/09/07(日) 15:53:470142デフォルトの名無しさん
2008/09/07(日) 15:55:070143デフォルトの名無しさん
2008/09/07(日) 15:56:220144デフォルトの名無しさん
2008/09/07(日) 15:59:210145デフォルトの名無しさん
2008/09/07(日) 16:01:56最低限1から5くらいまで説明しようぜ。
俺らお前のお母さんじゃないんだからよ。
0146デフォルトの名無しさん
2008/09/07(日) 16:02:48出来ないことは出来ないと説明した上で代替案を示すなら
ここまで荒れないと思うのだが。
条件に反することを回答するからこうなる
0147デフォルトの名無しさん
2008/09/07(日) 16:03:39でできると思うぜ。
0148デフォルトの名無しさん
2008/09/07(日) 16:10:34えっ?
>128を1から5くらいの説明で理解できるのか?
最近のお母さんてスペック高いんだな!
0149デフォルトの名無しさん
2008/09/07(日) 16:11:33他にもっとシンプルなやり方が無いのかな、って思っただけ。
0150デフォルトの名無しさん
2008/09/07(日) 16:12:30非表示だけど、ファイル開いてるからNGだろ。
想像力のない俺からすれば、元の質問自体がNGだけどな。
0151デフォルトの名無しさん
2008/09/07(日) 16:13:040152デフォルトの名無しさん
2008/09/07(日) 16:14:32ファイル開かずにファイルを変更するなんて方法があったら俺が知りたいな
0153デフォルトの名無しさん
2008/09/07(日) 16:16:31まさかとは思うがプログラム板なのにAccessのVBAを知らん奴がいるのか
0154デフォルトの名無しさん
2008/09/07(日) 16:20:310155デフォルトの名無しさん
2008/09/07(日) 16:23:380156デフォルトの名無しさん
2008/09/07(日) 16:24:490157128
2008/09/07(日) 16:38:58低能エクセル厨乙w
0158デフォルトの名無しさん
2008/09/07(日) 16:49:47それから自分の質問と回答を100回音読しろ。
0159デフォルトの名無しさん
2008/09/07(日) 16:56:430160デフォルトの名無しさん
2008/09/07(日) 18:49:05が見えない
0161デフォルトの名無しさん
2008/09/07(日) 20:20:00お勧めの参考書はありますか?元制御系プログラマで
プログラミングの基本は充分できています。
技術評論社のポケットリファレンスはどうですか?
0162デフォルトの名無しさん
2008/09/07(日) 20:25:06win32APIを勉強したいのですが、お勧めの本ってありますか?
使用目的はExcel VBAで呼び出す事です。
0163デフォルトの名無しさん
2008/09/07(日) 20:29:47ぐぐることも出来ないの?
0164デフォルトの名無しさん
2008/09/07(日) 23:32:310165デフォルトの名無しさん
2008/09/08(月) 00:05:080166デフォルトの名無しさん
2008/09/08(月) 03:03:140167デフォルトの名無しさん
2008/09/08(月) 03:08:05結局お前らAccessVBAが理解できなかっただけ佳代w
低能エクセル厨乙w
こいつリアルでもこんな感じなんだろうな
0168デフォルトの名無しさん
2008/09/08(月) 07:45:44マジレスするとWin32APIの為に本を買うのはもったいない。
MSDNとネット上のAPIサンプル集とかで十分。
0169デフォルトの名無しさん
2008/09/08(月) 19:00:04上のようなことの逆は可能ですか?
例えば、セルAに映画のタイトルが縦に並んでて、
セルBにはその映画の詳細が見れるHPアドレスが沢山並んでます。
セルBのそれぞれのアドレスを、セルAに一括でハイパーリンクさせる(埋め込む)
方法が知りたいです。
ご教授、宜しくお願い致します。
0170デフォルトの名無しさん
2008/09/08(月) 19:41:350171デフォルトの名無しさん
2008/09/08(月) 20:08:18循環参照になってる
0172デフォルトの名無しさん
2008/09/08(月) 20:09:260173y
2008/09/08(月) 20:21:47セルB1にあるアドレスを、セルA1にハイパーリンクとして埋め込むのは、
次のようにすればできます。
Sheet1.Hyperlinks.Add Anchor:=Cells(1, "a"), _
Address:=Range(1, "b"), _
TextToDisplay:=Cells(1, "a").Value
(マクロの記録を使って、ハイパーリンクを埋め込む動作を記録してみれば簡単です)
これをループで括って、「1」となっているところ(これは行番号にあたります)を
変えていけば、お好みの行数分操作できます。
0174y
2008/09/08(月) 20:25:13169はマルチポストだったんですね。
気づかずに答えてしまいました。
>>169
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88
一度ここを読んでおいてください。
0175デフォルトの名無しさん
2008/09/08(月) 20:29:35?
0176y
2008/09/08(月) 20:29:41Address:=Range(1,"b") → Address:=Cells(1,"b")
0177169
2008/09/08(月) 21:03:00ツール→マクロ→VBA→標準モジュールに保存した後、
マクロ実行してみたけどできません。
初心者なんでもう少し詳しく教えていただけませんか?
0178169
2008/09/08(月) 21:54:01行数分操作ができません。
Cells(1, "a"),
1の部分の範囲指定はどうすればいいの?
0179169
2008/09/08(月) 21:55:21一括で変更できると助かります
0180デフォルトの名無しさん
2008/09/08(月) 22:01:320181デフォルトの名無しさん
2008/09/08(月) 22:27:39いろいろ調べてもわからねぇよ
質問スレなんだから聞いてるんだろ。。意地悪しねぇで教えろよ。
その気がないなら返信するな
0182デフォルトの名無しさん
2008/09/08(月) 22:45:30な
0183デフォルトの名無しさん
2008/09/08(月) 22:46:160184デフォルトの名無しさん
2008/09/08(月) 23:16:260185デフォルトの名無しさん
2008/09/08(月) 23:40:480186デフォルトの名無しさん
2008/09/08(月) 23:43:520187デフォルトの名無しさん
2008/09/09(火) 01:33:11「XML入門」みたいな本はたくさん見るんですけど、あれって具体的なコーディングについては記述が無いorごく少ないですよね。。。
あってもPHPとかばっかりだし。。。
0188デフォルトの名無しさん
2008/09/09(火) 08:48:08まともな頭があればVBAでCOM(XMLDOM)使ってXML扱うくらい、
ネットの情報だけで事足りる
0189デフォルトの名無しさん
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
0190y
2008/09/09(火) 19:35:50173の後半を、もう少し具体的に書きます。
まずループ用の変数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にあるように、「また丸投げか」と
怒りを買ってしまいます。
0191y
2008/09/09(火) 20:01:47マクロの記録を使って、ソルバーでやりたい作業をマウスでやってみて、
どんなコードが記録されるか確かめてみてください。(>>1★5)
189のコードについては、
@単純な構文ミス Range("Cells(x, 3)").Select → Cells(x, 3).Select
A目的セルをどこにしたいのか、可変セルをどこにしたいかが不明
です。特に、Aが分からないとアドバイスができません。
0193デフォルトの名無しさん
2008/09/09(火) 20:44:23ご親切にありがとうございました。
勉強になりました
0194デフォルトの名無しさん
2008/09/09(火) 22:41:34すみません
目的のセルがCells(x, 5)で、可変セルがCells(x, 2)のつもりでした。
で、@のやつをやったら出来ました。
ありがとうございました。
0195デフォルトの名無しさん
2008/09/09(火) 22:50:31何か作ろうと思うのですが…自分では思いつかないので…
何か問題お願いします。
0196デフォルトの名無しさん
2008/09/09(火) 22:57:53このスレを集計してyの貢献度を調査せよ。
0197195
2008/09/09(火) 23:04:59ラジャ
0198デフォルトの名無しさん
2008/09/09(火) 23:34:22A列には文章が入っています。
B列には文章に含まれる単語、C列にはコード番号が入っています。
それぞれ数百〜数千行になります。
A列にはB列の単語のいずれかが含まれる場合には、
単語に対応するC列のコードをD列に表示させたいのですが、
どのような式がよいでしょうか。
VLOOLUPやFINDなどを組み合わせてみても上手くいきません。
お手数ですが、どなたか至急お教え願えますでしょうか。
0199デフォルトの名無しさん
2008/09/10(水) 00:31:40このスットコドッコイ
0200デフォルトの名無しさん
2008/09/10(水) 07:26:43B列…デフォルト、セル、スットコドッコイ
C列…E46194、H23t55、342421
0201デフォルトの名無しさん
2008/09/10(水) 07:44:070202デフォルトの名無しさん
2008/09/11(木) 00:16:48c:\aaa 配下にある全てのファイルとサブフォルダを
c:\bbb 配下に全てコピーする事は可能ですか?
また、サンプルコード等ありましたらヒントを頂けると助かります
色々と探してはいるのですが、いまいちピンとこないので
サンプルがあると助かるのですが、、、、
VBAはまだまだ初心者なので未熟者で恐縮です。
0203デフォルトの名無しさん
2008/09/11(木) 06:12:54>>1★3 ★4
0204デフォルトの名無しさん
2008/09/11(木) 19:30:310205デフォルトの名無しさん
2008/09/11(木) 19:59:47AddItemで追加した後にシートを
Xボタンを押して閉じようとすると
変更を保存しますかと聞かれるんですが
このチェックを外す方法ってあります?
OSはXPでExcel2003です。
0206y
2008/09/11(木) 20:15:03文章中の、特定の単語の有無の判定なら、たぶんInStr関数で何とかなると思います。
調べてみて使えそうなら使ってください。
>199にもありますが、具体的なデータが分からないとアドバイスしずらいです...
0207y
2008/09/11(木) 20:17:20どんな業界で働いている方か分かりませんが、
実務に役立つ知識が増すようなテーマを選ぶと、
何かと都合がいいのではないでしょうか。
為替、株式市況、地価、青果水産物市況など、
ネット上にはたくさんの生データが公開されています。
それらを自動的に取得し、テーマに沿って演算し、
レポートを出力するマクロを組むだけでも、
相当勉強になると思います。
やるのであれば、日々刻々と変化する数字の方が面白いです。
例えばある人は、東京に10数箇所ある中央卸売市場の毎日の市況データを
取得し、各市場の卸売価格差をグラフに出力するマクロを作っていました。
仲買業者なら、どこの市場で買い付けをすれば一番安いか、
逆に生産者なら、どこの市場に出荷すれば一番高いか、
一目で分かるというものです。ちなみに彼は商社に勤めていますが、
似たようなことをしている人は結構いるでしょう。
Excelは基本的にデータ処理の道具なので、何を試すにしても、
まずは題材になるデータを見つけてこなければなりません。
ならば自分が、分析対象として最も興味を覚えるデータを選ぶのがベターです。
その上で、自分のスキルに応じた試行錯誤をしてみればいいと思います。
仮に「VBA解説書に載っている多機能な家計簿を作るんだ」と決意したとして、
自分で小遣い帳をつけているほどの人ならともかく、付属CDに入っている
仮想データを使って作っていくようなやり方は、モチベーションが湧きづらい
ように感じます。
0208デフォルトの名無しさん
2008/09/11(木) 22:02:380209デフォルトの名無しさん
2008/09/11(木) 23:07:26×しずらい
○しづらい
◎しにくい
0210デフォルトの名無しさん
2008/09/12(金) 01:38:18WindowsVBAつくってよ
0211デフォルトの名無しさん
2008/09/12(金) 03:36:310212y
2008/09/12(金) 20:05:30「シートを Xボタンを押して閉じようとすると」とありますが、
シートに×ボタンはないので、たぶん「ブックを」のつもりでしょうか。
「変更を保存しますか」というメッセージは、ブックを保存した直後の状態であれば
表示されません。この状態は、WorkbookオブジェクトのSavedプロパティをTrueに
することで、強制的に作り出すことができます。
ブックが閉じられる直前に、その操作が自動で行われるようするためには、
ThisWorkbookオブジェクトのコード領域にBeforeCloseイベントを挿入し、
その中でSavedプロパティを操作します。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub
0213デフォルトの名無しさん
2008/09/12(金) 20:44:060214デフォルトの名無しさん
2008/09/12(金) 20:51:26お前がな
0215205
2008/09/12(金) 22:35:11ありがとうございました。
0216デフォルトの名無しさん
2008/09/13(土) 00:10:190217y
2008/09/13(土) 02:54:400218デフォルトの名無しさん
2008/09/13(土) 03:49:120219デフォルトの名無しさん
2008/09/13(土) 06:49:480220デフォルトの名無しさん
2008/09/13(土) 07:14:090221デフォルトの名無しさん
2008/09/13(土) 08:56:370222デフォルトの名無しさん
2008/09/13(土) 09:06:33嫌ならNGしとけ。
0223デフォルトの名無しさん
2008/09/13(土) 09:25:580224デフォルトの名無しさん
2008/09/13(土) 10:01:340225デフォルトの名無しさん
2008/09/13(土) 11:55:22だけど、挿入する行をセルの値から指定したい場合はどうすればよいですか?
例
B2 = 3
3行目と4行目の間に行挿入をするようB2をつかってさせる。
0226デフォルトの名無しさん
2008/09/13(土) 13:16:55i = Range("B2")
Rows(i).Insert
0227デフォルトの名無しさん
2008/09/13(土) 13:18:30Rows(Range("B2")).Insert
0228デフォルトの名無しさん
2008/09/13(土) 14:07:04助かります、ありがとうございました。
0229y
2008/09/13(土) 16:13:470230デフォルトの名無しさん
2008/09/13(土) 22:03:030231デフォルトの名無しさん
2008/09/13(土) 22:16:440232デフォルトの名無しさん
2008/09/13(土) 22:33:410233デフォルトの名無しさん
2008/09/13(土) 23:38:260234デフォルトの名無しさん
2008/09/14(日) 00:06:420235デフォルトの名無しさん
2008/09/14(日) 03:08:08また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?
0236デフォルトの名無しさん
2008/09/14(日) 05:20:37「シートに画像をドラッグした時に」というイベントが用意されてないから、
「ドラッグした」ら自動で処理するってのは無理
「シートに画像をドラッグしてからボタンを押したら」なら可能だが
> また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?
可能だがExcelでやるべきことじゃないな
Excelでやるってことは、Excelとその警告マクロを作ったブックを立ち上げてないと警告文出ないわけだし
やるとすれば、「n日前」ではなく、「n日前以降、最初にExcelを立ち上げたとき」という条件になるかな
0237デフォルトの名無しさん
2008/09/14(日) 16:10:42後者:できない
0238デフォルトの名無しさん
2008/09/14(日) 17:37:16あいうえお(abc)
かきくけ(ほげほげ)
さしすせそたちつ(nekdk)
という行がありまして、()とその中の文字列だけを全部消したいです。
()は全角です。()内の文字、文字数数がことなるので置換が使えないでいます。。
0239デフォルトの名無しさん
2008/09/14(日) 18:02:250240デフォルトの名無しさん
2008/09/14(日) 18:10:17>>1 ★2
0241デフォルトの名無しさん
2008/09/14(日) 21:03:02関数ではないけど
ツール→区切り位置で区切り文字を ( にすると
( の前後で別のセルに分かれるからそれではダメかな?
0242デフォルトの名無しさん
2008/09/14(日) 22:58:50行き詰ってしまったので何かアドバイスをいただければと思います。
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件分の情報を出力させたいのです。
また、種別については、今後随時変更があるので「種別毎に変数を設定して直接数える」のではないようなコードにしたいと思っています。
0243デフォルトの名無しさん
2008/09/14(日) 23:00:25Dim 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
0244デフォルトの名無しさん
2008/09/14(日) 23:25:440245デフォルトの名無しさん
2008/09/15(月) 08:41:270246y
2008/09/15(月) 11:18:44|A列. |B列. |C列. |D列. |E列.
01 | 0123456789| .| .| .|
02 | .| .| .| .|
03 | .| .| .| .|
04 | .| .| .| .|
05 | .| .| .| .|
シート内のデータ内容を説明するために、以前こんなテンプレを使っている人がいました。
「情報A」「情報B」シートの中身を、文章で説明するより楽だと思ったら使ってください。
0247242
2008/09/15(月) 13:54:22以下のようなシート構造で、種別→日付で並べ替えてあります。
A B C D
番号 種別 データ1 データ2
1 肉類 豚肉 20080915
1 肉類 牛肉 20080912
1 肉類 鶏肉 20080801
1 魚類 その他 20080401
2 肉類 猪肉 20080905
2 野菜 その他 20080802
0248y
2008/09/15(月) 16:03:53Sub 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
0249y
2008/09/15(月) 16:04:42「メイン画面」の任意のセルにコピーする、という考え方です。デバッガでステップ実行していけば、
不要な行が非表示になっていく様子がよく分かると思います。不便なところは改良してみてください。
なお、データは「種別→日付で並べ替えてあります」とありますが、見たところ「番号→種別→日付」で並んで
いますね。上のコードは、そう並んでいる必要があります。
他のやり方を提案する方もいるかもしれませんので、そちらも参考にしてください。
0250デフォルトの名無しさん
2008/09/15(月) 18:09:00C3で指定した値の行に行を挿入して、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
このように作ったのですが、うまくいきません。
0251デフォルトの名無しさん
2008/09/15(月) 18:39:29まず、Range("Hi")というセルの指定のやり方はない
Rangeを使いたいんなら、Range("H" & i )
ほかには、Cells(i, 8)、もしくは、Cells(i, "H")
解説サイトいっぱいあるから基本的とこから少し勉強したほうがいいよ
0252デフォルトの名無しさん
2008/09/15(月) 19:29:45今日これからVBAの勉強を力尽きるまでやってみるぜ。
困ったときはお前らだけが頼りだ。
0253デフォルトの名無しさん
2008/09/16(火) 06:39:12ご指摘、解説ありがとうございます。
出来る限り自分でやるようにしてみます。
0254242
2008/09/16(火) 23:49:49ありがとうございます。
(もしかしたら上級者の方には普通なのかもしれませんが)
自分には全くない発想でした。勉強になりました。
お示しいただいたコードを元に自分でも勉強したいと思います。
0255デフォルトの名無しさん
2008/09/17(水) 00:16:06現によその言語ではそういうことができるものだってある(Perlとか)。
いずれにせよVBAはそういうことをしないということに変わりはないけれど。
0256デフォルトの名無しさん
2008/09/17(水) 01:45:49Microsoft Forms 2.0 TextBoxだと右クリックしてもメニューが出てこないよね。
出てくるようにしたいんだけど、何かいい知恵あるかな?
0257デフォルトの名無しさん
2008/09/17(水) 17:14:061004エラーが出ます。(´Д`;
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
0258デフォルトの名無しさん
2008/09/17(水) 19:04:300259デフォルトの名無しさん
2008/09/17(水) 19:37:16↓
Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).Weight = xlMedium
0260デフォルトの名無しさん
2008/09/17(水) 20:29:58Border クラスの LineStyle プロパティを設定できません。
これくらいコピペしようぜ
0261デフォルトの名無しさん
2008/09/17(水) 20:30:380262デフォルトの名無しさん
2008/09/17(水) 20:37:010263デフォルトの名無しさん
2008/09/17(水) 21:21:15すれ違い甚だしい質問だとか煽りだとか
ここはまだまし
0264デフォルトの名無しさん
2008/09/17(水) 21:42:26質問者 回答者 講釈師
貴方はどれに該当しますか?
0265デフォルトの名無しさん
2008/09/17(水) 21:43:550266デフォルトの名無しさん
2008/09/17(水) 21:51:220267デフォルトの名無しさん
2008/09/17(水) 21:52:590268y
2008/09/17(水) 23:26:36念のため補足しますが、>>248のコードは決して最善の方法ではありません。
合致する会員番号でふるいをかけ、その中から種別ごとに最大3つまでの
アイテムを取り出していく取捨選択の過程を、視覚的に理解するために利用してください。
仕組みが単純なので、コードが短くて済むというのが唯一の利点ですが、
マスタデータの行の表示・非表示を切り替えて実現する「検索システム」というのは、
>255でも指摘をいただいていますが、普通はやらないでしょう。
(数がたくさんになると、けっこう動作が重くなってしまいます)
まじめに実装するとすれば、取捨選択の考え方はそのまま生かすとしても、
転記の仕方に改良の余地があります。適当な二次元配列を用意して、
取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに
書き込む、というのが一般的なやり方になると思います。
>>256
TextBoxのMouseDownイベントプロシージャ内で、Commandbars("登録されているCommandbar名").ShowPopup を
実行すれば、そのタイミングで表示されます。ユーザー設定のショートカットメニューも表示できます。
ちなみにMouseDownイベント発生時は、Button引数 が 定数xlSecondaryButton と等しければ、右クリックと判断できます。
0269デフォルトの名無しさん
2008/09/18(木) 01:50:360270デフォルトの名無しさん
2008/09/18(木) 05:40:380271デフォルトの名無しさん
2008/09/18(木) 09:07:55>>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
0272デフォルトの名無しさん
2008/09/18(木) 14:26:11!ッガ
0273デフォルトの名無しさん
2008/09/18(木) 18:15:17関数だけで何とでもなりそうだw
0274デフォルトの名無しさん
2008/09/18(木) 19:42:37>取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに
>書き込む、というのが一般的なやり方になると思います。
はぁ?
何でお前ごときが一般論を語れるんだよ?
0275デフォルトの名無しさん
2008/09/18(木) 20:49:36お前ごときがここにくんな
0276デフォルトの名無しさん
2008/09/18(木) 22:30:24皆さんにお聞きしたいのですが、
独学で学ぶにお薦めの本はありますか?
大村あつし著 かんたんプログラミング EXCEL VBA基礎編
と できるシリーズのVBAを読んでいます。
0277デフォルトの名無しさん
2008/09/18(木) 23:40:24漏れの場合はVBAに関する知識はほとんどネットやヘルプで調べたものだったりするし・・・
VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
便利なテクニックとかはネットで拾い集めて行く
最初に手に入れたVBAの本に載ってたサンプルがコンパイル通らなかったから
本は全然信用してないだけだけどなw
でも1冊だけ役に立った本があったな・・・
「Excel VBA逆引き大全」とかだったかな?
0278デフォルトの名無しさん
2008/09/19(金) 01:19:38VBA作成経験なく、ここを答えを求める場として
使うことに申し訳なく思っています。
複数のExcelファイルを指定する。
当該ファイルを新ブックにして保存する。
→その際、シート名が重複しても問題なし
新ブックのファイル名はあらかじめ指定したものを
このようなマクロをつくることは可能でしょうか。
前述のとおり、まったく経験なしなので、
サンプル、たたき台程度で構いませんので、
ご教示いただけたら嬉しいです。
0279デフォルトの名無しさん
2008/09/19(金) 01:57:510280デフォルトの名無しさん
2008/09/19(金) 02:05:09さっぱり意味がわかりません。
0281デフォルトの名無しさん
2008/09/19(金) 02:08:42>VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
できる奴の戯言だな
0282デフォルトの名無しさん
2008/09/19(金) 04:03:48簡単だよ。
0283デフォルトの名無しさん
2008/09/19(金) 06:07:09アホ?
0284デフォルトの名無しさん
2008/09/19(金) 06:25:29いや普通できると思うできないのは文盲
0285デフォルトの名無しさん
2008/09/19(金) 06:26:23ゆとり乙
0286デフォルトの名無しさん
2008/09/19(金) 06:37:00入門書レベルの事しか回答出来ないから笑える
0287デフォルトの名無しさん
2008/09/19(金) 06:43:18お前だろそれ
0288デフォルトの名無しさん
2008/09/19(金) 07:01:000289デフォルトの名無しさん
2008/09/19(金) 07:04:320290デフォルトの名無しさん
2008/09/19(金) 07:05:180291デフォルトの名無しさん
2008/09/19(金) 07:06:03>>278
複数ファイルのブック内のシートを結合するマクロなら昔適当に作ったのがあるけど
0292デフォルトの名無しさん
2008/09/19(金) 08:52:57まとめると
複数ファイルのブック内のシートを結合する
シート名は重複している場合がある
だよな?
シート数は全部でどのくらいになるんだ?
あまり多いと1つのブックに収まらないよ
0293デフォルトの名無しさん
2008/09/19(金) 09:10:07すいません、追加・変更があります。
○○システムの情報 ブック*2
□□システムの情報 ブック*2
(全部で5システム)
上記1ブックに1シートのみ
これをシステムごとに1ブックとして新規に保存。
なので、計5ブックができる。
これを一回でやりたいです。
下記の情報をあらかじめ指定(変更可)
- 各システムの情報ブック
- 新ブックの名前
を考えています。
0294292
2008/09/19(金) 10:40:41かなり手抜きだが書いてみた
コピー後のシート名は指定するように作った
マクロを入れるブックに
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がコピー先)
0295292
2008/09/19(金) 10:41:55Dim 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)
改行多すぎので次レスに続く
0296292
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
0297デフォルトの名無しさん
2008/09/19(金) 20:49:060298デフォルトの名無しさん
2008/09/19(金) 21:05:310299デフォルトの名無しさん
2008/09/19(金) 21:08:440300y
2008/09/19(金) 21:23:03「VBAの絵本」(アンク)
アンクの絵本シリーズは、その言語の仕組みや考え方を、豊富なイラストを用いて直感的に
伝える工夫がなされています。他人に薦めた本の中で、「分かりやすかった」という反応がいちばん
多かったのがこの本です。ACCESS VBAの内容も包括しているので、将来的にも役に立つでしょう。
概念の説明が中心で用例は乏しいので、メイン本にはできませんが、「かんたんプログラミング」を
持っているのであればそれで足りると思います。
「Excel VBAのプログラミングのツボとコツがゼッタイにわかる本〜最初からそう教えてくれればいいのに」(秀和システム)
「絵本」よりも実際性があり、個人的には一押しです。解説文と図の取り合わせがとても洗練されており、
文脈の多義性によるストレスや誤読を最小限に抑えようとする、手厚い推敲の跡が感じられます。新しい本なので
まだ他人に薦めたことはありませんが、アマゾンでは好評なようです。
「VBAポケットリファレンス」(技術評論社)
ヘルプがあればリファレンス本はいらない、という声もありますが、個人的には手離せません。
ページをめくるより、ヘルプを開いた方が速いような気もするかもしれませんが、
書式指定子の一覧、よく使うオブジェクトのプロパティ一覧など、よく開くページに
付箋を貼って机に置いておくだけで、パッと見たい時には最速のツールになり、ディスプレイも汚れないので
思考が中断されません。(※ただし、ヘルプを使って調べる習慣は、それはそれで必要です)
「逆引き」本(各社)
>276で既に上がっていますが、豊富な用例がほしい時は逆引き本です。ただ、「やりたいこと」をもとに
用例を探す場合、インターネット検索のほうがより楽な場合が結構あることも覚えておいてください。
「VBA + (やりたいことに関連するキーワード)」で検索すると、似たようなことを既にやっている人の
コードが割と簡単に見つかったりします。
0301y
2008/09/19(金) 21:24:04ぜひ注意してほしい点は、VisualBasicEditorの使い方、特にデバッグの作法を丁寧に解説している章があるかどうかです。
ステップ実行、ローカルまたはウォッチウィンドウでの変数の監視、イミディエイトウィンドウからの介入、これらの意味を
早いうちに知り、使いこなせるかどうかが、その後の上達に明らかに影響します。
0302デフォルトの名無しさん
2008/09/19(金) 21:27:080303y
2008/09/19(金) 21:56:25Excel2007なら、オートフィルタの抽出条件で「上位○位まで」という設定が可能になったので、
それを組み合わせれば、フィルタだけで何とかなるような気がします。
ただ関数だけでやるとなると… いい方法が思いつきません。
0304y
2008/09/19(金) 22:28:11さらに内容も、結構>277とかぶってしまっています。失礼しました。
0306デフォルトの名無しさん
2008/09/19(金) 23:31:050307デフォルトの名無しさん
2008/09/20(土) 00:29:08コンパイルするとファイルサイズが600kbから740kbになる場合とならない場合があり、(ソースはバックアップから同じ様にに変更したのに)大きくなった場合、実行すると強制終了になるという症状も現れた。
自宅の2003では問題なかったがためしに2002に変更。SP3を適用したまでは問題なかったが会社と同じバージョンになるよう、全部の更新を適用したところ同じ症状となった
ためしに最新のKB8951551を削除するとあっさり解決した・・。同じ目にあってる人いますか?
解決にいたるまでめちゃくちゃ苦労したよ・・・。(いやまだ会社のエクセルでは試せてないけど・・・)
0308デフォルトの名無しさん
2008/09/20(土) 01:39:410309デフォルトの名無しさん
2008/09/20(土) 02:37:18他の板で質問したあとに、こちらで質問すべきだったと気付きましたマルチポストですが勘弁してください。
セルA1とB1にそれぞれシリアル値による時間が入っています。
セルの書式設定により時間が表示されています。
ユーザーフォームの中のラベル1にB1からA1を引いた時間を時分秒の形で表示したいのです。
A1は開始時間、B1は終了時間、ラベル1は所用時間と考えてください。
Label1.Caption = Range("B1") - Range("A1").value
とやるとシリアル値っぽいのが出るのですが、時間を表示したいのです。
助けてくださいませ。
0310デフォルトの名無しさん
2008/09/20(土) 03:58:49ホントありがと。
まったくプログラム経験なしだけど、
書いていただいたものをもとに
勉強含め動かしてみたいと思います。
感謝します。
0311デフォルトの名無しさん
2008/09/20(土) 08:40:23DateDiff関数でintervalに"s"を指定して秒単位の差分を取得、
後はそこから時分秒に分割して文字列に結合して完成、って所?
0312デフォルトの名無しさん
2008/09/20(土) 09:24:11一生そのままで朽ち果てろ
0313デフォルトの名無しさん
2008/09/20(土) 10:14:550314y
2008/09/20(土) 13:55:32>311のやり方で可能ですが、他にこういう書き方も。
Label1.Caption = Format(Range("B1") - Range("A1"), "hh:nn:ss")
0315デフォルトの名無しさん
2008/09/20(土) 16:18:39アドバイスどうもありがとうございます。
テストをしてみたのですが、両方とも「’実行時エラー’438:オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というエラーが出てしまいます。
私は知識不足なので対応がわかりません。
これは、どういうことなのでしょうか?
0317デフォルトの名無しさん
2008/09/20(土) 19:35:440318デフォルトの名無しさん
2008/09/20(土) 20:41:320319y
2008/09/21(日) 00:37:26書式指定子 "m" または "mm" は、時刻の分も表しますが、日付の月も表します。それによる混乱を回避するため、
分のみを表す指定子「n」が実装されている、という話を何かの本で読んだことがあります。
ヘルプには、「"h" または "hh" の直後、あるいは "ss" の直前に "m" を指定した場合、月ではなく分が表示されます」とあります。
逆に言うと、mだけを独立して使うと、分ではなく月を表します。つまり分のみを表示させたい状況では、どうしても「n」を使う必要があります。
そういうわけで、分は最初から「n」を使う習慣をつけておいたほうが、間違いが少ないように思います。
0320デフォルトの名無しさん
2008/09/21(日) 00:47:170321デフォルトの名無しさん
2008/09/21(日) 03:56:03なんでこいつこのスレに粘着してるの?
0322デフォルトの名無しさん
2008/09/21(日) 08:47:58テーブルを作成し、いくつか項目を入力した状態で、
GUIでテーブルの見出し行にある矢印メニューボタンを押した時に表示される
フィルタのメニューの処理を、VBAから行うにはどのようにすればよいでしょうか?
例えば、TODOリストを想像してください。
ボタンを配置して、ボタンを押すと、
テーブルの1つの列の「開始日付」が今日のもので、
「状態」列が「未完」となっているもののみを表示する。
また、他のボタンを押すと、元に戻る(というか全部表示)。
といったようなことをしたいのです。
画像を見てもらったほうが早いので、説明画像も作成しました。
http://sylphys.ddo.jp/upld2nd/pc3/src/1221954091856.jpg
どのようなクラスのオブジェクトにアクセスすればいいかだけでも、手がかりがあればと思います。
0323y
2008/09/21(日) 09:13:13チェックを入れたり外したりする操作を、「マクロの記録」(>>1★6)を使って記録して、
生成されたコードを見れば、どんなオブジェクトにアクセスしているか手がかりが
得られると思います。
0324デフォルトの名無しさん
2008/09/21(日) 09:37:36うざいからだろw
0325デフォルトの名無しさん
2008/09/21(日) 09:42:50ありがとうございます。
基本的なことを聞いてしまった様な気がします。テンプレ嫁よ俺。
「開始日付」を「今日」のみ選択、「状態」を「途中」「予定」「スキップ」のみ選んだ時は、
こんな感じで記録されていました。
ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=2, Criteria1:= _
xlFilterToday, Operator:=xlFilterDynamic
ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=1, Criteria1:=Array _
("途中", "予定", "スキップ"), Operator:=xlFilterValues
ListObjectsでListObject(テーブル)が得られて、そのRangeにAutoFilterをかますんですね・・・。
0326デフォルトの名無しさん
2008/09/21(日) 15:51:36同一ファイル内で、シート1上の左側にはシート1の内容、右側にはシート2の内容
のように分割して表示することは可能でしょうか?
(ウィンドウを別々に開くのではなく)
もしやり方があるのであれば教えてください。
Excel2003を使用しています。
よろしくお願いします。
0327デフォルトの名無しさん
2008/09/21(日) 17:20:230328デフォルトの名無しさん
2008/09/21(日) 20:07:05-------------------------------------------
【やりたいこと】
(1).ファイル保存ダイアログでファイル名を選択させる。
(2).新規ファイル名を入力することも可能にする。
(3).ファイル保存時に選択可能なファイルタイプ(拡張子)をVBAで指定する。
【直面している問題】
・Office.FileDialog で msoFileDialogSaveAs を指定すると(3)を満たす方法がわからない
・Office.FileDialog で msoFileDialogFilePicker を指定すると(2)を満たす方法がわからない
【環境】
WindowsXp SP3 + Excel2002 SP3
-------------------------------------------
よろしくお願いします。
0329デフォルトの名無しさん
2008/09/21(日) 21:06:15Excel.Application.GetSaveAsFilename
を使えばよかったんですね。
スレ汚し失礼。
0330デフォルトの名無しさん
2008/09/24(水) 00:40:370331デフォルトの名無しさん
2008/09/24(水) 07:22:11似てるけど全くの別物と思っておいた方がいいよ。
0332デフォルトの名無しさん
2008/09/24(水) 13:31:460333デフォルトの名無しさん
2008/09/24(水) 15:45:030334デフォルトの名無しさん
2008/09/24(水) 16:05:39何処に焦点当てるかで変わってくる
VB6とVBAは、構文規則は全く同じ
組込関数はほとんど同じ
組込オブジェクトは全然別物
>>333
そのVBAとVisual Basic for Applicationは意味違うからw
0335デフォルトの名無しさん
2008/09/24(水) 18:37:44と記述するとA2にデータの未入力状態ということで実行エラーが出てしまうのに、
With Worksheets("表")
.Select
.Range("A2").Select
End With
と記述するとエラーが出ずに問題なく実行されるのはなぜなの?
0336y
2008/09/24(水) 21:36:05そのセル範囲が含まれるシートが選択されていなければ、
実行時エラーが発生する仕様になっているためです。
>335の下のコードは、シートを選んでから、セル範囲を選んでいるので、エラーは発生しません。
上のコードも、「表」シートが選んである状態であれば、エラーは発生しません。
0337デフォルトの名無しさん
2008/09/24(水) 21:57:49こうすればいい。
>Worksheets("表").Select
>Worksheets("表").Range("A2").Select
# って、既に歪の人が書いていたか。
0338デフォルトの名無しさん
2008/09/24(水) 23:27:58xp・excel2002で、関数が物足りなくなってきたのでマクロとVBAの勉強始めました。
ネットで検索するとaccessにもVBAとかマクロとか関数も?あるようです?
同僚に挫折したaccessのVBAの本ならあるから1500円で譲るよ。と言われたのですが、
excelとaccessのVBAは同じものですか?全く別物でしょうか??
すみません、宜しくお願いします。
0339デフォルトの名無しさん
2008/09/24(水) 23:33:34AccessVBAの本ではVBの勉強にはなるかもしれないがExcelVBAの勉強にはならないので
1500円も出すくらいならちゃんとした本を買いましょう。
0340デフォルトの名無しさん
2008/09/24(水) 23:37:41VBAそのものは同じだけど操作対象が全く別物なのでお勧めできない
0341デフォルトの名無しさん
2008/09/24(水) 23:44:40レスdくすです。
つまり、同じものだけど違うものだから?エクセルのVBAの本を買うべき。
と言うことですね?ありがとうございました。
危うく、accessの本を読んでexcel挫折するところでしたw
0342デフォルトの名無しさん
2008/09/25(木) 00:42:240343デフォルトの名無しさん
2008/09/25(木) 15:13:33Dim Tbx As TextBox
Num = 0
For Cnt = 1 To 9
Num = Num + 1
Set Tbx = "TextBox" & Num
Tbx.Text = ""
Next
VBAは変数の型を自動変換してくれると考えて、これを実行すると、
「コンパイルエラー:型が一致しません」と出ちゃいます。無理かな。
0344デフォルトの名無しさん
2008/09/25(木) 16:09:13>Dim Tbx As TextBox
>Set Tbx = "TextBox" & Num←何がしたいんだ?
TextBoxは文字列ではないからコンパイル通らなくて当たり前だな
Set Tbx = Worksheets(1).OLEObjects("TextBox" & Num)
なら理解できる
0345デフォルトの名無しさん
2008/09/25(木) 16:39:59サンキュー!!!!!!!!!
0346デフォルトの名無しさん
2008/09/25(木) 16:45:25Dim Cnt, Num As Integer と書くと cntはVariant型だぞ
0347デフォルトの名無しさん
2008/09/25(木) 17:07:39わざわざ有難うございます。いただいたアドバイスをヒントに修正しました。
やりたかったのは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
0348デフォルトの名無しさん
2008/09/25(木) 18:48:290349デフォルトの名無しさん
2008/09/26(金) 09:26:40えっろっびっでぉー
0350デフォルトの名無しさん
2008/09/26(金) 18:02:31excelが対象なのに、VBAだけじゃ意味無いだろw
おとなしくメモ帳に書いとけ。
0351デフォルトの名無しさん
2008/09/27(土) 22:33:470352デフォルトの名無しさん
2008/09/27(土) 22:35:180353デフォルトの名無しさん
2008/09/27(土) 22:53:05VBAにエクセルが付いてくる…マ
>350は素人
0354デフォルトの名無しさん
2008/09/27(土) 23:28:04これ、笑うところ?
あ、マってプログラ"マ"じゃなくて"マ"ヌケってことか
それなら納得
プログラマがこんな本質を違えた愚かな発想するわけないもんなw
0355デフォルトの名無しさん
2008/09/28(日) 00:02:57サクラエディタにでも書けばいいじゃん。
0356デフォルトの名無しさん
2008/09/28(日) 00:09:480357ちら裏
2008/09/28(日) 06:12:413つとも全部違うと思って欲しい。
それぞれ用途がかなり違う。文法も基本的な部分は同じでも、
実際にコードしてみると、かなーり違うことがわかる。
例えばVBA(もしかしてVB.NETも)では識別子に漢字交じり日本語が使える。
DLLなどの外部モジュールを最も簡単に呼び出せるのはVB。
VB.NETでは網羅されて使いやすいCLRが使える。
Excel付属のVBAでは、これらは出来ないか出来ても酷く面倒
しかしExcelのVBAは
精々ユーザー定義関数の定義や、外部ファイル入出力関係の
典型処理の組み込みや、フールプルーフ目的のフォーム作成
といった補助的な利用に留めておくべきで、ExcelをVB
環境の一種として取り扱うのはやめたほうがいい。
(VBを学ぶ環境としては余り適していない)
0358デフォルトの名無しさん
2008/09/28(日) 08:25:19って何かと思っていたら、VBAの次世代版だったのか。
Office2003からVBAと並行して使えるようになっていたのな。
.NET2.0ベースで、VB.NET以外にもC#が使えるのは楽しそうだなあ。
>>356
VBAサポート打ち切ったら、マジ売れなくね?
0359デフォルトの名無しさん
2008/09/28(日) 12:22:40ひどい知ったかなので、初心者は信じないように。
0360デフォルトの名無しさん
2008/09/28(日) 12:56:22失敗の経験も貴重だから、確かにそうだな。
0361デフォルトの名無しさん
2008/09/28(日) 14:37:522008で「切り捨てて」AppleScriptに変更したら非難ごうごうで(当たり前)
次でやっぱりVBAを復活させるってさ
0362デフォルトの名無しさん
2008/09/28(日) 21:06:11意味がわからん
0363高島彩
2008/09/29(月) 15:57:370364HIRO ◆225xxx6ZSE
2008/09/29(月) 16:07:10(U( )
| |∨T∨ 皆さん、>>363をよろしくお願いします。
(__)_)
0365高島彩
2008/09/29(月) 16:12:29/∵∴∵∴\
/∵∴∵∴∵∴\
/∵∴∴,(・)(・)∴| / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|∵∵/ ○ \| < >>364 氏ねよ!!
|∵ /. ミ | 彡 | \_______
|∵.| \___|_/| ___
\| \__ノ / / \
\___/ /∧ \
/ ) | × | _ _
/ ,イ 、 ノ/ |●( ―= ̄ `ヽ, _
/ / | ( 〈 ∵. ・\ 〈__ > ゛ 、_―
| ! ヽ ー=- ̄ ̄=_\_(/ , ´ノ
| | `iー__=―_ ;, / / /
!、リ -=_二__ ̄_=;, / / ,'
/ / / /| |
/ / !、_/ / 〉
/ _/ |_/
ヽ、_ヽ
0366デフォルトの名無しさん
2008/09/29(月) 21:36:04ごく普通にやればいいだけだよ
VBやCでやるのと同じように
つーか、ワークシート使わない方法になると>>1にも書いてある通り
VBAではなくVB分野になるのでスレ違いだな
あとは自分で調べましょう
0367HIRO ◆225xxx6ZSE
2008/09/30(火) 00:14:01(U( ) >>366
| |∨T∨ ありがとうございます。
(__)_)
0368デフォルトの名無しさん
2008/10/01(水) 00:19:39ニコ動で一時期流行った侵略ゲームをExcelで再現してみたのですが、
やはり(?)あまり速度が出ません。
いろいろ頑張ってみたのですが、自分の限界に達したようなので、
速度が向上する方法がありましたらアドバイスをいただけると助かります。
http://uproda11.2ch-library.com/src/11122054.zip.shtml
0369368
2008/10/01(水) 00:36:04OS:Vista
私の環境では、ウィンドウを最大化しておかないと何故かフリーズしやすいです。
フリーズというか、画面は固まりますが裏では動いています。
0370デフォルトの名無しさん
2008/10/01(水) 03:44:42全く試さない上でVBA素人の俺が脊髄反射レス
・基点となるセルからoffsetで上下左右1ずつ隣のセルの値を取得して、
それを評価した方がいいんジャマイカ
・セルのプロパティのアクセスを都度行うのは重いから、
一度マップ範囲を c = Range("x:y") のように配列に入れて、
値から何とかした方がいいんジャマイカ
・ScreenUpdating を最初から False に(ry
嘘ですごめんなさい
0371デフォルトの名無しさん
2008/10/01(水) 07:26:33Randomize
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
0372デフォルトの名無しさん
2008/10/01(水) 07:27:04For 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
0373368
2008/10/01(水) 07:43:19一応貼っときます。
戦闘力はランダムのはずですが、
何故か名古屋が強い気がします・・・
0374デフォルトの名無しさん
2008/10/01(水) 14:08:29フリーズは再現できなかったけどとりあえず軽くしてみた
やったことは
1.色を配列に入れてこねくり回すようにした
2.色が変化しない時は再設定しないようにした
3.気に入らなかったのでElseifをSelect Caseにした
0375374
2008/10/01(水) 14:08:53Sub 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
0376374
2008/10/01(水) 14:10:02Application.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
0377374
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
0378デフォルトの名無しさん
2008/10/01(水) 15:41:37最初の処理(以下、処理B)でセルを変更しています。
処理Bのときだけ処理Aを走らせないようにしたいのですが、
どうしたらいいでしょうか。
0379デフォルトの名無しさん
2008/10/01(水) 16:09:13Application.EnableEvents = False
かな?
0380デフォルトの名無しさん
2008/10/01(水) 16:31:03まさにそれでした。ありがとうございました。
最初「Application.EnableEvents = False」の一行見たとき意味わかりませんでしたが、
ググッたら使い方でてきて何とかなりました。
ありがとうございました。
0381368
2008/10/01(水) 22:30:32>>374
ありがとうございます。
予想以上に速くなりすぎていて驚きました。
色を配列に入れるところまで考えが至りませんでした。
ところで、戦闘力はランダムのはずなのに勝者に偏りがありすぎます。
いくつかのマップで10戦ずつやってみたところ、
愛知県マップ・・・名古屋9勝、西三河1勝、東三河0勝
「目(上中下の3色)」マップ・・・上9勝、中0勝、下1勝
「田(4色)」マップ・・・左上8勝、左下2勝、右上0勝、右下0勝
という結果で、左上に近いほど強いとしか思えません。
謎です・・・
0382デフォルトの名無しさん
2008/10/01(水) 23:44:27謎でもなんでもないじゃん。
・hsMapの値が整数で0-100程度でしかないから最大値を取るセルが複数できやすい。
・Select Caseで上左の順でチェックしているから上や左が優先されやすい。
つまり、上や左から侵食されやすい傾向があるわけ。
最大値を取るセルが複数ある場合に微妙に優先度を調整するか、
値の変動幅を大きく取って最大値を取るセルが一つになるようにするかってところかな。
0383デフォルトの名無しさん
2008/10/02(木) 05:20:47if dir( 255文字以上のパス ) <> "" then
0384デフォルトの名無しさん
2008/10/02(木) 05:48:56If fs.fileExists(ぱす) = False Then
でいけたかも。他にあれば教えてください。
0385368
2008/10/02(木) 07:45:57それは私も考えました。
それが原因なら、判定の順序を「下→右→上→左」とすれば、
下や右が強くなるはずです。
順序を変えてやってみましたが、
名古屋8勝、西三河2勝、東三河0勝
上7勝、中3勝、下0勝
左上7勝、左下1勝、右上2勝、右下0勝
と、やはり左上に近いほど強いようです。
まあ、10回程度だと偶然偏りができることも考えられますが・・・
0386374
2008/10/02(木) 10:40:57比較する順序ではなく色を入れ替えるタイミングの問題では?
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
と更新前の色を入れてやれば少しは改善するかもしれません
0387デフォルトの名無しさん
2008/10/02(木) 14:59:02マクロ入りのファイルを開いても、マクロが実行できません。
VBAを使っていろいろ処理して終了させます。
処理の中では画面更新の抑制やら色々やってます。
マクロを実行したbookを閉じてから、マクロが入った
ファイルを開くと、右クリックで新規ウィンドウ等を
やらない限りは必然的に、既に開いているExcelを使って
ファイルが開かれると思うのですが、そうなるとマクロが
動かないんです。
セキュリティの問題ではなくマクロが無いファイルのような
そんな扱いです。やはり、色々標準の機能を殺しているのが問題で
それが終了しても保持され続けているのが問題なのでしょうか??
0388デフォルトの名無しさん
2008/10/02(木) 15:20:53セキュリティの設定は何になっているんですか?
低になっていてかつApplication.EnableEventsがFalseだった場合
マクロは自動実行されないはずなので何も起きていないだけでは?
0389デフォルトの名無しさん
2008/10/02(木) 20:31:10Range("1:1,3:3").Select
と言うコードが得られますが、
変数を用いて、a行目とb行目を選択する場合には、どのように記述すれば良いのでしょうか。
よろしくお願いします。
0390デフォルトの名無しさん
2008/10/02(木) 20:41:43Dim a As Integer, b As Integer
Rows(a & ":" & b).Select
0391390
2008/10/02(木) 20:45:59Dim a As Integer, b As Integer
a = 1: b = 3
Range(Rows(a).Address & "," & Rows(b).Address).Select
0392デフォルトの名無しさん
2008/10/02(木) 21:42:23for loopの入れ子でループを抜けたいときは
gotoするのが一般的なんでしょうか?
gotoってあんまり使うなと言われているので
For intI = 3 To 65535
For intJ = 1 To 255
'条件が一致すればここからいっきに2つのループを抜けたい
Next intJ
Next intI
あとループ変数って単純にi,j,kとするか
なにかしらわかりいい名前をつけるのかどちらがいいのでしょうか
よろしくお願いします。
0393デフォルトの名無しさん
2008/10/02(木) 21:48:27(無論そのための仕組みが存在する言語なら話は別だが)
ループ変数はi, j, kとするのが単純かつ分かりやすい。
intIですらやめてくれと言うところだ。
0394デフォルトの名無しさん
2008/10/02(木) 22:11:03ありがとうございました
0395デフォルトの名無しさん
2008/10/02(木) 22:40:28プログラムが大きくなってくると1文字の変数は探しにくい
やりたいことにもよるだろうが
1文字で済ませる癖は付けないほうがいいと思う
0396デフォルトの名無しさん
2008/10/02(木) 23:09:51それはプロシージャを分割した方がいいんじゃないかな
0397デフォルトの名無しさん
2008/10/02(木) 23:23:45標準モジュールの違いがいまいちわからん
クラスはオブジェクトとして使ったりコンパイルしてDLLとして参照すると
名前でプロシージャーを呼び出せるってことなのか?
標準だと他のモジュールのって呼び出せない?
0398デフォルトの名無しさん
2008/10/02(木) 23:39:33union(rows(a),rows(b)).Select
0399368
2008/10/02(木) 23:51:05ありがとうございます。
強さが均等になりました。
言われてみれば、あのプログラムでは左上が強くなるのも当然ですね。
実は、初期はちゃんと古いマップから色を持ってきていたのですが、
高速化のためにいろいろやっているうちに、古いマップを省略してしまったようです。
0400デフォルトの名無しさん
2008/10/03(金) 00:02:25ループ自体をForで探せばいいじゃない。
あと、ループ変数をi, jとしないなんてVB以外では聞いたことないってただの個人的経験だけど。
0401デフォルトの名無しさん
2008/10/03(金) 09:05:00VBA分野の話じゃないね、スレ違い
0402デフォルトの名無しさん
2008/10/03(金) 09:26:222重ループ脱出はForとDoを併用するのが常套手段
For intI = 3 To 65535
Do Until intJ = 255
Exit For
Loop
Next intI
0403デフォルトの名無しさん
2008/10/03(金) 19:39:080404デフォルトの名無しさん
2008/10/03(金) 20:28:55それは無い
0405デフォルトの名無しさん
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されてしまいます。
0406>401
2008/10/03(金) 23:22:310407デフォルトの名無しさん
2008/10/03(金) 23:40:02セルをセットした後にExit For
0408デフォルトの名無しさん
2008/10/04(土) 00:55:23自宅にパソがないので平日会社で試すしか方法がないのですが、何枚かのエクセルファイルを開きセルA6に別の表から拾った値を引っ張ります
これがシートならば全シートを選んでVLOOKの式でもA6に入れればいいのでしょうが各ファイルを別々に保存しなければなりません
一度一つのファイルにまとめて入力後またばらしてもいいのですがそれならファイルを開けて手入力する手間とさほど変わりません
多くて40ファイルです
どうぞよろしくお願いしますm(_ _)m
0409デフォルトの名無しさん
2008/10/04(土) 01:25:38その情報だけだと使えそうな手段は2つくらいしか思いつかない
1.VBAで表をまとめてLOOKUP
2.VBAで該当する値を直接取りにいく
>一度一つのファイルにまとめて入力後またばらしてもいいのですが
何がしたいのかよく分からないw
>ファイルを開けて手入力する
これは目視で値を確認していって該当する値を移すってことでしょうか?
>多くて40ファイルです
40ファイル見るだけなのかすべて更新するのかどちらでしょうか・・・
0410デフォルトの名無しさん
2008/10/04(土) 01:47:52おそらくあまりに初級なので難しく捕らえていらっしゃるかもしれません
見に行く表にはA列に番号(12桁)B列にも番号(9桁)がありこれが多くても40種の意味です。重複はしていない番号ばかりです
そしてA列の番号がファイル名にもなっている1枚シートしかないファイルのセルA4に先程の12桁が入っているがセルA6に今までは手入力で9桁番号を入れていました
目視です。一応FIND窓で捜しはします…
独立させずシートとしてまとめたら一度に処理できるかと考えたのですが、、
0411デフォルトの名無しさん
2008/10/04(土) 02:00:03なお40種は40行の意味です
0412デフォルトの名無しさん
2008/10/05(日) 09:52:11横レスします。
状況を私なりに解釈し、不足するところをおたずねします。
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ブックにまとめられませんか?
0413デフォルトの名無しさん
2008/10/05(日) 12:46:49まず参照元と作業用の違いを私自身があまりわかってないかもしれません。携帯からのカキコで字数が限られ申し訳ないです(>_<)
@A→参照する表は1ブックでそこに多くて40行2列、少ない時は10行2列くらいの表が1シートだけに表記してあります
BC→OKです
Q2→確かにひとつのブックにまとめればいいのですが、保存が1ブック1シートでないといけないのです(請求書みたいな感じ)
なおかつそのブック名もセルA4の番号をつけないといけません
15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると間違いや画面の一杯さで
頭がくらくらしてしまい、楽な方法がないかとお尋ねしてみました
まだ言葉足らずかと思いますがどうぞよろしくお願いいたします
0414デフォルトの名無しさん
2008/10/05(日) 14:25:37やりたいことの自分なりの稚拙な解決方法を思いつくのだが、その具体的なやり方がわからずに
ぐだぐだと質問&回答を続ける。
良い質問方法:
やりたいことをまず具体的に書く。やりたいことというのは、ユーザレベルでの話し。
0415デフォルトの名無しさん
2008/10/05(日) 15:03:16やりたい事は毎日新たに発生するブックのセルA6に、セルA4に対応した9桁の番号を拾ってきて自動入力し保存するという事です
セルA4に対応した番号は他のブックに見に行きます
この表現ではどうでしょうか? あまりに簡単な作業かもしれませんが良い方法があればよろしくお願いします
0416デフォルトの名無しさん
2008/10/05(日) 16:11:49商品マスタ(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列
これはどのタイミングでどのような理由で変更されるのか?
0417デフォルトの名無しさん
2008/10/05(日) 16:16:17お前が超絶難しいと思ってるものでも、ソルバ一発で解決できる類の問題もあれば、
単純作業を自動化するだけなのに、プログラム的にはすげー面倒な場合もある。
0418デフォルトの名無しさん
2008/10/05(日) 17:42:54それで1点、OrderBook名には「請求書M...」みたいにセルA4に日本語が3文字ついていたかもしれません
また、10コか40コかはメール受信によって左右されます。メールの添付をどこかのフォルダに保存し何等かのマクロを実行するとよそにそれに対応した9桁の番号が、
検索されるのか作成されるのかするのでそれを本日分として拾ってくるわけです。でセルA6は空白なので入力して完成させる…
自分は記録マクロしかできないのですが、もし自分がVBAに詳しければ@OrderBookのシート1を一つのブックにまとめる
AProductシートもそこに挿入BVlookupでセルA6に値入力Cシートをばらして保存
とかが簡単に出来るのかな?のイメージでした;ω;
スミマセン
0419412
2008/10/05(日) 17:49:34もう一回自分なりに解釈したものを書きます。
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関数を書いたらいいんじゃないかな。
外部参照って言い方が正しいのかわからないけど、ヘルプで
「ほかのブックやアプリケーションへのリンクを設定する」を見てみてください。
0420412,419
2008/10/05(日) 17:50:560421デフォルトの名無しさん
2008/10/05(日) 18:16:273.の行程上でセルA4には12桁の番号が既に入った状態で届きます。こちらで入力はしません
VLOOKもいいのですが作業用ブックの開け閉めが面倒いというか少ない時はいいのですが、多い時にはどれがどれやらわからなくなるのです
0422420
2008/10/05(日) 18:41:03↑のことも入れて、もう一回自分なりに解釈したものを書きます。
1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。
(内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測)
2 結果を求める(作業用)ブックはメールにて複数送られてくる
なので、作業用ブックに個々に計算式等を入れるのは無理(あるいは極力回避)
3 作業用ブックのA4セルには既に12桁の番号が入力されていて、
・現状では 参照元ブックを開いてA列に一致する行のB列の番号(9桁)をA6セルに入力して保存(の繰り返し)
・したいこと マクロブックを開いてマクロを実行したら、複数の作業ブックを手動で開かなくても
それぞれのブックのA6セルに自動的に対応する9桁の番号が記録されている
※作業対象のブックを指定する作業は手動か?
(作業対象ブックが保存されているフォルダを指定できれば自動化も可能)
0423デフォルトの名無しさん
2008/10/05(日) 18:52:530424デフォルトの名無しさん
2008/10/05(日) 19:10:08'作業対象のブック指定は手動?'の意味が今一つわかりませんがデスクトップにでも予めフォルダごと保存しておいて、作業をしてもらおうか?という算段です
というのも引継ぎでは手入力推奨でしたのでネットワークの中で何かやると怒られるかも?とか考えたり
ま、推奨程度ですからきちんとセルA6に番号が拾えていたら結果オーライだと思うのですが…
0425422
2008/10/05(日) 20:00:20流れとしてこんな感じかな? 画面更新をしないようにすれば画面がチラつきません。
1 作業ブックが収められているフォルダ中のエクセルファイルの一覧取得
2 参照元ブックを開く(ついでに2列×数十行のデータを配列に取得)
3 参照元ブックを閉じる
4 上記1で取得したファイル一覧からひとつずつ処理
(1) カレントブックを開く
(2) A4セルの値を取得
(3) 配列を調べて対応する値をA6セルに書き込む
(4) カレントブックを閉じる(変更確認ダイアログを非表示にしておくといい)
(5) (1)〜(4)の繰り返し
5 終了(画面更新再開)
処理がちゃんと進んでいるか確認するために、マクロを記録したブックに
A列:カレントブック名(もしくはフルパス)
B列:A4セルの値
C列:A6セルに書き込んだ値
を上から順に書き込んでみるといい。その場合は画面更新を停止しないように。
0426デフォルトの名無しさん
2008/10/05(日) 20:02:14関数を自作しようと思ったのですが、
その関数が代入されるセルのオブジェクトを取得することは可能でしょうか?
入門サイトを一通り見たのですが、そのような記述が見つかりませんでした・・・。
可能であれば関連するキーワードか、簡単な実装方法など教えていただけるとうれしいです。
0427デフォルトの名無しさん
2008/10/05(日) 20:02:53OS:XP、Excel2003
Module5で、Public Sub AAA() という関数を作成して
Module1で使おうとすると「名前が適切ではありません」というエラーが出ます。
Module1に関数を作成して、Module5使うことは出来ています。
これは、モジュール名の順番みたいなものが関係しているのでしょうか?
0428デフォルトの名無しさん
2008/10/05(日) 20:30:01マルチスレッドで処理をしたいのですがうまくいきません。
以下のテストコード(スレッド系関数の宣言は省略)で、セルへの書き込み自体は問題なく出来るのですが、
エクセル終了時や保存時等ににエクセル自体が落ちてしまいます。
どこが問題なのでしょうか?ご教示お願いします。
'----モジュール------
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
0429デフォルトの名無しさん
2008/10/05(日) 21:11:43は、はぁ、、そんなかんじかと思いますがそれは記録マクロでできる作業なのでしょうか……
あまりな初級な質問ですみません
0430デフォルトの名無しさん
2008/10/05(日) 21:36:030431デフォルトの名無しさん
2008/10/05(日) 21:37:46ド素人がVBAでマルチスレッドを使おうとするのが問題
0432デフォルトの名無しさん
2008/10/05(日) 22:21:52作ってください!お願いします(^人^)
でももしかして記録マクロでもできる人はできるのかと思ったり(自分では無理ですが)……
何か自分の知らない簡単な方法があるような気がしてならなかったり?
0433デフォルトの名無しさん
2008/10/05(日) 22:32:39作るって、何を作る事だと思う?
と言うか、作成依頼はスレ違い。
自分でやって、分からない事を聞くようにしておくれ。
0434425
2008/10/05(日) 22:39:17このスレのbPの
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
は見てなかったようですね。
自分は明日の夕方以降ならなんとか対応できると思いますが、急ぐんだったら
この件のやりとりの部分 を印刷でもして職場でVBAのわかる人に見せてください。
マクロの記録だけではほとんどできません。条件分岐とか繰り返しとかファイル処理とかいろいろ
あります。
あるフォルダの中のディレクトリ一覧を取得して印刷する部分だけでも↓みたいになります。
http://www.excel.studio-kazu.jp/mag2/backnumber/mm20041012.html
0435デフォルトの名無しさん
2008/10/05(日) 22:39:410436デフォルトの名無しさん
2008/10/05(日) 22:44:42ってだけの簡単なことなんだけど、細かいところが不明なんで丸々作るめんどくさいのでパス。
0437デフォルトの名無しさん
2008/10/05(日) 22:46:490438デフォルトの名無しさん
2008/10/05(日) 22:47:200439デフォルトの名無しさん
2008/10/05(日) 23:08:07エクセルの学校の添付を有難うございました
私自身は忘れているとはいえ?ベーシックくらいは少し学んだのですが全く身についていないようですorz
手でやると、1回なら簡単な作業なのに文章にするとこんなにややこしくなるとは!!
ちょっとこの週末は時間がなかったのですが確かに自分であれこれ試してみたいと思います
会社では現在は時間が全くありませんがそのうち手薄になれば挑戦してみます!
0440デフォルトの名無しさん
2008/10/05(日) 23:30:16以前仕事で、とあるScript言語で食ってたんだけど、1年経ったら全部忘れてた。
0441デフォルトの名無しさん
2008/10/05(日) 23:32:35で、もう一つ質問させてください。
自作関数の演算結果を複数のセルに表示したいのですが、
Function func()
func = 1
ActiveCell.Offset(1).Value = 2
End Function
こうやるとこけてしまいます。
funcの返り値でなくActiveCell.Valueに代入すると循環参照で怒られます。
どうにか解決する方法はないのでしょうか?
0442427
2008/10/05(日) 23:38:12お願いします。
0443デフォルトの名無しさん
2008/10/05(日) 23:54:28Module5に作成してModule1で呼ぶのも
Module1に作成してModule5で呼ぶのも
問題なく出来ている
つまり「Module5に作成してModule1で呼ぶ」こと以外に問題があるということだ
ちょっとした自分のミスに気付かず、首を捻り続けたりソフトを疑ったりなんてよくあることだ
まずは新規ブックを作成して、標準モジュールを5個挿入し
Module5にPublic Sub AAA()
Module1にAAAの呼び出しプロシージャだけ書いて実行してみろ
それでダメならExcelもしくはOfficeはたまたWindowsを再インストールした方がいい
これで問題なく実行できるなら、自分のミスに気付いてないだけだ
0444デフォルトの名無しさん
2008/10/06(月) 01:10:32プロの人でさえ1年で!?
なんとか頑張ってみますと書いたものの、あの業務量を思うと頑張る暇などとてもなくゆーうつ・・・
はぁー、、楽したい。。
0445デフォルトの名無しさん
2008/10/06(月) 01:44:55ttp://support.microsoft.com/kb/170787/ja
0446441
2008/10/06(月) 02:03:42こんな・・・制限が・・・あった・・・なん・・・て・・・orz
VBAなんか大っ嫌いだうわあぁぁん
ありがとうございました。本当に助かりました。
0447デフォルトの名無しさん
2008/10/06(月) 02:41:530448デフォルトの名無しさん
2008/10/06(月) 05:32:26まずは、A6にvlookup入れて値コピーで上書きするマクロでも作ったら?
ファイル開いたり保存するのは取り敢えず手動としても、目視手作業で
入力してるよりよっぽど楽になると思う。
そこから徐々に、自動でできる部分を増やしてけばいいんじゃねーの?
あんたがVBA習得するまで仕事が待っててくれるならいいけどさ、
なんも出来ねーくせに余計なことばか考えて、自分で仕事増やしてるだけじゃね?
0449デフォルトの名無しさん
2008/10/06(月) 09:12:10月100時間勉強するのを三ヶ月位続ければ、あとは楽になるよ
0450デフォルトの名無しさん
2008/10/06(月) 19:17:30>>448
それはいい考えだと、本日早速セルA6にA4を見て予め用意した表から拾って来てくれ頼む!を打ち込んだところ………
後ろにもう一枚嫌なシートがあってなんと式がセルA6にそのまま表示されてしまうていたらく
後ろのシートとなんかリンク?が貼ってあるかのような得体のしれなさでもう素直にFIND窓で目視で探しました
件数も15件くらいでしたし
他の仕事があまりに立て込んでてそのシート間の関係さえ検討できないほどの忙しさなのです
もうフラフラです
皆様も季節柄お体気をつけて!
0451デフォルトの名無しさん
2008/10/06(月) 19:30:13Excelの使い方はよそで聞いて&愚痴ってくれ。
0452デフォルトの名無しさん
2008/10/06(月) 20:24:010453434
2008/10/06(月) 20:52:44作ってみました。長いので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
0454デフォルトの名無しさん
2008/10/06(月) 20:53:51Private 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
0455デフォルトの名無しさん
2008/10/06(月) 21:37:47はい次の方
0456448
2008/10/06(月) 21:40:19もうあきれて物も言えん、、、
0457デフォルトの名無しさん
2008/10/07(火) 10:54:200458デフォルトの名無しさん
2008/10/07(火) 22:39:190459デフォルトの名無しさん
2008/10/07(火) 22:54:35:= ←これはどういう時に使うものですか?
本見てもよくわかりませんでした('A`)
0460デフォルトの名無しさん
2008/10/07(火) 23:59:42詳しい人がいないようなので、未熟ながら小生がヒントを。
上の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行とみなす)続けて書くときに必要となるものです。
こういう説明でわかりますか?
0461デフォルトの名無しさん
2008/10/08(水) 00:02:450462460
2008/10/08(水) 00:12:19→Openメソッドでフォルダのパスを指定 じゃなくて、
→Openメソッドでファイルのフルパスを指定 だった。
0463デフォルトの名無しさん
2008/10/08(水) 21:17:17お時間を割いて頂きたいへん有難うございました
ノートに早速書き写したところなんと2頁にも及ぶなんて!(記録マクロと大違い)
段落が判らないので近い内ネカフェに印刷しに行けたら、と思っています
本当にありがとうございました
また、余りの忙しさにお礼が遅れすみませんでした
あの後記録マクロに成功し開けたり閉じたり繰り返したりができないものの、VLOOKでショートキーを使い保存までこぎつけました
目視と比べとても楽ちんでした
ところがご指摘のとおり後ろにマクロ用?のようなシートがついているせいか?セルの表示が尋常でなく無理矢理値貼付けで乗り切ったのです
その後9桁の数字が入力されたブックをマクロに通す作業がありましたので
0464sage
2008/10/08(水) 21:22:35その中でVBAという物を使うということで質問をしに来ました。
内容は集計ボタンを押すと
同フォルダ内に配置されてるエクセルのファイル名を読み取って
事前に用意されている集計表の中に概要をコピーするというものです。
集計対象のエクセルは毎週作成され、「ファイル名称(作成日付)」で作られていき
数ヶ月に一度集計ボタンを実行します。
VBA、というかプログラムは全くのド素人ですが、
どういった文法?で作れば良いかなにかヒントだけでも教えて頂ければと思いこのスレに来ました。
皆さんどうか知恵をお貸し頂けないでしょうか、宜しくお願いします。
0465デフォルトの名無しさん
2008/10/08(水) 21:36:56間違えて人の(どのブックにも3〜5個はある)は解放してないとは思うのですが、その後マクロの消えたブックになったりならなかったり
挙句いつもきちんと実行(9桁の番号が入ったブック達を通す)できていたマクロがデバッグ
とりあえず慌てたものの優先事を片付け、再度初めからメール添付を保存しなおし今度はマクロを使わず手入力し、
手順のマクロを実行すると……………デバッグ
解放がいけなかったのでしょうか
記録マクロがいけなかったのでしょうか
黄色い行には"後ろのシートをアクティブにetc…"となっています。勿論このマクロは私が実行した記録マクロと違いえらい長く書いてある別の仕事の為のマクロです(抽出とまとめ)
0466デフォルトの名無しさん
2008/10/08(水) 21:41:57>>1★5
ここは右も左も解らない奴が来るところじゃない
どういう処理がしたくて、どういうコードを書いたが、どの部分で躓いてるのかを
具体的に質問できるレベルになってから出直すか
急ぎや勉強が嫌なら、金払ってVBAコード書いてくれるところに依頼しろ
車を運転するには免許が居るように、便利な物を利用するにはそれに応じた資格(スキル)が要る
その資格無しに利便性を求めるなら、車でもタクシー使ったり運転手雇ったりするように
金使って解決しろ
0467デフォルトの名無しさん
2008/10/08(水) 21:48:54453、454の中に書かれていますよ。
あと、434で紹介されたurlも参考になると思います。
文法云々ということであれば、エクセルVBAの入門書を入手するか、
ウェブの初心者向けサイトを調べてみてください。
それから、このスレのbPをよく読んでください。
0468デフォルトの名無しさん
2008/10/08(水) 21:54:43その場合保存さえしなければ誰かが作成された、いつもは健全に働くモジュールを壊す事にはなりませんよね?
いつもエラーなど発生しないのに私が要らないマクロを被せたせいで何かがどうかなったのでしょうか
自分のだけ解放しても他のマクロに影響があるのでしょうか
それだけではないのです
今日は昼飯時に453さんの回答に気づきお礼をカキコするつもりが横に置いていた鞄に散歩中の犬がしっこをかけたのです!
こんな目に遭う人がいますでしょうか
仕事もテンパリは続き少々のアルコールでは何にもなりません
皆様もこの寒暖の激しさにはお気をつけ下さい
0469453,454
2008/10/08(水) 22:11:56まだ、私が453〜454に書いたものは実行していないと思いますが、念のため書いておきます。
上記マクロは新規ブックの標準モジュールに書いてください。(ファイル名は任意ですが、
以下の説明ではマクロブックと呼びます)
あなたが仕事で扱うブックには絶対に書かないでください。
エクセルを起動したらマクロブックを開き、ツール−マクロ−編集− prog_408 を選びます。
マクロ文中のフォルダ指定とかセル範囲などを実際のものに変更したうえで、いったん保存。
そのうえでprog_408を実行してみてください。
なお、私はWindowsXp、Excel2003で試しています。
ここまで書いたところで、468を見たので追加
465で書いてある「自分のショートキーのモジュールを解放」が気になる。そのモジュールにはあなたの
マクロだけしか書いてなかったのかな? 本当に「自分のだけ」のモジュールでしょうか?
ひとつのモジュールには複数のマクロが記録されるんですよ。
壊れてしまったものは、現場で対応してもらうしかないと思います。
0470デフォルトの名無しさん
2008/10/08(水) 22:56:330471デフォルトの名無しさん
2008/10/08(水) 23:34:460472デフォルトの名無しさん
2008/10/09(木) 00:01:02モジュールが単独だったか複数かという事ですが、珍しくうまくいった為解放する前にモジュールを表示させて自分の記録マクロを印刷しました
そこには15行程度の構文が書かれていたのみですので下の方にもあったか?となるとおそらくなかったような……
なお記録する前に保存先を作業中のブックよりもう一つ深い範囲に適用する、を選択したと思います
これがいけなかったのかもしれません
あぁ楽をするのも大変ですね……
お先にお休みさせて頂きます。ありがとうございました。。
0473デフォルトの名無しさん
2008/10/09(木) 07:42:16現在PC環境にありませんが是非訪ねてみたいと思います! 晴れた今日も良い一日を!!
0474デフォルトの名無しさん
2008/10/09(木) 08:47:46>>1の★5のことだ・・・
マジでテンプラ読めないやつ増えてるのか?
0475デフォルトの名無しさん
2008/10/09(木) 09:51:500476デフォルトの名無しさん
2008/10/09(木) 10:17:49どのブックにもVBAモジュールがある…だと?
あんた、「1ブックにはそれぞれ1シートしかないから、全シートを
一旦まとめて、後でまたバラして保存すれば…」なんて書いてたよな。
それでどういうことになるのかわかってるのか?
あんたみたいなのは下手なことに手を出すな。
気づかない内に絶対まわりに迷惑かけてるから。
後始末する側の身にもなれ。
0477デフォルトの名無しさん
2008/10/09(木) 11:00:15他にVBAとか入ってるなら下手したら変数名とかかぶるし
0478デフォルトの名無しさん
2008/10/09(木) 11:17:510479デフォルトの名無しさん
2008/10/09(木) 18:06:20この値をVBAで取得する方法があれば教えて下さい。orz
0480デフォルトの名無しさん
2008/10/10(金) 21:21:370481デフォルトの名無しさん
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
0482デフォルトの名無しさん
2008/10/11(土) 07:15:22まあfooかbazに入れてる値がまずいんだろう
0483デフォルトの名無しさん
2008/10/11(土) 07:46:33犬に聖水をかけられた鞄は無事洗濯いたしました
ところで9桁の番号を取得した後に'抽出とりまとめ'の長いコードの最初でデバッグが出始めた話でしたが
なんと手順を間違えていたらしい事が昨日判明しました
そのとりまとめ用の長いコードを実行するにはエクセルを全部閉じておいて、マクロブックを先に開いた後
例の9桁番号を取得したブックたちを開かなければならなかったのが、9桁の事で頭いっぱいでそちらを先に開いていたのです
恐らくこれが原因だったようです。まだ1回しか成功していませんがこの、全部閉じとけよ!はどのコードだったのでしょう?
しかもそこで黄色になる訳ではないのですね??
もっと丁寧なデバッグ説明表示ならいいのに……
0484デフォルトの名無しさん
2008/10/11(土) 07:59:35ほんとに単純なシートなので高度なコード?ではないようです
デバッグが出てヒィヒィ言っていたマクロブックも長いコードながら実行できない間は手作業でカバーできるものではありました
けれど実行できればそれはそれでたいへん楽です!
なんとか仕事が手薄な時間を作り出し教えて頂いたコードに挑戦できる日がくるのを夢みて…
0485469
2008/10/11(土) 10:09:56「全部閉じとけよ!はどのコードだったのでしょう?」への回答→そんなコードはない。
まさか、最大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セルに入っているので確認できる。
0486481
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
0487デフォルトの名無しさん
2008/10/11(土) 12:45:270488デフォルトの名無しさん
2008/10/11(土) 14:52:03だからOn Error外せって
0489デフォルトの名無しさん
2008/10/11(土) 16:23:17>>483-484は、まだおまいの作ったコードは実行してないと思う
ネカフェで印刷して会社へ持って行って、見ながら手打ちしてからだから、
来年ぐらいじゃないかな
0490479
2008/10/11(土) 17:48:11VBAからソートプロパティを取得する方法は無いのでしょうか?
0491デフォルトの名無しさん
2008/10/11(土) 18:52:51テキストボックスの値を関数に渡す前にVal()で数値に
変換したら。
0492デフォルトの名無しさん
2008/10/11(土) 19:03:24> キーワードを変えてググってみても見つけられなかった。
> VBAからソートプロパティを取得する方法は無いのでしょうか?
>
ソートの設定のこと?
これならマクロの記録でできるけど。
Range.Sort Key1:= ・・・・ Order1:= ・・・・
0493デフォルトの名無しさん
2008/10/11(土) 19:10:50これまでの書き込みから、ソートの「設定」ではなく「設定内容の参照」のようです。
なので、今まで回答がない。詳しい人の目にとまるまで回答はないかも。
0494デフォルトの名無しさん
2008/10/11(土) 20:58:41単純にセルの値取得すればいいだけじゃないの??
0495デフォルトの名無しさん
2008/10/11(土) 23:01:15Excel: 2007
チャートの目盛線のスタイルを「破線」にしたいと思っていますが、
以下のようなコードを実行しても、「長破線」になってしまいます。
ActiveChart.Axes(xlCategory).MajorGridlines.Border.LineStyle = xlDash
LineStyleの値として設定できる値(xlDash, xlDashDot, xlDashDotDotなど)を
すべて試しましたが、やはり破線にはなりませんでした。
今は、手動で「目盛線の書式設定」→「線のスタイル」→「実線/点線」から、破線に設定しています。
VBAからは、チャートの目盛り線のスタイルを破線にはできないのでしょうか?
0496デフォルトの名無しさん
2008/10/12(日) 00:38:29@列を選択
AダイアログBoxに文字を入れ検索
B検索にヒットしたセルの左のセルに*を入力
具体例
@’D列・F列を選択
A’ダイアログBOXに検索したい文字 イロハ を入力
B’ イロハニホ が入力されてるセルD1の左C1と
アイロノカニ が入力されてるセルF3の左E3に*を入力
この作業のうちAとB(例はA’B’)をマクロで効率化したいと思っています。
詳しい方、コードを教えて下さい m( )m
この板を知る前に総合相談所にカキコしてしまったことをご容赦願います。
0497デフォルトの名無しさん
2008/10/12(日) 05:46:190498デフォルトの名無しさん
2008/10/12(日) 07:07:43先に総合相談所にも謝って来いよ
0499479
2008/10/12(日) 13:44:23おっしゃる通り、ソートの設定状態を参照したいのです。
Excelの並べ替えメニューに現在のソート状態が表示されるので、何処かに
ソート状態を保持している筈なのです。
これを取得する方法が分かりません。
0500デフォルトの名無しさん
2008/10/12(日) 16:54:02で、(直前に行われたであろう手動による)ソートの各種設定を参照してナニしようとしてるんですか?
0501デフォルトの名無しさん
2008/10/12(日) 17:29:28シートAにデータがあり、
シートBがアクティブ時にはシートAの選択データからシートBを編集します
シートCがアクティブ時にはシートAの選択データからシートCを編集します
シートBやシートCを編集する時のシートAのソート条件が異なるので
編集できるかどうかを判断するためにソート状態を知りたいのです。
実際には、プログラム用ブックと上記のデータ用ブックに分かれていて
プログラム用ブック側でデータブックのイベントを拾って汎用的に処理
しています。
0502500
2008/10/12(日) 19:23:34シートAは手動でソートするんですか? シートAのソートをマクロで実行して、
その際のパラメータをデータブックに記録しておけばどうですか?
シートAのソートのパターンをいくつかつくっておいてマクロ実行時選ぶように
したらいいのでは?
0503デフォルトの名無しさん
2008/10/12(日) 22:26:40ソートされる事も想定が必要です。
プログラムブックからデータブックを開いて、データブックに定義されている
内容によりデータブックのアクティブシートを編集しています。
データブック側にはVBAコード等の記述は不要であり、プログラムブック側に
VBAコードを記述し、データブックのイベントを拾ってデータブックの編集を
行っています。
データブックは任意のxlsファイルが指定できます。
0504デフォルトの名無しさん
2008/10/12(日) 23:42:020505デフォルトの名無しさん
2008/10/13(月) 00:01:290506503
2008/10/13(月) 00:02:44(Excel2000)されている事に気付いたので、取得する方法がある筈と考えた次第
です。
Excel2007を一寸見たら、現在のソート状態は表示されないみたいですね。
諦めかな...
0507デフォルトの名無しさん
2008/10/13(月) 00:27:160508デフォルャgの名無しさん
2008/10/13(月) 00:35:540509デフォルトの名無しさん
2008/10/13(月) 00:46:520510デフォルトの名無しさん
2008/10/13(月) 01:40:17ちなみにDoxygen+VBFilterは関数の中は全く解析してくんなかった。
0511デフォルトの名無しさん
2008/10/13(月) 14:36:23方法を知っている方おられませんか?
報告書(Aさん)→済_報告書(Aさん)
報告書(Bさん)→済_報告書(Bさん)
報告書(Cさん)→済_報告書(Cさん)
上記のように
()内の名前が変わってもファイル名を
報告書()→済_報告書()
と変更できる方法を探しています。
何か良い方法を知っている方がいれば教えて頂けないでしょうか?
お願いします。
0512デフォルトの名無しさん
2008/10/13(月) 15:12:43まず fileName LIKE "報告書(*)" で想定した書式であることを確認した後、
fileName = "済_報告書(" & Mid(fileName,5,Len(fileName)-(4+1)) & ")"
って感じ?
0513デフォルトの名無しさん
2008/10/13(月) 16:40:36スレ違い
ファイル名変更ぐらいならRENコマンドでできる。
0514512
2008/10/13(月) 17:50:21というか、何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
違うの? >>511
0515デフォルトの名無しさん
2008/10/13(月) 18:51:550516デフォルトの名無しさん
2008/10/13(月) 18:58:06Name ステートメント
0517デフォルトの名無しさん
2008/10/13(月) 19:15:55返信遅くなってすみません
レス有難うございます。
>>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。
最初は>>516さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が
ネックになって上手くいきませんでした。
>>513、>>515さん
スレ違いでしたか、すみませんでした。
0518デフォルトの名無しさん
2008/10/13(月) 20:08:55xlsファイルフォーマットが公開されているので(英語)、
解析してソート部分の設定を読み出すコード書いたら。
0519デフォルトの名無しさん
2008/10/13(月) 21:24:530520デフォルトの名無しさん
2008/10/13(月) 21:42:570521デフォルトの名無しさん
2008/10/13(月) 22:54:480522デフォルトの名無しさん
2008/10/14(火) 10:15:24ヘルプには「シートごとに保存される」
とは書いてあるがどうやって取り出すか書いてないな・・・
ところでそもそも「ソートの設定」で見ようとするのは危なくないか?
コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う
ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う
0523500,502
2008/10/14(火) 13:13:28522に1票
>シートBやシートCを編集する時のシートAのソート条件が異なるので
>編集できるかどうかを判断するためにソート状態を知りたいのです。
とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか?
ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?
0524506
2008/10/14(火) 13:22:48出直します。orz
0525デフォルトの名無しさん
2008/10/14(火) 16:26:52Aが一定の条件でソートされてないとBやCの編集ができないのに、
ソートは人まかせってのが不思議
永遠にソートしてくれなかったらどうするんだろう
ソートされてるかどうかを何かのフラグとして扱うつもりなら、
それこそそんなの信用できないんじゃないの
気まぐれでソートして見てみただけかも知れないし
0526デフォルトの名無しさん
2008/10/14(火) 16:57:54文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの
があるようです。具体的な例をあげると、
"ad-02-mb.html"
"ad-02.html"
の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと
なります。マッチング処理ができなくて困っています。解決方法を
お教えください。
0527506
2008/10/14(火) 17:42:10説明不足でした
BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が
多めに要するという事です。
強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に
戻す必要があります。
別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ
ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。
0528デフォルトの名無しさん
2008/10/14(火) 18:03:14バージョン差あるかもだけど、option compare は?
>>527
ソートされなくても永遠に作業が滞るわけではないのね。ならよかった
いつの日か希望どおりにソートしてもらえるといいね
0529デフォルトの名無しさん
2008/10/14(火) 19:03:09その「ソート」って何の事よ
0530デフォルトの名無しさん
2008/10/14(火) 19:35:11だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。
そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?
0531デフォルトの名無しさん
2008/10/14(火) 19:36:190532デフォルトの名無しさん
2008/10/14(火) 21:16:220533デフォルトの名無しさん
2008/10/14(火) 21:58:59自分のPC(WinXp Excel2003)で試したら再現したので並べ替えのヘルプを見たら原因判明です。
ヘルプから引用
一重引用符 (') とハイフン (-) は無視されます。ただし、ハイフン以外は同じ文字列がある場合、
ハイフンを含む文字列が後に配置されます。
引用終わり
つまり、並べ替えの時は-が無視されるので、ad-02mb.html と ad-02.html が比較される。
先頭から6文字目は"m"と"."なので、"."のあるad-02.htmlが先になる。大小比較のときは"-"も
比較に利用されるので、bd-02-mb.htmlが先になる。
文字コード(10進表記)では、"-":45 ".":46 "m":109 です。
0534526
2008/10/15(水) 22:38:35おーっ、感動の回答!ありがとうございます。
自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。
で、どーすりゃいいのか考えないと。。。
とにかく、ありがとうございました。
0535533
2008/10/15(水) 22:54:32レスがあるとうれしいですね。
引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。
解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか?
処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら
一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。
0536デフォルトの名無しさん
2008/10/15(水) 23:00:230537デフォルトの名無しさん
2008/10/15(水) 23:03:150538デフォルトの名無しさん
2008/10/15(水) 23:04:220539デフォルトの名無しさん
2008/10/15(水) 23:08:50バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか?
エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は
あるけど、バイナリのことは書いてありません。(Excel2003)
0540デフォルトの名無しさん
2008/10/15(水) 23:27:300541デフォルトの名無しさん
2008/10/15(水) 23:35:570542デフォルトの名無しさん
2008/10/15(水) 23:48:53Option Compare ステートメント
0543542
2008/10/15(水) 23:52:530544539
2008/10/15(水) 23:57:27エクセルVBAのヘルプを見てみました。
引用はじめ
Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法
である Binary モードが使われます。
引用終わり
ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、
ハイフン"-"を無視しないようにするのは無理なのでは?
0545539
2008/10/16(木) 00:03:27リロードしてませんでした。一晩寝ると忘れますので、ご安心を。
0546デフォルトの名無しさん
2008/10/16(木) 01:57:460547デフォルトの名無しさん
2008/10/16(木) 03:44:562006/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
保証切れの場合、色をつけたいのですが、
★をどのようにすればいいでしょうか?
0548デフォルトの名無しさん
2008/10/16(木) 05:05:36詳しくはヘルプ読んで
あとそのコードだと保証期間内の時に青になるよ
datediffのヘルプ読んで
0549526
2008/10/16(木) 22:42:05Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。
Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、
ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、
アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース
してマッチングする処理にしました。
ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、
=のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの
並び順が異なるために、おかしくなっていました。
みなさんのおかげで、なんとか完成しました。ありがとうございました。
0550デフォルトの名無しさん
2008/10/16(木) 22:51:100551526
2008/10/16(木) 22:52:41Do While マスターキー >= トランザクションキーでした。
0552デフォルトの名無しさん
2008/10/16(木) 23:07:510553デフォルトの名無しさん
2008/10/16(木) 23:09:300554デフォルトの名無しさん
2008/10/17(金) 01:13:46てか、正規表現でも使うの?マッチングって事は。
0555デフォルトの名無しさん
2008/10/17(金) 02:37:01COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。
0556デフォルトの名無しさん
2008/10/17(金) 10:56:37For〜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
0557デフォルトの名無しさん
2008/10/17(金) 11:39:21あくまで自分ならだが
For I = 1 To 1000
'「基本作業」
a = I Mod 10
Select Case a
Case 1
'「選択作業1」
Case 2, 3
'「選択作業2」
End Select
Next I
といった感じにする
0558デフォルトの名無しさん
2008/10/17(金) 11:44:28ありがとう
家に帰ったらいろいろ試してみます
0559デフォルトの名無しさん
2008/10/17(金) 17:54:59とするマクロをVBAで組んだのですが,一回実行した後,
セルの値を1から2を変更しても,実行ボタンをあらためて
押さないと色が青に変わりません。
2を入力すれば直ちにセルの色づけが青に変わるようにする
ためにはどのようなコードを入れればよいのでしょうか。
よろしくお願いします。
0560デフォルトの名無しさん
2008/10/17(金) 18:27:43ボタン押したら色が変わるようにしたんだろ?
だったら当然だな
入力してすぐに変えたければ
1.ボタンはやめてワークシートのChangeイベントで動かす
2.VBAをやめて条件付書式にする
どちらかだな
ところでテンプレ>>1の★5読んだか?
0561デフォルトの名無しさん
2008/10/17(金) 19:06:41ありがとうございます。
まったくの初心者です。場所を間違えたようです。
失礼しました。
0562547
2008/10/17(金) 20:36:21なんですが、
dateaddをして、比較したいのですが、
If Dateadd("y", target.offset(0,1).value, target.value) < Date Then
と、やってみてもダメでした、
Private Sub Worksheet_Change
If Target.Column = 1 Then
に、おいて、特定セルと特定セルの右隣を関数に入れて比較する方法は、
上記であっているのでしょうか?
0563デフォルトの名無しさん
2008/10/17(金) 21:38:26ダメだった時はどうダメだったのかを書こうぜ
> 特定セルと特定セルの右隣を関数に入れて比較
そこは合ってる
で、右隣のセルに入ってるのは日数じゃなく年数でしょ?
後はもっぺんヘルプ読んで
0564デフォルトの名無しさん
2008/10/18(土) 01:46:12条件付書式だかそんな感じの奴でマクロなしでできる
0565547
2008/10/18(土) 04:21:40もう一度考えてみました。
やりたいことと、セルの値
購入日 保証年数
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でした。
全然わかりません、足して日付が今日より前なら「保証切れ=青色」にしたいのですが・・。
日付と日付を比較できていないのでしょうか?単位が違う状態で比較しているのでしょうか?
0566デフォルトの名無しさん
2008/10/18(土) 05:47:32おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ
今日の日付に足したら、何足したって未来になるだろw
>>562のでほぼ合ってるんだよ
オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、
おまいのにはないのか?
0567565
2008/10/18(土) 06:29:37yyyyでしたか・・・、さっそく書き換えるといけました!感動しました。
たしかに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)
ここをどのように書き換えれば、読み込み時に再判定してくれるのでしょうか?
0568565
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
0569デフォルトの名無しさん
2008/10/18(土) 08:23:40> yyyy yyyy
ちょwマジでw
おちおち「ヘルプ読め」とも言えんじゃないか
まあそっちは解決したようで良かった
イベント変更の方だが、worksheet_activateは引数を取らないから、
そうなるのは当然だな
引数を消して、targetを自前で指定してやればOK
つか、workbook_openイベントもあるんだが
つか、今さらだけど、
色変えたいだけなら条件付き書式でもできるがw
0570デフォルトの名無しさん
2008/10/19(日) 02:32:280571568
2008/10/19(日) 02:58:41>色変えたいだけなら条件付き書式でもできるがw
こ、こんなのあったんですか・・。
春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。
わざわざVBAを使う必要無かったんだ・・・。
___________
||
|| ⊂⊃
|| ∧ ∧
|| ( ⌒ ヽ でも勉強にナターヨ・・・
∧||∧ ∪ ノ
( ⌒ ヽ 彡 V
∪ ノ フワーリ
∪∪
0572デフォルトの名無しさん
2008/10/19(日) 03:29:41>>559もそうだし、こういう奴、実は多いのか?
何という時間の無駄
0573デフォルトの名無しさん
2008/10/19(日) 07:09:25ァ ∧_∧ ァ,、
,、'` 。゚( ゚^∀^゚)゚。,、'`
'` ( ⊃ ⊂) '`
0574デフォルトの名無しさん
2008/10/19(日) 07:12:510575デフォルトの名無しさん
2008/10/19(日) 12:16:550576デフォルトの名無しさん
2008/10/19(日) 17:15:030577デフォルトの名無しさん
2008/10/19(日) 20:25:44Excel総合相談所74で質問が出てますよ。(レス番号325です)
0578デフォルトの名無しさん
2008/10/19(日) 20:49:32この手ので延々悩むんよね
心理的ハードルを超えさせる書式の魔力おそるべし
0579デフォルトの名無しさん
2008/10/19(日) 21:31:474色問題お願いします。
0580デフォルトの名無しさん
2008/10/19(日) 22:29:21ありがと
解決済みだった
>>579
全ての図形が4色で塗り分けられるとかなんとかだよね
図形の形とか定義あるのかな?
セルに色塗るなら二色で出来ちゃうし
0581デフォルトの名無しさん
2008/10/19(日) 22:33:43格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?
0582デフォルトの名無しさん
2008/10/19(日) 22:43:16あります
入力規則のリストなら、マクロの記録録ればわかります
コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます
但しフォームツールのコンボボックスなら多分セル書き出し必須
0584デフォルトの名無しさん
2008/10/19(日) 22:51:024色問題ってこんな感じのです。
ttp://yougo.ascii.jp/caltar/4%E8%89%B2%E5%95%8F%E9%A1%8C
0585デフォルトの名無しさん
2008/10/19(日) 22:59:02ありがとう
1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす
2.領域ごとに、隣り合わせ同色にならないように色IDを付ける
3.色IDが1から4で収まっているか判定
っていうアプローチでよいかなあ
アルゴリズムの問題っぽいがw
0586デフォルトの名無しさん
2008/10/19(日) 23:36:57出力するのに時間がかかります。たとえば
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
で出力の所要時間を計算時間と同程度にすることができるような
出力の書き方があれば教えてください。
0587デフォルトの名無しさん
2008/10/19(日) 23:51:32For J = 1 To 10
Cells(I, J) = Sqr(I) * Sqr(J)
Next J
Next I
0588デフォルトの名無しさん
2008/10/19(日) 23:51:40forの前に
Application.ScreenUpdating = False
を入れると、シートの描画しないから早くなる
少しずつ描画見たいなら、例えばNextの間に
Application.ScreenUpdating = Tlue
Application.ScreenUpdating = False
を追加すると、Iが一つ進むごとに描画される
例えばIが100ごとに実行したいなら
J Mod 100 使ったりできる
0589デフォルトの名無しさん
2008/10/19(日) 23:54:010590デフォルトの名無しさん
2008/10/20(月) 00:20:5521秒から13秒に8秒も短縮できました。ありがとうございます。
>589
具体的に「そのまま書き出す」ってどうすればいいんですか?
よろしくお願いします。
0591デフォルトの名無しさん
2008/10/20(月) 00:29:07>>589じゃないけど、
range(cells(1,1),(cells(10000,10)) = X
0592591
2008/10/20(月) 00:30:17range(cells(1,1),cells(10000,10)) = X
0593デフォルトの名無しさん
2008/10/20(月) 00:36:38変数に+1しる。
0594デフォルトの名無しさん
2008/10/20(月) 00:41:35やってみました。1秒かからないんですね!ありがとうございました。
0595デフォルトの名無しさん
2008/10/20(月) 00:42:22変数に+1するのもお勧めできない
X(1 To 10000,1 To 10)にしる
0596デフォルトの名無しさん
2008/10/20(月) 00:49:07Range(Cells(1, 1), Cells(1000, 10)) = X(1 To 10000,1 To 10)
とするとコンパイルエラーがでるんですが・・・。
0597デフォルトの名無しさん
2008/10/20(月) 00:52:29違う違うw
1 to 10000 とかを書くのは dim のとこ
0598デフォルトの名無しさん
2008/10/20(月) 00:56:26Dim X(1 To 10000, 1 To 10) As Double
でしたね。失礼しました。
みなさんどうもありがとうございました。
0599デフォルトの名無しさん
2008/10/20(月) 02:02:50VBAはクアッドコアに対応しているの?
コア4つのVBAはやはり処理が早いんだろうか・・。
0600デフォルトの名無しさん
2008/10/20(月) 04:35:01余談だけどフォームの方もできる
0601デフォルトの名無しさん
2008/10/20(月) 06:43:22文字列の入ったセルをselectした際に、単にselectにするだけではなく、
編集中の状態にまでもっていきたいのですが、
そのような方法を御存じないでしょうか。
select後、sendkeys"{F2}"で実現できるのですが、
Sendkeysを使用しない方法を探しています。どうか宜しくお願いします。
0602デフォルトの名無しさん
2008/10/20(月) 08:24:460603デフォルトの名無しさん
2008/10/20(月) 13:42:570604デフォルトの名無しさん
2008/10/20(月) 13:52:14Sheet2以降のセルA1に、「=Sheet1!A1」と入力。
0605デフォルトの名無しさん
2008/10/20(月) 13:54:490606デフォルトの名無しさん
2008/10/20(月) 14:05:48d
0607デフォルトの名無しさん
2008/10/20(月) 16:56:040608デフォルトの名無しさん
2008/10/20(月) 18:13:530609デフォルトの名無しさん
2008/10/20(月) 20:11:15まず、複数スレッドを作ることが実質的に無理だ。
Excel自体も、2007から再計算を複数スレッドで行えるようになったくらい。
0610デフォルトの名無しさん
2008/10/20(月) 20:17:310611デフォルトの名無しさん
2008/10/21(火) 15:00:07行った後、再度元の並びに戻す方法を模索中です。
1)選択行範囲の最後(列n)に式["=ROW()"]を設定
2)列nの式を値に変更(コピぺ)
*ソートと処理を行う
4)列nで昇順にソートした後、列nを削除
この方法だと選択範囲内に不可視のデータが存在すると、[2)]でコピーと貼付け
の領域が違うため貼付けエラーになります。
1行ずつ行番号をセットする方法は件数が多いと時間が掛かる為オートフィルター
情報を取得しておき、一旦オートフィルターオフにしてからコピペしています。
他にもっと良い方法をご存知でしたら御教授願います。
選択データを他ワークシートにコピーして処理する方法が一番良い気もしますが
データ量が三万件とかだとコピーにも多少時間が掛かるので...
0612デフォルトの名無しさん
2008/10/21(火) 17:29:28仮に、"=row()" を入れた範囲を range("G5:G10") として、
G列を非表示にして、
range("G5:G10").value = range("G5:G10").value
ってのはダメ?
0614デフォルトの名無しさん
2008/10/21(火) 18:33:320615デフォルトの名無しさん
2008/10/21(火) 19:41:59わからん。なんかやってみたらできた
仕様なのかバグなのかも知らんw
0616デフォルトの名無しさん
2008/10/21(火) 21:01:59どうやら仕様くさい
0617VBAの初心者
2008/10/21(火) 21:24:20無くよく分らなくてもし良かったら教えて下さい。
だだ走らせるだけの凄い簡単なプログラムらしいんですが私には走らせ方が分らな
くて困ってます。
10 for m=1 to12
20 print m
30 next m
40 stop
なんですが凄い初心者なのでエクセル開いた所から分らなくて教えて下さい。
0618デフォルトの名無しさん
2008/10/21(火) 21:27:300619VBAの初心者
2008/10/21(火) 21:30:01なってしまったので、まず見れる簡単なの教えてと頼んだんですが、今のじゃ無理
なんでしょうか;
0620デフォルトの名無しさん
2008/10/21(火) 21:50:26VBAも含めてナントカBasicってのは山ほどあるけど、どれも全く別物。
敢えて共通点をあげるとしたら名前にBasicが付いていることだけ、というのはさすがに言い過ぎだけど。
そして、お前は何をやりたいのか。Excel VBAで間違いないんだよな?
0621デフォルトの名無しさん
2008/10/21(火) 22:39:240622デフォルトの名無しさん
2008/10/21(火) 23:24:210623デフォルトの名無しさん
2008/10/22(水) 07:27:310624デフォルトの名無しさん
2008/10/22(水) 10:00:180625デフォルトの名無しさん
2008/10/23(木) 00:27:130626デフォルトの名無しさん
2008/10/23(木) 19:16:21個数や上限決めておらず、必要に応じて作る場合とか
1万や2万は当たり前に使ってることあるが
ちゃんと配慮してれば全然問題ない
0627デフォルトの名無しさん
2008/10/24(金) 11:20:18例えば、選択したアドレスが[$A$2:$A$5,$A$5:$A$10]の場合、そのアドレス
範囲で集計(Subtotal)するとA5が重複して集計されてしまいます。
Excelのステータスバー(右側)には重複を除いた合計値が表示されます。
これと同様の値(特定bフ1列のみ)をVBAで取得したいのです。
0628デフォルトの名無しさん
2008/10/24(金) 12:06:03unionしちゃばOK
0629デフォルトの名無しさん
2008/10/24(金) 12:09:11Sub 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は無理じゃない?
0630629
2008/10/24(金) 12:20:320631デフォルトの名無しさん
2008/10/24(金) 12:22:27? 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かなと
0632629
2008/10/24(金) 12:29:120633デフォルトの名無しさん
2008/10/24(金) 14:52:48Set 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))
0634633
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
0635デフォルトの名無しさん
2008/10/24(金) 16:33:53エクセルで資料を作ったがMacroで両面コピーの方法が分からないので両面コピーの方法を教えて下さい。
0636デフォルトの名無しさん
2008/10/24(金) 19:46:01訳あって欧文(ウムラウトを含むラテン文字の文章)の書き込まれたExcelシートから
内容を読み出してテキストファイルに起こしたいのですが、
Cells(?,?).valueやCells(?,?).TextからStringsの変数に読み出した時点でウムラウトが飛んで
近しい形状の通常のアルファベットに置き換えられてしまうようです。
結構ぐぐって見たのですが、読み出せなくて困った的な話はいくつか見つけたのですが
対処法について言及しているページが無かったので、皆さんのお知恵をお借りできないかと
思って書き込みさせていただきました。
なにかお知恵などありましたらよろしくお願いいたします<(__)>
0637デフォルトの名無しさん
2008/10/24(金) 20:14:02何を何処へコピーするのか
0638デフォルトの名無しさん
2008/10/24(金) 20:26:200639デフォルトの名無しさん
2008/10/24(金) 20:33:08元となるExcelファイルは、Excelのどのバージョンで作られたものですか?
あるいは、どこの国用のExcelで作られたものでしょうか?
VBAを利用せず、直接シートの必要な範囲をコピーしてエディタへ(ウムラウトは消えずに)
ペーストすることはできたのでしょうか?
↓このサイトは見ましたか?
http://www.microsoft.com/japan/office/ork/three/intd02.mspx
Office XP リソース キット / 国際環境での導入計画 / 国際環境でのメンテナンス
Unicode サポートの活用
「多国語テキストのコピー」の項と、「VBA で Unicode 値を使用する」の項が参考になるかも。
0640デフォルトの名無しさん
2008/10/24(金) 21:48:44500回とかそれ以上になるとなぜか無限ループにでも入ったみたいに計算が終わってくれません。
オーバーフローのエラーメッセージが出ることもないし、実際オーバーフローするほど大きな数を扱っているわけでもない。
原因としてはどんなことが考えられるでしょうか?
0641デフォルトの名無しさん
2008/10/24(金) 21:53:05その情報だけだと、メモリかCPU?としか言えない。
0642デフォルトの名無しさん
2008/10/24(金) 21:55:54sub 裏表印刷()
印刷実行
Msgbox ゛用紙裏面をセットしてください゛
印刷実行
end sub
0643デフォルトの名無しさん
2008/10/24(金) 21:56:08メモリっぽいですね。ちょっと調べてみます。
ありがとうございました。
0644デフォルトの名無しさん
2008/10/24(金) 22:09:55DoEvents
http://homepage2.nifty.com/kasayan/vba/doevents.htm
0645デフォルトの名無しさん
2008/10/25(土) 00:45:40>>639
動作環境を書くのをすっかり失念してました
この手の質問には必須なのに…申し訳ありません
OSはXP日本語版でExcelは日本語版Office2000に含まれるものです。
現在VBA開発に使用しているxlsファイルは
Exciteの機械翻訳で出したものをコピペしてBOOKに張り付けてテストデータとして作成したものです
紹介していただいたリンク先を読むと、VBAではunicodeを標準ではサポートしていないようですね
(VBでは文字列関係の内部処理はUnicodeで処理されてるのに…変な気分…)
まあ、テストデータで使用している文章がUnicodeではなく単純に欧文ASCIIコードの文字列の可能性もあるので
Unicodeをサポートしていればうまく行くとは限らない気もしますが
でもちょっと手がかりをもらえたのでもう少し試行錯誤してみようかと思います。
0646デフォルトの名無しさん
2008/10/25(土) 07:04:270647デフォルトの名無しさん
2008/10/25(土) 11:29:010648デフォルトの名無しさん
2008/10/25(土) 14:59:26unionでいいんなら
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
0649デフォルトの名無しさん
2008/10/25(土) 15:46:42マクロでたとえばですが
ActiveCell.Replace What:="*", Replacement:="x"
のように セル文字列の * の部分だけをxに変換したいのですが
アスタリスクはすべて変換してしまいますよね。
A1*A1 という文字列を上記マクロ実行するとA1xA1 という結果になって
ほしいのですが。実際は x 担ってしまいます
どのようにすればよいのでしょうか。
0650デフォルトの名無しさん
2008/10/25(土) 16:07:52ActiveCell.Replace What:="~*", Replacement:="x"
0651デフォルトの名無しさん
2008/10/25(土) 16:09:39すごいですね。どうもです
0652デフォルトの名無しさん
2008/10/25(土) 17:06:030653デフォルトの名無しさん
2008/10/25(土) 18:11:57参考になるかも
ttp://codezine.jp/article/detail/1718
0654デフォルトの名無しさん
2008/10/25(土) 19:10:310655デフォルトの名無しさん
2008/10/26(日) 03:08:58VBAで、明日が三週目の日曜日だった場合A1に○○と表示するってやりたいんでがどうやればいいですか?
0656デフォルトの名無しさん
2008/10/26(日) 03:24:14明日の日付はDate関数に+1すれば解る
特定の日付が日曜日か否かはWeekday関数で解る
3週目か否かは日を算術演算すれば解る
あとはそれらを条件に条件分岐してA1に値を代入すれば良い
この説明で解らなければ>>1★5なので、さようなら
0657デフォルトの名無しさん
2008/10/26(日) 03:44:51ありがとうございます。
算出演算ってのがよく解らないですががんばってみます。
0658デフォルトの名無しさん
2008/10/26(日) 06:05:510659デフォルトの名無しさん
2008/10/26(日) 13:35:270660デフォルトの名無しさん
2008/10/26(日) 13:40:58Excel2003を使っています。
コマンドボックスをクリックするたびに、セルA1の数に1ずつ足していくマクロを作りたいのですが
どなたか教えていただけませんでしょうか。
よろしくお願いします。
0661デフォルトの名無しさん
2008/10/26(日) 14:10:390662デフォルトの名無しさん
2008/10/26(日) 15:32:19コマンドボックスって何ぞや?
0663660
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
もうちょっと頑張ってみます
0664649
2008/10/26(日) 15:48:36'=A1 という文字列を =A1 という数式に変換するマクロありますか。
同かよろしくお願いします。
0665649
2008/10/26(日) 15:50:36あるセルに '=A1 という文字が書かれています。
マクロコマンド使って =A1 という数式に置換したいのですが。
どうかよろしくお願いします。
0666デフォルトの名無しさん
2008/10/26(日) 16:32:40cells(1,1).value = cells(1,1).value + 1
>>665
Cells(1, 1).Formula = Cells(1, 1).Value
0667デフォルトの名無しさん
2008/10/26(日) 16:33:34Range("A1").Value = Range("A1").Value + 1
0668デフォルトの名無しさん
2008/10/26(日) 16:43:510670デフォルトの名無しさん
2008/10/26(日) 17:06:11単純な代入式も書けないレベルの奴は入門書買え
いちいち他人の手を煩わすな
0671デフォルトの名無しさん
2008/10/26(日) 22:22:34初心者ではないですが、レベルは低いですσ^^;
セルを指定するときに、Range("A1")ではなく[A1]というふうにやってるんですが、
これだとなにか悪影響がありますか?
今のところ困るのは、説明書やhelpの類がすべてRange形式のものばかりなので、
書き方が分からない時がある、ってことくらいです。
単に字数が少なくて済むからという理由で[**]形式にしているんですが、
ちょっと気になってます。
というか、そもそも気にしたほうがいいのか気にしなくてもいいのか・・・
0672デフォルトの名無しさん
2008/10/26(日) 22:45:34少なくとも俺はわからん
0673デフォルトの名無しさん
2008/10/26(日) 23:19:11あとは使う場面やメンテナンス性などを考えて使えば良い
複数人で扱う物には使わない方がいいし、汎用モジュールも然り
個人専用の使い捨てマクロの類なら[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も同じく入力省略出来るようにしてある
0674デフォルトの名無しさん
2008/10/26(日) 23:27:30本気で業務に使うプログラムやら、もっと高いゴールを目指すなら、
初心者のうちからcellsで指定する方が良いと思うよ。
rangeと言えば、あくまでrangeオブジェクトである訳で・・・。
何より変数絡めてセルの指定するようになると可読性が著しく下がる・・・。
タッチ数も増えるしで、良い事ない。
0675デフォルトの名無しさん
2008/10/26(日) 23:28:390676デフォルトの名無しさん
2008/10/26(日) 23:36:520677デフォルトの名無しさん
2008/10/27(月) 00:10:330678デフォルトの名無しさん
2008/10/27(月) 02:51:46結局は evaluate の省略記法だから、excel に渡して評価させる分、
多少処理の無駄があるんじゃないかと思う(たぶん)
[A1].value = 0
range("A1").value = 0
それぞれ10万回ループさせると数秒だが差が出る
evaluate("A1").value = 0
は、[A1]記法とほぼ同じになる
誤差レベルだけど、回数の多いループ内とか、速度が気になる場合は
避けた方がいいかもね
0679デフォルトの名無しさん
2008/10/27(月) 09:49:00Cells(1,1)も出てこねー。
Range("A1")だと出てくる。
どれもいったんRange型変数に入れりゃ同じだが。
0680デフォルトの名無しさん
2008/10/27(月) 10:57:11Syntax Error.しか知らないキチガイがあらわれました
0681デフォルトの名無しさん
2008/10/27(月) 11:57:01大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間続けているようです。
このようなケースではリニューアルを担当した業者はヨドバシカメラにどれほどの損害賠償を行うのでしょうか?
【ヨドバシカメラ】 ネットサイトをリニューアルしたら表示遅すぎでおわび [10/23]
http://gimpo.2ch.net/test/read.cgi/owabiplus/1224789237/
ヤマダ.com/ビックカメラ.com/ヨドバシ.comを語ろう
http://gimpo.2ch.net/test/read.cgi/kaden/1222787235/
【店員の質】ヨドバシカメラ総合17【落ちまくり】
http://gimpo.2ch.net/test/read.cgi/kaden/1215013408/
補足
どうやら今回のヨドバシドットコムリニューアルはCMS導入が目的で、
キノトロープスリーイントという会社( http://www.k-3int.co.jp/ )が請けたようです。
また、リニューアルの10/21から10/25現在までこの状況ですので、ヨドバシカメラの損失額は
億単位で発生していると言われています。
キノトロープってどうよ?PART4
http://namidame.2ch.net/test/read.cgi/venture/1224762171/
0682633
2008/10/27(月) 14:06:59おぉー、素晴らしい限りです!
アクティブシート以外に対してIntersectは無理なのでしょうか?
0683682
2008/10/27(月) 14:21:18columns(c)を修飾したら出来ました。
0684デフォルトの名無しさん
2008/10/27(月) 16:04:05書いた後で気づいたんだが、それ 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))
だけでいいようだ
0685682
2008/10/27(月) 16:34:34究極のリファクタリング有難うございます。orz
こういうの教えられると、VBコードでゴリゴリ作るのが馬鹿らしくなってしまう...
0686671
2008/10/27(月) 22:41:20RangeやCells形式も使いこなせるように、もっと勉強していきます^^
0687デフォルトの名無しさん
2008/10/28(火) 10:08:01選択エリアの全行数は
For each r in Selection.Areas
rcnt = rcnt + r.Rows.Count
Next
で求めていますが、一気に知る方法がありますでしょうか?
0688デフォルトの名無しさん
2008/10/28(火) 18:29:27一気に知る方法は知らないがそのままだと重複している行もカウントされる
少し前で話題に出たIntersectを組み込んで
For Each r In Intersect(Selection.EntireRow, Selection.EntireRow).Areas
とかにしたほうがいいんじゃないか?
0689デフォルトの名無しさん
2008/10/28(火) 21:48:430690デフォルトの名無しさん
2008/10/28(火) 22:14:070691デフォルトの名無しさん
2008/10/28(火) 23:47:58もちろん面倒なことをやるなら1文あたりが相応に長くなるんだけど。
0692デフォルトの名無しさん
2008/10/29(水) 01:54:25それは「人に訊いた方がラクだ」という事だ
なんちてw
>>687
一般的なやり方じゃないかも知らんが一応これで行けそう
重複行込み
rcnt = selection.entirerow.cells.count / activesheet.columns.count
重複行抜き
rcnt = intersect(selection.entirerow,columns(1)).count
0693デフォルトの名無しさん
2008/10/29(水) 02:45:55具体例:
(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()で置き換えてお願いします.
0694デフォルトの名無しさん
2008/10/29(水) 03:31:17.formula に入れるのはセルにそのまま打ち込める式
範囲指定のところが "B2:B11" とかの形式になるように、
文字列を生成すればOK
0695デフォルトの名無しさん
2008/10/29(水) 09:46:54どうもありがと。
できれば、具体的な変換方法もお願いします。
0696デフォルトの名無しさん
2008/10/29(水) 10:03:37宿題か何か?
デカい誤り指摘してヒントも出したんだから、
そこからもっぺん自分で考えてみような
じゃなきゃこんな練習問題やってる意味ないだろ
0697687
2008/10/29(水) 10:09:55>>692
有難うございます。
「聞くは一時の恥じ...」
なんちてw
セル情報はExcelの基本関数知ってればコード記述で殆ど解決しちゃう
けど速度やメンテを考えるとコードは単純な程良い。
0698デフォルトの名無しさん
2008/10/29(水) 10:36:40これ以上は分からん。
0699デフォルトの名無しさん
2008/10/29(水) 10:37:47あ、速度考えるなら intersect とか濫用しない方がいいよ
10万回ループさせると>>692より>>687の方が早いんで
0700デフォルトの名無しさん
2008/10/29(水) 12:16:46>けど速度やメンテを考えるとコードは単純な程良い。
これは少し間違ってる気がする
速度を考えるなら処理するデータを単純にした上でコードも単純なものにする
例えばセルのプロパティを変数に入れるとか
さらにメモリの使い方にも気を配れればいい
書くと短くても動かすと重たい処理なんてたくさんあるし
0701デフォルトの名無しさん
2008/10/29(水) 16:48:37実際の処理が単純なのは違うよね
あと>>699の自己フォローなんだけど、
selectionの状態に依存するわな、、、w
areasが2-3ぐらいなら>>687の方が早いってことで
0702デフォルトの名無しさん
2008/10/29(水) 21:27:30検索した2つ右のセルの文字の最後に1をつけたい場合どうすればいいでしょうか?
0703デフォルトの名無しさん
2008/10/29(水) 21:39:33set piyo = cells.find(hoge).offset(0,2)
piyo.value = piyo.value & "1"
0704デフォルトの名無しさん
2008/10/29(水) 21:57:52【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は
行の削除がされると言う具合です。
業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
0705デフォルトの名無しさん
2008/10/29(水) 22:01:22自分で作ってみたけど、分からない所が出てきた。とかなら全然かまわないんだけど。
作成依頼所じゃないんで。
0706デフォルトの名無しさん
2008/10/29(水) 22:03:28もう一度書き込ませてください。
【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は
行の削除がされると言う具合です。
業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
0707デフォルトの名無しさん
2008/10/29(水) 22:05:26>705
0708デフォルトの名無しさん
2008/10/29(水) 22:22:44ありがとうございます!!
A列全部で検索かけたい場合どうすればいいでしょうか?
0709704 706
2008/10/29(水) 22:27:40EXCEL総合相談所で聞いてきます。
マルチになってしまいますが、ご了承ください。
レベルが上がったらこのスレに来たいと思います。
0710デフォルトの名無しさん
2008/10/30(木) 12:42:392003だとFindのヘルプにちょうどいい例が載ってるんだが2007では載ってないのか?
0711デフォルトの名無しさん
2008/10/30(木) 12:45:030712デフォルトの名無しさん
2008/10/30(木) 21:03:32cells はセル全部
columns(1) は1列目
ヒントはここまで。
0713デフォルトの名無しさん
2008/10/31(金) 03:25:08ズリネタとして結構面白かった
0714デフォルトの名無しさん
2008/11/02(日) 18:00:44rg=activecell
処理
この処理後に、元のアクティブセルに戻る文が書けません。
どんなだったか、教えて。
0715デフォルトの名無しさん
2008/11/02(日) 18:07:50処理の中で範囲を指定してコピー、貼付をしている。
application.screenupdating=false を直前に入れても
画面が動くのですが、画面が動かないようにできませんか?
0716y
2008/11/02(日) 18:36:29rg.Parent.Activate
rg.Avtivate
ついでに言うと、>714の2行目は構文ミスでエラーになるので修正が必要です。
>>715
CopyメソッドのDestinationプロパティに貼り付け先範囲を指定して、
一度にコピー・貼り付けを行うと、動く枠線が出ないようになります。
0717デフォルトの名無しさん
2008/11/02(日) 19:37:54久しぶりなので、マクロの記録で、終わってましたorz
おかげで、思い出すことが出来ました。
サンクス。
0718デフォルトの名無しさん
2008/11/02(日) 20:51:29その2行目も・・・
0719デフォルトの名無しさん
2008/11/02(日) 20:57:01を開き、データブックのイベントに対する処理をしています。
Excel2007はウインドウのタイトル右端の×ボタンが「閉じる」に対応している様
です。
Excel2007でも以前のバージョンと同様に「Excelの終了」にする方法を模索中です。
方法をご教授頂けると有難いです。
0720y
2008/11/02(日) 22:45:44うは ご指摘ありがとうございます。
>>719
×ボタンでBeforeCloseイベントが発生するので、
同イベントプロシージャ内に
Application.Quit
を記述します。
0721デフォルトの名無しさん
2008/11/02(日) 23:00:30最近、微妙な空気が読めなくなってきたよ・・・。
0722719
2008/11/02(日) 23:24:17自分もそれでExcelが終了すると思っていたのですが、ブックが閉じるだけです。
SnendKeys(Alt+F4)を試したら終了できました。orz
0723719
2008/11/03(月) 00:23:33SendKeys(Alt+F4)でもだめでした。
プログラムブック(A)からデータブック(B)を開いて、Bが変更された場合に
変更を保存するかどうかを確認するダイアログが表示されるので、Alt+F4
を送信するとダイアログが閉じられる事になるのでExcelを終了できません。
0724デフォルトの名無しさん
2008/11/03(月) 00:25:16application.quit の前にワークブックの close やってる?
後にしてみたらどうなる?2007はわからんけど、、、
0725722
2008/11/03(月) 00:44:26もう少し具体的に教えて下さいませんか。
2007以外は×ボタンでExcel終了が終了するようになっています。
同じブックを2007の互換モードで動かして×ボタンでExcelを終了
したいのです。
この方法が分からないのです。
0726デフォルトの名無しさん
2008/11/03(月) 01:21:12あ、ごめん
ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_060.html
この辺の問題のことだったの。
2007以外ではいけてるなら関係ないね。失礼した
0727y
2008/11/03(月) 07:57:502007で試さずに>720を答えてました。2007ではQuitだとうまくいかないんですね?
一応、Shift を押しながら×クリックすれば一発で終了するので、それで用が済むなら。
VBAでのやり方は、後で職場の2007で探してみます。
0728デフォルトの名無しさん
2008/11/03(月) 09:09:420729デフォルトの名無しさん
2008/11/03(月) 10:14:59後のことです。
範囲指定を解除する方法は、どこかのセルをactivateやselectするしか
方法はありませんか。画面のちらつきを少しでも防止したいので、セル指定を
したくないのですが、何か方法が無いでしょうか?
0730デフォルトの名無しさん
2008/11/03(月) 10:51:57>>725
724は具体的に言ってるでしょ。
ダイアログが出るために終了できないのならダイアログが出ないようにすれば?
どうしてダイアログが出るの?
ブックが変更されてるのに保存されてないからでしょ?
だったら保存したら?
こんなのパソコン初めて一週間のオッサンでも最初に覚えることの一つじゃないか。
>>729
全体的に何がいいたいのかよくわからない気がする。
0731デフォルトの名無しさん
2008/11/03(月) 10:54:12教えていただきたいのですが、
Book1を起動して
Book1のマクロで
Book2を開くことはできたのですが
Book2の内容をコピーして
Book1に貼り付けすることができません
よろしくお願いします。
0732デフォルトの名無しさん
2008/11/03(月) 10:59:28ググってもすぐ見つかるし
マクロの記録でもすぐ解るようなことを何故聞く?
そのものズバリの解除法が簡単に見つかるのに
>>731
Bool2を開くと、戻り値としてBool2のオブジェクトが返る
あとは好きなようにコピーなりなんなりすれば良い
0733725
2008/11/03(月) 11:12:00保存するかどうかはユーザーが決める事で、プログラム側で決められる
のは、×ボタンが押されたらWindows2007以外と同様な動作なんだけど。
説明不足?それとも...
0734725
2008/11/03(月) 11:17:49719に記述した通りなんだけど...
0735デフォルトの名無しさん
2008/11/03(月) 11:25:31だから?
ついでに言えば、お前さんの言っている現象はExcel2007に特有の現象でもなんでもないはずだ。
お前さんが検証もせずそう思い込んでいるだけにすぎない。
全く同じ条件であれば、2003以前のエクセルでも全く同じことが起こるはずだよ。
0736デフォルトの名無しさん
2008/11/03(月) 11:43:21確かに、Excel2000と2007で同じブックを動作した検証で違いが出た
だけですが...
0737デフォルトの名無しさん
2008/11/03(月) 14:48:400738デフォルトの名無しさん
2008/11/03(月) 20:06:15組み込みダイアログをそのまま使ってるのかな?>>733
組み込みダイアログ出た後の動作が 2007 とその他で異なる可能性あるし、
ユーザに選ばせるなら自前でやった方が確実かも
0739デフォルトの名無しさん
2008/11/05(水) 00:23:48たとえば、セル(4, 3)に '=A1+A2が記入してあり
その式をセル(5, 1)に書き込む場合
Cells(5, 1) = Mid$(Cells(4, 3), 1)
でどうでしょう?
0740デフォルトの名無しさん
2008/11/05(水) 01:33:080741デフォルトの名無しさん
2008/11/05(水) 10:16:29これを実行後するとワークシート上のUndo(元に戻す)が無効になっていまいます。
これって、仕様ですか?
0742デフォルトの名無しさん
2008/11/05(水) 11:06:19イミディエイトウィンドウでやるとVBA動かしたの時と同じでUndoできなくなる
?1+1とかでも同じ
でもウォッチ式として使えば問題ない
0743742
2008/11/05(水) 11:11:330744741
2008/11/05(水) 15:12:16? ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
だと、保護されたシートの時エラーになってしまう。
他にUndoを生かしたまま最終行を求める方法あります?
0745デフォルトの名無しさん
2008/11/05(水) 16:17:36?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())
でどう?
0746デフォルトの名無しさん
2008/11/05(水) 16:42:43有難うございます。
? activesheet.cells(activesheet.cells.rows.count,1).end(xlup).row
で出来たのですが、列を特定しないと駄目なのですよね。
自分も気付いたのですが、
保護されているかどうかでUsedRangeとSpecialCellsを使い分けるという方法
もありますね。
0747デフォルトの名無しさん
2008/11/06(木) 01:26:47B2を起点とするデータ
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
0748デフォルトの名無しさん
2008/11/06(木) 02:13:25set mySouce = の時は、データの入ってるワークシートが
アクティブになっててその書き方で行けるんだけど、
set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、
range("B21") がどこにあるのかわからんってさ
0749デフォルトの名無しさん
2008/11/06(木) 02:51:43なるほど!!明快な説明ありがとうございます。
つまり、set mySouce2 = の前に、
データが格納されているシートをセレクトすればよかったのですね。
対処だけでなく原因が分かりためになりました!
0750デフォルトの名無しさん
2008/11/06(木) 10:11:14そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、
最初にまとめて下準備しちゃえば効率がいいよね
selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい
0751デフォルトの名無しさん
2008/11/06(木) 18:01:30Dim rng as Range
Set rng = ActiveCell
rng.Value = x
この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。
もう少しましな方法を教えて頂けるとありがたいです。
0752デフォルトの名無しさん
2008/11/06(木) 18:14:58Format(x, ActiveCell.NumberFormatLocal)
セルの書式によってはバグるかも試練がw
0753デフォルトの名無しさん
2008/11/06(木) 18:35:33[G/標準]とかでエラーになる為、セル代入を考えたのですが...
0754デフォルトの名無しさん
2008/11/06(木) 18:50:58? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal))
とかは?
0755デフォルトの名無しさん
2008/11/06(木) 19:12:31worksheetfunction.text(x, activecell.numberformat)
これでどうかな?
0756デフォルトの名無しさん
2008/11/06(木) 19:20:37書式に和暦や曜日が指定されてるとヘンになるよ
そういうの無視でいいならいいんだけど
0757デフォルトの名無しさん
2008/11/06(木) 19:35:05セルについて指定無しの状態にするすることは可能ですか?
set rg = nothing とか試してみたけどだめだったorz
0758デフォルトの名無しさん
2008/11/06(木) 19:44:51ほんとしつこいなぁ、、、って誰?w
というか、質問の意味がわからない
>>756
自己レス
曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる
0759デフォルトの名無しさん
2008/11/06(木) 19:50:15以前やってみようとした事があったけど見つからなかった
本当に出来るのかどうかも不明
>>758
お前頭悪そうだな
0760デフォルトの名無しさん
2008/11/06(木) 19:56:56質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ
0761デフォルトの名無しさん
2008/11/06(木) 20:01:110762デフォルトの名無しさん
2008/11/06(木) 20:10:08そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ
質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ
0763デフォルトの名無しさん
2008/11/06(木) 20:46:09目障り
0764デフォルトの名無しさん
2008/11/06(木) 21:18:480765デフォルトの名無しさん
2008/11/06(木) 21:53:02おまえは引っ込んでろ!
このカス。
0766デフォルトの名無しさん
2008/11/07(金) 04:10:27つか、前に質問したなら名前欄にレス番とか入れてくれ
0767569
2008/11/07(金) 06:17:38フォルダを作る側が適当で(ここの部分は立場上どうしようもないです・・・)
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
0768デフォルトの名無しさん
2008/11/07(金) 06:18:180769デフォルトの名無しさん
2008/11/07(金) 08:44:46>そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?
試した?
試してもいないのに質問しに来てない?
0771751
2008/11/07(金) 09:47:36xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別
するにはどうしたらよいのでしょうか?
? Application.WorksheetFunction.IsError(x)
だとエラーにならないのですが...
0772デフォルトの名無しさん
2008/11/07(金) 10:00:12セル(Range)なのか数値や文字なのか
0773デフォルトの名無しさん
2008/11/07(金) 10:09:03「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ
0774771
2008/11/07(金) 10:50:19(フィールドはアクティブセルの列)
この時、xの書式をアクティブセルの書式への変換は
>>751
さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に
Set rng = ActiveCell: rng.Value = x
if WorksheetFunction.Iserror(rng)
とすると、アクティブセルの保存が必要になってしまう為もう少しましな
方法を模索中なのです。
0775デフォルトの名無しさん
2008/11/07(金) 12:54:09ちょっと試せない状態だったのでとりあえず聞きました。
>>773
ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。
お騒がせしました。
0776デフォルトの名無しさん
2008/11/07(金) 13:14:43intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。
二つ目の変数に別のアクティブセルを代入するとerror13が現れます。
どなたかご教授願えないでしょうか?
0777デフォルトの名無しさん
2008/11/07(金) 13:47:26アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?
0778デフォルトの名無しさん
2008/11/07(金) 15:38:15Error 13は「型が一致しません。」だから
単純にint型に文字列(スペース含む)を代入しようとしてるとか?
セルが空なら0が入るし
0779デフォルトの名無しさん
2008/11/07(金) 18:04:360780デフォルトの名無しさん
2008/11/07(金) 18:10:46x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ?
いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな
0781デフォルトの名無しさん
2008/11/07(金) 18:27:190782デフォルトの名無しさん
2008/11/07(金) 19:31:54もちろん、本当に難易度の高いことをやっていて、行き詰まって来る奴も居ないわけではないが
殆どが能無しどころか脳無し(調べる考えるという知能的行為そのものが出来ない奴)なんだから
ここに居座る(質問者としてではなく)ならそのことは覚悟しなくちゃならない
0783デフォルトの名無しさん
2008/11/07(金) 19:45:31よく分からない論理だな。
0784デフォルトの名無しさん
2008/11/07(金) 21:12:21甘え放題も困るが委縮させ過ぎるのもよくない
意味不明な質問を差し戻したり、時々愚痴るぐらいで丁度いい
0785デフォルトの名無しさん
2008/11/08(土) 07:17:57>>757=>>729だね。たぶん>>715も同じ人っぽい
screenupdating = false をやっててもちらつくのは、おそらく on / off のタイミングが悪い
たびたび on / off すると、on になった一瞬のスキも見逃さずに画面更新するからちらつく
off にしたらしっぱなしになる位置でやらないと
範囲指定を解除(セルが select されていない状態に)する方法だけど、
高さ・幅 0のイメージを用意してそれを select すれば、
selection が range でない状態にすることはできる
activecell の参照は直前のまま保持されるけど、シート上の囲み枠は出ない
でもさ、解除ができても、指定/解除を繰り返せばどのみちチラチラするよ
ちらつき防止なら、screenupdating のタイミングを確認するのがいいと思う
0786デフォルトの名無しさん
2008/11/08(土) 17:49:36ベリー、ベリー、サンクス
お見込みのとおり、その3つは折れです。
展望が開けました。
サンクス。
0787デフォルトの名無しさん
2008/11/09(日) 08:43:300788デフォルトの名無しさん
2008/11/09(日) 11:32:30・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す
0789デフォルトの名無しさん
2008/11/09(日) 11:34:070790788
2008/11/09(日) 11:36:43・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す
そんなマクロなんだけど、毎日販売管理ソフトから吐き出されたxlsファイルをBook1.xlsと同じ階層にコピーして、ファイル名を記述しないといけないのだけど、
xlsファイルをxlsファイルにドラッグアンドドロップとかでファイル名を取得して実行できるようにする方法ってありますかね?
0791デフォルトの名無しさん
2008/11/09(日) 11:53:23スレ違い
それはVBAではなくVB言語の質問だ
>>790
あるけど、それはWindowsの設定の問題だ
0792デフォルトの名無しさん
2008/11/09(日) 12:30:57ほんと言うとVisualStudioでEXE形式にできたらいいんだけどね。
VisualStudioからEXCELのコントロールわからんしな;;
0793デフォルトの名無しさん
2008/11/09(日) 14:49:50無理にやると普通に開けなくなるだろ
バッチファイルかWSHにドロップして
引数を環境変数に設定して
xlsファイルを開き
環境変数を見る
0794デフォルトの名無しさん
2008/11/09(日) 15:43:560795デフォルトの名無しさん
2008/11/09(日) 19:34:55普通にアドインを作れば解決するケースに思えるけど。
0796デフォルトの名無しさん
2008/11/09(日) 21:03:050797デフォルトの名無しさん
2008/11/09(日) 21:16:11教えてくれ
0798デフォルトの名無しさん
2008/11/09(日) 21:31:57それを読んだ方がいいよ。
VBAのコードが普通に書ける人ならすぐに理解できると思う。
0800655
2008/11/10(月) 00:15:33If Weekday(Date) = 7 And (Day(Date) + 7) \ 7 = 3 Then
Range("A1").Value = "明日は第三週の日曜日"
End If
正直な話、説明がさっぱり理解できてませんでしたが、がんばったらできました。
0801デフォルトの名無しさん
2008/11/10(月) 10:07:40書いて良かった。誰?とか言ってゴメンなw
>>790
処理対象ファイルが自動的に特定できれば一番ラクそうだけど、
人間が見ないと特定できないの?
あるフォルダ内でタイムスタンプが今日付けの .xls とかでも無理?
正直、アドインにする利点がピンと来ない、、、
0802デフォルトの名無しさん
2008/11/10(月) 11:51:04販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
たとえは今日なら20081110.xlsって手打ちで名前をつけてね。
それをこのマクロの入ったBook1.xlsから呼び出すんだ。
それを、アドインにしておけば、xlsを吐き出すことなく、読み込むcsvの名前をつけて保存すればよくなるだけだなと思ったら、これはいいアイディアだと思う。
0803デフォルトの名無しさん
2008/11/10(月) 12:55:12>販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
保存する前の段階でBook1.xls開いてマクロ動かせばいいだけじゃね?
一々保存してからマクロ動かさないといけない理由でもあるのか?
0804デフォルトの名無しさん
2008/11/10(月) 12:58:20なるほど理解した。けど単にツールバーにマクロ登録でいいような、、、
0805デフォルトの名無しさん
2008/11/10(月) 13:33:500806デフォルトの名無しさん
2008/11/10(月) 14:03:48保存しないとファイル名がないから別のブックからコントロール奪えないと思ってたorz
0807デフォルトの名無しさん
2008/11/10(月) 14:05:19それがアドインかと思ってたorz orz
0808デフォルトの名無しさん
2008/11/10(月) 19:24:04そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。
0809デフォルトの名無しさん
2008/11/10(月) 19:26:46ツールバーにマクロ登録すると
その販売管理ソフトが吐き出したブックをExcelで開いたときにマクロを動かせます。
0810デフォルトの名無しさん
2008/11/10(月) 19:30:270811デフォルトの名無しさん
2008/11/10(月) 19:40:33そのマクロをツールバーに登録するんだよ
ネットワーク越しでも大丈夫だし
0812デフォルトの名無しさん
2008/11/10(月) 23:38:11application on timeを使って、
開始したら、
a時に処理1をやって、その20秒後に処理2をやって、その8秒後に処理3を
やって、終わる。
というものです。
どうにも、最近、頭が回らなくなって困ってます (~.~)
0813デフォルトの名無しさん
2008/11/10(月) 23:48:190814デフォルトの名無しさん
2008/11/11(火) 00:02:20処理1は、マクロ1。処理2はマクロ2。処理3はマクロ3と
いうことでお願いします。
0815デフォルトの名無しさん
2008/11/11(火) 01:31:29Cで書くと下記みたいな流れになるかなと思うんですが・・・(間違ってるかもしれませんが)
abc ="08/11/11";
sscanf(abc,"%d/%d/%d",&a,&,b,&c);
printf("20%02d%02d%02d",a,b,c);
VBAで書くにはどんな関数使えばいいのでしょう。
0817815
2008/11/11(火) 02:02:40tmpdate_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
0818デフォルトの名無しさん
2008/11/11(火) 02:09:50いったん日付型にしてから書式変換するとラクだと思う
文字列→日付型への変換は cdate()
日付型→書式付文字列変換は format()
詳しくはヘルプ読んでね
0819デフォルトの名無しさん
2008/11/11(火) 19:44:30エクセルのマクロで
module1内にコード書くのと
sheet1内にコード書くのとでは
動作にどんな違いがありますか?
sheet1から他のシートを対象としたselectionメソッドが失敗するようなのですが・・・
0820デフォルトの名無しさん
2008/11/11(火) 19:50:390821デフォルトの名無しさん
2008/11/11(火) 20:51:010822デフォルトの名無しさん
2008/11/11(火) 21:15:30複数のセルの値を一度に比較することってできますか?
Sheet1のA1:B5とSheet2のA1:B5のValueが
同じであるかどうか、が分かるだけでokなのですが。
0823デフォルトの名無しさん
2008/11/12(水) 00:20:520824デフォルトの名無しさん
2008/11/12(水) 01:57:12配列数式でできるよ
0825デフォルトの名無しさん
2008/11/12(水) 05:52:03羅線の太さを調節する方法ってありますか?
できるだけ細くしたいのです。
0826デフォルトの名無しさん
2008/11/12(水) 06:21:13マクロの記録使って保存すればおk
単純に細くするだけの質問ならスレチ
0827デフォルトの名無しさん
2008/11/12(水) 12:48:05セル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
どうやったら速度アップできるか知りたいのですが...
0828デフォルトの名無しさん
2008/11/12(水) 12:52:09らせん?
0829デフォルトの名無しさん
2008/11/12(水) 13:26:01罫線
新羅
確かに間違える人は居るかも
0830827
2008/11/12(水) 14:59:51シート・アクティブ時にコピー挿入し編集
シート・ディアクティブ時に挿入データを削除(元の状態に戻す)
なのです。
0831デフォルトの名無しさん
2008/11/12(水) 15:02:57> 2回目以降:54秒 (Pasteに変更すると29秒)
単位、「秒」じゃなくて「_秒」の間違いだよね?
0832デフォルトの名無しさん
2008/11/12(水) 15:15:350833デフォルトの名無しさん
2008/11/12(水) 15:17:380834デフォルトの名無しさん
2008/11/12(水) 15:20:330835デフォルトの名無しさん
2008/11/12(水) 15:34:39データは何かあるのか?
とりあえず高速化のために
Application.ScreenUpdating=False
はやってるよな?
0836デフォルトの名無しさん
2008/11/12(水) 15:54:59ScreenUpdating, EnableEvent, Calculation等もやってみています。
マシン・スペック(5年前)の問題でしょうか?
0837デフォルトの名無しさん
2008/11/12(水) 16:15:36計測方法の問題じゃないか?
0838デフォルトの名無しさん
2008/11/12(水) 16:54:320839デフォルトの名無しさん
2008/11/12(水) 17:23:09Mobile云々は置いといてこっちは1.2GHzなんだよw
OSが2kだからってここまで差は出ないよな?
体感でも1秒以上かかってるのか?
0840デフォルトの名無しさん
2008/11/12(水) 17:38:52でセルA1とB1を結合して走らせてみたら
1回目:9秒
2回目:40秒
体感で1秒未満は、セル結合無しの場合だけ
0841デフォルトの名無しさん
2008/11/12(水) 17:53:33それなら確かに遅くなるな
0843デフォルトの名無しさん
2008/11/12(水) 18:03:34遅過ぎワロタw
0844デフォルトの名無しさん
2008/11/12(水) 22:23:38どこまでが編集前でどこからが編集後?
編集は .mergecells = false の前?後?
0845デフォルトの名無しさん
2008/11/13(木) 09:30:46rows(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
0846デフォルトの名無しさん
2008/11/13(木) 09:40:020847デフォルトの名無しさん
2008/11/13(木) 12:31:54了解
多数の結合セルを含む範囲で挿入/削除を続けてやると、後でやる方の処理が遅くなる感じ
メモリ上のシート情報がややこしくなるのかな?1回目をやった後ブックを閉じて開き直すか、
シートコピーでリフレッシュすれば2回目が遅くならないけど、イベント拾うならキツイよね
オレなりに試してみた限りでは、
挿入時: .insert を使わず、2行目以降にデータがあった場合は 20000行ずらした位置へ
コピーし、狭間へ 1行目を 20000行分コピー
削除時: 最初にシートコピーでバックアップを取っておいて、.cells.copy でコピーし戻す
( .mergecells = false もいらない)
ってなやり方が一番早かった。1回目は大差ないけど 2回目が 1回目より早くなる
0848845
2008/11/13(木) 13:26:06有難うございます
挿入処理は、
insertを使わない方法(Paste)は、定義されている名前がある場合面倒そうです
削除処理は、
ご指摘のシートコピーを戻す方式を実際の処理に組み込んでテストしてみます
0849デフォルトの名無しさん
2008/11/13(木) 17:21:48名前か。それは厄介だ
挿入に insert 使ってコピー書き戻すと名前付き範囲の内容書き変わるし
insert だけでも 2回目は遅くなるし
後は、編集時にシートコピーしたシートを使っといて、deactivate されたら
シートごと削除とかかなあ。イベントあるからいろいろめんどくなるんだよな、、、
0850デフォルトの名無しさん
2008/11/13(木) 17:26:260851デフォルトの名無しさん
2008/11/13(木) 18:16:20データ量や数式、書式設定その他によってかなり違うだろうね
オレのはあくまで>>827の条件で試しただけだし
0852デフォルトの名無しさん
2008/11/13(木) 21:52:40range("namedarea").offset(20000).name = "namedarea"
コピーバックの後に .offset(-20000) で、わりと簡単に対応できた
画期的なやり方は見つからんね。構成とか見直すしかないかも、、、
0853851
2008/11/14(金) 00:13:24やっぱ>>847のが早かった。calculation 切れば数式なしの時とあんま変わんない
とにかく insert (特に 2回目)が遅いんで、insert とコピーバックの組み合わせでは
効果ないかも
0854デフォルトの名無しさん
2008/11/14(金) 21:41:28今日はじめて本屋にて VBA の存在を知りました。
初心者質問ですみません、例えば、、、これができるようになるとなにができるようになるのですか?
詳しいかた教えてください。
0855デフォルトの名無しさん
2008/11/14(金) 22:05:58例えば野球データベース
選手名を入力すればその選手のプロでの全成績が一覧表示されるとか
インベーダーゲーム作ってる人もいるよ
とにかくExcelをVBAプログラムで自在に操れるって事
0856デフォルトの名無しさん
2008/11/15(土) 19:22:40業務で言うと、データベースをexcelに展開して、
色んなチェックプログラムを掛けて品質保証したりとか。
ワークシートで使える関数を作って会社内に配布したり。
excel上に検索エンジン作ってる人もいるし、まぁ、何でもあり。
0857無職カス
2008/11/16(日) 02:50:07>>855
>>856 さん 返答ありがとうございます。かなり使える機能ですね。
最近アルバイトをやめました。時間はたっぷりありますのでそこそこ使えるレベルまでもっていきます。
これからVBAを勉強していきます。
多々質問すると思いますが、みなさんよろしくおねがいします。
0858デフォルトの名無しさん
2008/11/16(日) 03:45:10そこから各部門のトップ5を上の小さい表に抽出したいんだけど、
ランクとは違う気がするし行き詰っています。
どなたかご教授願えますでしょうか?
0859デフォルトの名無しさん
2008/11/16(日) 05:08:38セルAの値によってセルBの値が変わるよう関数を設定しているの状況で、
セルBの書式が自身の値によって変わるようにマクロを組もうとしています。
(書式は4種類以上なので条件付き書式は使えません)
worksheet_changeで書式変更を自動実行するようにしたのですが、
マクロを実行してみるとAの値を変えてもBの書式が変わりません(Bの値は通常通り変わります)
その状況で、まったく関係ないセルCの値を変更するとBの書式が変わったので、
マクロ自体には問題はないようです。
おそらく、A変更→マクロ自動実行→関数でBの値変更、という内部処理があるために
マクロによる変化が見られない状況であると思っています。
(違っているなら根本から考え直さないといけないかもしれませんが)
このような構成の場合、関数による値の変更が反映された後で
書式変更などのマクロが実行されるようにすることはできないのでしょうか?
ご教示お願い申し上げます。
0860デフォルトの名無しさん
2008/11/16(日) 10:11:550861デフォルトの名無しさん
2008/11/16(日) 10:51:08ご回答ありがとうございます。
5分前にcalculate使えばいいと気づいて、自己解決した旨書きにきたら
既にお答えくださっていたのですね。
初歩的な事でお手を煩わせてしまい、申し訳ございませんでした。
0862デフォルトの名無しさん
2008/11/16(日) 19:13:30基礎を勉強するには独学でも全然問題ないけど、
プログラム未経験で、かつ仕事に就いてないとなると、
プログラムの基本的な事を理解するまでに半年か1年かはかかると思う。
んで、そこから先は明確な目標が無いと無理。
やれる事が多いんだけど、ぶっちゃけた話、特化したプログラムには敵わない。
例えば>>855でゲームの話が出てたけど、確かに作る事は出来る。
けど、VBAからAPI呼び出してるに過ぎないし、更に言えば
タイムラインって概念がある&ドローツールのFlashなんかには到底及ばない。
ExcelVBAはあくまでExcelの処理系統のプログラムだと俺は考えてる。
Excel上での処理に関してはVBAがぶっちぎり。当然だけどね。
何か目標持った方が良いよ。
0863デフォルトの名無しさん
2008/11/16(日) 19:15:00calculate使う理由が分からん・・・。
VBAで処理してるなら、VBAでBの値も弾き出せば良いんじゃないか?
0864独り言(ちら裏)
2008/11/17(月) 01:24:05問題ありかと...
それがExcelのポリシーというのであれば、そういうアプリめいたものを
Excelで作ることが間違いだったということになるか...
0865デフォルトの名無しさん
2008/11/17(月) 10:16:53> 問題ありかと...
という意見が多いので、2007で設定数が 3 から 無制限 に、
優先順位も設定を書き直さずに変更できるようになった。
0866デフォルトの名無しさん
2008/11/17(月) 14:02:590867デフォルトの名無しさん
2008/11/17(月) 15:07:26というのが無難かと
0868デフォルトの名無しさん
2008/11/18(火) 00:50:10selection changeイベントで好きなだけ設定しろ。
おまいのVBAは飾りもんか?
0869デフォルトの名無しさん
2008/11/18(火) 17:07:45ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110.html
strRECをUTF-8→SJISにエンコードするには、どう記述したらいいですか?
0870デフォルトの名無しさん
2008/11/18(火) 20:26:27Dim 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)まで同じ処理をしたい場合はどう記述すればいいですか
0871デフォルトの名無しさん
2008/11/18(火) 21:16:34ADODB.Stream
0872デフォルトの名無しさん
2008/11/18(火) 21:23:24Dim 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
0873デフォルトの名無しさん
2008/11/18(火) 21:45:15byte型宣言はいくらなんでも無いんじゃないかな・・・。
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
短い構文でも同じ処理は出来るんでないかな。
0874デフォルトの名無しさん
2008/11/18(火) 22:07:130875デフォルトの名無しさん
2008/11/18(火) 22:07:40こうか?
0876デフォルトの名無しさん
2008/11/19(水) 00:36:24255行でオーバーフローで止まる方式
0877デフォルトの名無しさん
2008/11/19(水) 08:47:210879デフォルトの名無しさん
2008/11/19(水) 10:18:22どうもありがとう^^
メモリ不足で四苦八苦してたけど.LineSeparator追加で何とか出来た。ヽ(´ー`)ノ
ttp://www.cocoaliz.com/excelVBA/index/41/
0880デフォルトの名無しさん
2008/11/19(水) 10:30:400881デフォルトの名無しさん
2008/11/19(水) 13:46:560882デフォルトの名無しさん
2008/11/20(木) 10:23:070883デフォルトの名無しさん
2008/11/20(木) 11:21:570884デフォルトの名無しさん
2008/11/20(木) 13:59:13ADODB.Streamが良く分らなくても動いて良かったです^^
automation error
The object invoked has disconnected by the client
これ、どうやって解析したらいいの?
ユーザフォームからFiledialogでファイルを開くと 出るんだけど・・・
で、そのうちFM20.dllでメモリアクセスバイオレ〜ションになる
0886デフォルトの名無しさん
2008/11/22(土) 20:17:54帰ってきたページのリンク先の情報を取得したいと思ってます
Debug.Print objIE.Document.Links.Length で見ると値は4なので
フォーム送信前のリンク先の総数は4だと分かるんですが、
送信後に帰ってきたページのそれの総数(その他もですが)の取得ができません
set objIE = Nothing で一度解放してから再度
CreateObject("InternetExplorer.application") でバインドするだけでは駄目なのでしょうか
"システムエラーです: &H800004005 (-214767259) エラーを特定できません"
というエラーが出てしまいます
あともうちょいの様な気がしますので、どなたかご教示お願いします
0887デフォルトの名無しさん
2008/11/22(土) 21:39:470889デフォルトの名無しさん
2008/11/22(土) 22:16:44読み込み終わるまでウェイトは入れてる?
0890886
2008/11/22(土) 22:30:48一応前後に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のまま
ここでリンクの数を再取得(前のページのでなく新しいページのが欲しい)したいのです
0891886
2008/11/22(土) 22:32:45Private 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
0892デフォルトの名無しさん
2008/11/22(土) 23:41:05相対参照ってどう記述すればいいんでしょう
0893デフォルトの名無しさん
2008/11/23(日) 06:31:45まず、chdir thisworkbook.path で今開いてるブックのフォルダに移動してから
同じフォルダ内なら workbooks.open filename:="Book1.xls"
下のフォルダ内なら filename:="\Folder1\Book1.xls"
上のフォルダ内にある別のフォルダの中にあれば filename:="..\Folder2\Book1.xls"
ふたつ上のフォルダ内なら filename:="..\..\Book1.xls"
んな感じで
0894デフォルトの名無しさん
2008/11/23(日) 07:28:29すげーーーー!
書き込んだあと、いろいろ探してそれっぽいのは見つけたんだけど、このソースが一番短い!!!ありがとう!!
0895デフォルトの名無しさん
2008/11/23(日) 10:14:32URLリンク先取得
ttp://www.google.co.jp/search?hl=ja&q=VBA+URL+%E3%83%AA%E3%83%B3%E3%82%AF&lr=
>>892
ファイル検索
ttp://www.google.co.jp/search?hl=ja&q=VBA+File+%E6%A4%9C%E7%B4%A2&btnG=%E6%A4%9C%E7%B4%A2&lr=
0896デフォルトの名無しさん
2008/11/23(日) 15:47:12ちゃんとループ内に入ってることは確認済?
.readystate が変更される前に飛んで来てたりしてないよね
.document.readystate とか、document_completeイベントとかでのチェックはもう試した?
IE が値を返すタイミングはあんまり信用できないから、いろいろ試した方がいいかも
0897デフォルトの名無しさん
2008/11/23(日) 19:12:411を変数にしたい場合⇒RANGE("A" & format(i))というのを見つけたのですが、
Aを変数にしたい場合はどうすればよいでしょうか?
0898デフォルトの名無しさん
2008/11/23(日) 20:06:38普通に変数を & で繋げばOK
dim a as string: dim i as long
a = "A": i = 1
debug.print a & i ' ←これでも行けるけど
debug.print a & cstr(i) ' ←ちゃんと型を揃えたければこっち
つか、cells 使った方が効率いいよ
0899デフォルトの名無しさん
2008/11/23(日) 21:01:42ありがとうございます
とりあえず、a="A"(列名)を列番号からmid関数で取得して、使ってみます。
0900886
2008/11/23(日) 22:24:38ようやく仕事から帰りました
ループの囲みや最初の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になるまで
ループを回す事で、きちんと最後まで読み込めるようになりました
0901デフォルトの名無しさん
2008/11/23(日) 22:57:44なんか回りくどいことするんだね、、、いいけどさ
>>900
オレなら外側のループにも doevents 入れたくなるんだけど、
動いたんならいっかw
0902デフォルトの名無しさん
2008/11/24(月) 07:27:53cells(1,1).select
ってやってみ。
0903デフォルトの名無しさん
2008/11/24(月) 19:35:430904デフォルトの名無しさん
2008/11/25(火) 01:56:12フリーのオブジェクトって何があるか教えてくださいエロイ人
BASP21なんかフリーだけど、送れるのはテキストだよね
試しにBodyにHTML書いてみたら、そのままテキストで着ちゃったよママン
0905デフォルトの名無しさん
2008/11/25(火) 04:26:56basp21 でできるはず
ttp://www.hi-ho.ne.jp/babaq/faq.html#M002
0906デフォルトの名無しさん
2008/11/25(火) 08:00:48即レスありがとう
ありゃ?これは有料じゃなくて無料でもできるのですか?
ちょっと読んでみても区別がつかなかったので、あとでじっくり読んで見ます。
0907デフォルトの名無しさん
2008/11/25(火) 09:34:06どっちも同じ。
0908デフォルトの名無しさん
2008/11/25(火) 14:17:31今後この別窓の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
ウィンドウハンドルの値は取得できても、アクティブにしたい(操作したい)ウィンドウの
それだと判別する方法が解らないので、どなたかご教示&ご解説お願いします
0909デフォルトの名無しさん
2008/11/25(火) 14:55:04>>1★3,★4
お引き取り下さい
0911デフォルトの名無しさん
2008/11/26(水) 02:07:41俺も勉強してる時、ヘルプの使用例には
何度も泣かされたよ。
0912デフォルトの名無しさん
2008/11/26(水) 08:19:57次ぎは、どの様な本がお勧めですか?
0913デフォルトの名無しさん
2008/11/26(水) 19:41:470914デフォルトの名無しさん
2008/11/27(木) 10:36:04日本語わかる?
0915デフォルトの名無しさん
2008/11/27(木) 10:49:200916デフォルトの名無しさん
2008/11/28(金) 01:40:51教えてもえらなかったからって逆切れですか?
0917デフォルトの名無しさん
2008/11/28(金) 09:55:34ありませんでしょうか?
0918デフォルトの名無しさん
2008/11/28(金) 22:31:450919デフォルトの名無しさん
2008/11/28(金) 22:32:16OOP極めてるオレに聞け
0920デフォルトの名無しさん
2008/11/28(金) 23:54:440921917
2008/11/29(土) 00:15:40VBAとdesign patternで検索したら沢山ヒットしました。
http://www.google.com/search?client=safari&rls=en-us&q=VBA+design+pattern
書籍だと、VB+design patternってのは沢山あるのですが、
VBA専門となると見つかりませんでした。
0922デフォルトの名無しさん
2008/11/29(土) 08:07:51タイムスタンプとファイルサイズを取得することはできませんでしょうか?
0923デフォルトの名無しさん
2008/11/29(土) 08:38:150924デフォルトの名無しさん
2008/11/29(土) 09:27:04社内LANで繋がれたネットワーク上のドライブですよ。
VB.netでやった方がいいのかな。
0925デフォルトの名無しさん
2008/11/29(土) 09:29:220926デフォルトの名無しさん
2008/11/29(土) 10:11:340927デフォルトの名無しさん
2008/11/29(土) 10:36:38作れます。でも>>1
0928デフォルトの名無しさん
2008/11/29(土) 12:07:56「ドライブ」って何?
0929デフォルトの名無しさん
2008/11/29(土) 12:42:280930デフォルトの名無しさん
2008/11/29(土) 13:45:58Range("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への代入と違うトコなの?
0931デフォルトの名無しさん
2008/11/29(土) 14:56:42で?
0932デフォルトの名無しさん
2008/11/29(土) 14:57:34a = 1とa = 1; b = aと何が違うの?
0933デフォルトの名無しさん
2008/11/29(土) 15:38:07記法の違い
0934デフォルトの名無しさん
2008/11/29(土) 16:03:19書いてあるサイトありませんでしょうか。
0935デフォルトの名無しさん
2008/11/29(土) 17:07:520936デフォルトの名無しさん
2008/11/29(土) 18:49:18死者が200人を超えるとも言われてるし。
0937デフォルトの名無しさん
2008/11/30(日) 10:08:03VBAって参考本みると簡単な操作で
いかにも思考ルーチンなんか作れなさそうなんですが
そんなことはないのですか?
VBAって入門書が多くて上級本がないように思うのですが
0938デフォルトの名無しさん
2008/11/30(日) 10:09:09オセロとか将棋か?
0939デフォルトの名無しさん
2008/11/30(日) 10:10:290940デフォルトの名無しさん
2008/11/30(日) 16:10:210941デフォルトの名無しさん
2008/11/30(日) 17:57:52言語の能力としては可能だが、VBAで組む必然性がない
0942デフォルトの名無しさん
2008/12/01(月) 00:16:33言語としての記述力に欠ける。
0943デフォルトの名無しさん
2008/12/01(月) 00:21:26落ち着いて作れないしな。
0944デフォルトの名無しさん
2008/12/01(月) 14:01:57VBAに取り込む方法があるんですか?
0945デフォルトの名無しさん
2008/12/01(月) 14:36:08APIが使えるから似たような感じでなら使えるんじゃないかな?
自作DLLではやったことないけど
0946デフォルトの名無しさん
2008/12/01(月) 16:53:26「参照」で取り込むかのどちらか。
前者の方が簡単。
0947デフォルトの名無しさん
2008/12/01(月) 17:37:53JavaScriptを使うか(もちろんScriptのCOMを使って)、
WSHでXML書いてCOMオブジェクトに仕立てあげるか。
0948デフォルトの名無しさん
2008/12/01(月) 20:13:060949デフォルトの名無しさん
2008/12/01(月) 20:15:46チミプログラム書いたことないでしょ?w
0950デフォルトの名無しさん
2008/12/01(月) 20:41:520951デフォルトの名無しさん
2008/12/01(月) 22:06:24コンボには複数のアイテムを入れるんですが、
その中で最も長いアイテムを表示できるよう、
最初に表示する時点で自動的にサイズ調整はできるでしょうか?
0952デフォルトの名無しさん
2008/12/01(月) 22:24:33扱いなのにそんな妙なところだけ親切(いや俺にはそんな機能が親切とは思えんが)
だったりするわけないだろう常識で考えて。。
0953デフォルトの名無しさん
2008/12/02(火) 01:03:47だってそれが主目的じゃん。
photo shop持ってるのに、paintでレタッチするようなもんだ。
0954デフォルトの名無しさん
2008/12/02(火) 01:43:30別にExcelにひっつける必要はないと思うよ。
MSXMLでXMLをいじくったりしてるし。適当なVBのメモパッドだと思えば。
Excelだとデータをそのままシート上で
表現できるからいろいろとぬるぬる処理できて便利なんだよね。
>>951
自分で文字列の長さ測って適当なサイズ設定してあげるしかないんじゃないかな。
プロポーショナルフォントはもちろん解除してね。
0955デフォルトの名無しさん
2008/12/02(火) 10:36:10自動で調節する方法はない。
どこか作業列にアイテムを入れてセル幅を自動調節して結果をチェックするのが一番簡単。
完璧にやるならWin32APIのGDI関数で文字列の幅を取得。
0956デフォルトの名無しさん
2008/12/02(火) 21:22:57業務でたくさんの仕様書を書いたりしているわけですが、
作った大量のブックの書き方が間違っていた場合など、
これを一つ一つ開いて、手で同じセルに同じ文字を打ち込むわけです。
これがバカらしいのでマクロを作りたいです。
当然必要になるであろう機能といえば、マクロでブックを開くとか、上書きするとか、閉じるとか、上書きで閉じるとか。。
つまりこういうことをするのに便利なリファレンスマニュアル的な本が良いです。
三角関数だの、キューブだの、そんなものはどうでも良くて。
で、逆引き系で、「ブックを閉じるには」っていう一見気の利いた見出しが合って
開いてみると、実はブックの閉じ方だけが載っていて、関連するであろう
「保存して閉じる」とか「上書きで閉じる」とかそういう機能はまったく触れてないような
やっつけハウツー本はいらないです。
m(_$_)mよろぴこ
0957デフォルトの名無しさん
2008/12/02(火) 21:28:200958デフォルトの名無しさん
2008/12/02(火) 21:37:27でも客先だとグーグル禁止なの。・゚・(ノД`)・゚・。
0959デフォルトの名無しさん
2008/12/02(火) 21:59:55VBAのヘルプ以上のことが書いてある本はまずない気がする。
というか、VBAなんてヘルプがあれば当たり前の作業は当たり前にできるでしょ。
Win32API使わないとできないようなこと(まあ普通に多い)が書いてある本はまずない。
まず客を説得することを考えるべきだろうね。
客が余程の馬鹿か君の説明能力が欠如してなきゃweb閲覧ぐらい許可するでしょ。
しかし、そんなレベルの人を使ってる「客先」が気の毒になるな。
0960デフォルトの名無しさん
2008/12/02(火) 22:08:110961デフォルトの名無しさん
2008/12/02(火) 22:12:00しかし、なんて馬鹿って得意げなんだろう。
20年30年生きてりゃ自分の知能が如何程かわからんわけでもあるまいに。
0962デフォルトの名無しさん
2008/12/02(火) 22:15:05> 客が余程の馬鹿か君の説明能力が欠如してなきゃweb閲覧ぐらい許可するでしょ。
許可するしないとか問題外なの
どうやっても"できない"職場なの
0963デフォルトの名無しさん
2008/12/02(火) 22:17:34>>958になんて書いてあるんだよ。
久々に見たわこんなトンチキ。
0964デフォルトの名無しさん
2008/12/02(火) 22:19:190965デフォルトの名無しさん
2008/12/02(火) 22:21:300966デフォルトの名無しさん
2008/12/02(火) 22:22:09その通り。
そしてWebの許可をもらうとかそういうことは論点でもない。>なんかやたら威勢の良い世間知らずの方
0967デフォルトの名無しさん
2008/12/02(火) 22:22:580968デフォルトの名無しさん
2008/12/02(火) 22:37:57>>958本人かどうか知らないが、そういう台詞は状況を正確に書いてから言ったらどうだ。
まあこの手の馬鹿に何いっても無駄だろうけど。
0969デフォルトの名無しさん
2008/12/02(火) 22:40:090970デフォルトの名無しさん
2008/12/02(火) 22:46:38昔はMSDNのCDに詳しい追加のヘルプファイルが入ってたけど、今でもそういうのはあるんだろうか。
VBとWIN32のヘルプをノートパソコンに入れて持ち歩いてたよ。
とりあえず持ち歩くなら技術評論社のポケットリファレンスが小さくてオヌヌメ。内容はちょっと薄いけど
ちょっとセルにデータを入れたいとか簡単なプログラミングならこれで十分。
ttp://www.amazon.co.jp/dp/4774135674
0971デフォルトの名無しさん
2008/12/02(火) 22:47:200972デフォルトの名無しさん
2008/12/02(火) 22:48:25ありがとうございます。早速チェックします。
0973デフォルトの名無しさん
2008/12/02(火) 23:16:01正直、必要な記憶つったって仕様書とか扱うだけならごくごくわずかだし、
リファレンスが必要とは思えない。
分厚い本の最初だけ懇切丁寧にやって
後は興味のあるプロパティとメソッドだけおぼえりゃしたいこと出来る。
0974デフォルトの名無しさん
2008/12/02(火) 23:35:46馬鹿か?
0975デフォルトの名無しさん
2008/12/02(火) 23:39:41いざって時にピンポイントで役立つのはやっぱネットの情報だなぁ
先人はみな自分が考えるような疑問や壁に既にブチ当たっているものであり、
自分が天才か途方も無いアホでない限り、そこには大体たどり着けるしね
でもそれ専門で食ってでもない限り、少しずつ腕は錆びるものだし
覚えた知識もすぐに薄れていくから、それを繋ぎとめるためにも書籍はやっぱ必要
俺は自宅のトイレで本読む癖あるから、半書斎化してるよ
0976デフォルトの名無しさん
2008/12/02(火) 23:41:02ネットが駄目というくらいだから、持ち込み制限とかありそう。
0977デフォルトの名無しさん
2008/12/02(火) 23:43:09携帯は仕事中にいじるのは良くおもわれないからひかえてる。
いちいち「VBAの文法調べてるんですよ」とか弁護しながら使うのは嫌だw
0978デフォルトの名無しさん
2008/12/03(水) 00:10:24好きにすれば?
0979デフォルトの名無しさん
2008/12/03(水) 00:11:16間違いなくお前さんが勝手に思い込んでるだけ。
いや正確に言うと、「そう思い込むことにした」だけ。
自分のコミュニケーション能力の欠如を直視する代わりに、ね。
だから余程馬鹿な客でもなければ、「自分が雇ってる人間の生産性の向上に繋がること」
=「自分が得すること」を拒否なんかするかよ。
本当最近こういう社会人として最低限のコミュニケーション能力が欠如してる奴が多くて困るんだよ。
0980デフォルトの名無しさん
2008/12/03(水) 00:16:27書籍の持ち込みまで禁止ってのはちょっと聞いたことがない。
たぶん俺が知らないだけなんだろうけど、世界は広いんだなあ。
0981デフォルトの名無しさん
2008/12/03(水) 00:20:310982デフォルトの名無しさん
2008/12/03(水) 00:21:03また上から目線w
0983デフォルトの名無しさん
2008/12/03(水) 00:58:350984デフォルトの名無しさん
2008/12/03(水) 01:17:07ここは社会人指南スレッドじゃありませんので、
いい大人が説教こくのはやめてください。
0985デフォルトの名無しさん
2008/12/03(水) 01:20:17こちらの質問者と同じことをしたくて
マクロをいじっているのですがうまくいきません。
どなたか助けていただけないでしょうか?
0986デフォルトの名無しさん
2008/12/03(水) 01:26:13hatenaを読んでも判らないのならhatenaで聞くか諦めるのが宜しいかと。
0987デフォルトの名無しさん
2008/12/03(水) 01:34:27ただ単にセルにある値を順に.txtで保存するだけでしょ。
0988デフォルトの名無しさん
2008/12/03(水) 01:38:42.write Replace(ActiveSheet.Cells(i, 2).Value, vbLf, vbCrLf)
の部分で引っかかってしまって。
0989デフォルトの名無しさん
2008/12/03(水) 01:56:00Sub 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
0990デフォルトの名無しさん
2008/12/03(水) 02:03:26本当にありがとうございます。
助かりました!
0991デフォルトの名無しさん
2008/12/03(水) 08:03:120992デフォルトの名無しさん
2008/12/03(水) 08:24:40いい大人じゃないだろ。社会経験ほとんどない青二才丸出しだろ。
0993デフォルトの名無しさん
2008/12/03(水) 09:09:28Web閲覧を許可した場合のリスクとメリットの比率の問題だろ
メリットのほうが大きく上まれば許可するかも知れんが
そんなことはまずないなw
ところで誰か次スレを・・・
0994デフォルトの名無しさん
2008/12/03(水) 19:54:07マジで。
0995デフォルトの名無しさん
2008/12/03(水) 20:28:08excelで判らないことがあるとトイレに駆け込む姿を想像した
0997デフォルトの名無しさん
2008/12/03(水) 22:36:51言っても無駄な相手だからw
0998デフォルトの名無しさん
2008/12/03(水) 22:38:570999デフォルトの名無しさん
2008/12/04(木) 08:43:491000デフォルトの名無しさん
2008/12/04(木) 09:07:5810011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。