Excel VBA質問スレ Part8
at TECH
1:デフォルトの名無しさん
08/08/25 23:16:33
ExcelのVBAに関する質問スレです
前スレ スレリンク(tech板)
★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)
2:デフォルトの名無しさん
08/08/25 23:18:54
過去スレ
01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)
04 スレリンク(tech板)
05 スレリンク(tech板)
06 スレリンク(tech板)
07 スレリンク(tech板)
3:デフォルトの名無しさん
08/08/25 23:28:51
>>1
乙
4:デフォルトの名無しさん
08/08/25 23:31:24
>>995
入力文字列の書式が「999-9999-9999」か「9999-99-9999」だけなら、
x = split(入力文字列,"-")
x(0)="(" & x(0) & ")"
debug.print join(x,"-")
5:デフォルトの名無しさん
08/08/25 23:32:46
あと>>1otu
6:デフォルトの名無しさん
08/08/25 23:51:55
VBEってかなりイカスよな。なんていっても使いやすい。
これだけコンパクトに洗練されたIDEってほかにないだろ?
しかもお手頃。Excelに最初からついてくるんだぜ。
そんでExcelからマクロの記録とかやれば馬鹿でもチョンでもコードがかけるの。
こんな素晴らしい機能は他に類をみないよね。
もうビルゲイツさまさまってかんじ?
ろくにシェルスクリプトもかけないのにわざわざLinuxとか使ってる奴もったいねーw
とりあえずビルゲイツさまが提供してくださるOSとソフトウェアを使っていればいいんだよ。
7:デフォルトの名無しさん
08/08/26 00:00:04
釣りも乙
8:デフォルトの名無しさん
08/08/26 20:56:28
>前スレ985
ならんぞ。どういうパターンの話?
もしかして型変換起こしてるとか?
9:デフォルトの名無しさん
08/08/26 22:43:02
>970
です。
いろいろなことを教えていただきありがとうございます。
ひとつひとつやってみます。
またなにか聞くかもしれませんそのときはお願いいたします。
10:デフォルトの名無しさん
08/08/27 12:59:04
VBAで、構造体をTypeで定義する場合、変数を持たせることができるのは理解しています。
関数も持たせたいのですが可能でしょうか?
11:デフォルトの名無しさん
08/08/27 13:56:15
クラスじゃだめなの?
12:デフォルトの名無しさん
08/08/27 15:18:29
なるほど、クラスがありましたか!
ちょっと調べてみます。
13:デフォルトの名無しさん
08/08/27 22:06:17
シート上の特定の列にオートシェイプを1行ずつ(1セルずつ)表示したりすべて消したりするマクロを作りたいと思っています。
並べて表示させるのはなんとなくわかるのですが、すべて削除するマクロがわかりません。
その列以外にもオートシェイプがあるのでDrawingObjects.Delete は使えないと思いますし、
マクロを記録しながら、オブジェクトの選択を選んで消したい箇所をドラッグしてDELしても
ActiveSheet.Shapes.Range(Array("AutoShape 260", "AutoShape 261")).Select
Selection.Delete
とオートシェイプの番号を指定して削除しているのでマクロには使えなさそうです。
マクロで使えるオートシェイプの削除方ってありませんか?
14:デフォルトの名無しさん
08/08/27 22:19:54
key使えばよくね
15:デフォルトの名無しさん
08/08/27 22:50:39
>>14
もう少し詳しくお願いします。
16:デフォルトの名無しさん
08/08/28 00:40:08
座標をセルの幅と高さから計算してとりあえずシェイプの作成はできるよな。
んで作成時にkeyプロパティに座標(行,列)を文字列で格納しておくんだ。
あとはActiveSheet内のシェイプを走査して、特定の座標のシェイプを指定
して削除できると思うよ。
ActiveSheetの行or列orセルが削除されたらシェイプのkeyプロパティに格納
されている座標を更新する処理を加えれば完璧じゃね?
17:デフォルトの名無しさん
08/08/28 20:54:48
ページの書式設定をVBAでやると遅いですよね。
ExecuteExcel4macroでやると速いんですが、
書式が通常と全く異なるので記述が難しい。
順番が決まってるし、""で囲む部分とかどうやったら良いのやら。
誰か上手いこと解説して下さい。
18:デフォルトの名無しさん
08/08/28 22:37:59
subとfunctionについて教えてください。
何度も同じ処理をcallする場合に、処理を記述するのは、
sub と function、どちらにすべきでしょうか。
引数無しの記述なので、どちらで記述して呼び出しても同じ結果が出るのですが、
正しい使い方を覚えたいと思います。
よろしくお願いします。
19:デフォルトの名無しさん
08/08/28 22:39:39
戻り値があればFunction、なければSub以外にやり方があるのか?
20:デフォルトの名無しさん
08/08/28 22:40:42
subがいいよ
21:デフォルトの名無しさん
08/08/29 08:38:25
初めての投稿です。よろしくお願いします。
Excel でコンマおよび引用符を区切り文字としてデータをテキスト ファイルにエクスポートするマクロ
URLリンク(support.microsoft.com)
上記のようなマクロを求めています。
例えばexcel上に、
1 2 3
4 5 6
という表があれば、
"1","2","3"
"4","5","6"
というテキストファイルに吐き出したいのです。
例では、囲い文字='"' 、 区切り文字=',' としましたが、両方とも簡単に変更出来るとなお良いです。
どなたかとっかかりでも良いですからアドバイスを下さい。よろしくお願いします。
22:デフォルトの名無しさん
08/08/29 08:43:20
>>21
釣りじゃないなら、「名前をつけて保存」のcsvを飽きるほど試してみるんだ。
23:デフォルトの名無しさん
08/08/29 08:54:11
>>22
回答ありがとうございます。
保存形式にcsvを選べばカンマ区切りのテキストファイルが得られるのは知っていますが、
それでは囲い文字までは指定できないと思います・・・。
それとも私の知らない機能があるのでしょうか?
24:デフォルトの名無しさん
08/08/29 09:33:10
セルが文字列なら括られるべ。
25:デフォルトの名無しさん
08/08/29 10:27:01
>>24
セルの書式を文字列に変更してcsv形式で保存しましたが、
""で括られることはありませんでした。ごめんなさい。
ちなみにセルの内容自体を"1"などとしてcsvで保存すると、
なぜか"が増えて"""1"""となってしまいます。
EXCELの機能のみで実現できるのならばそれにこしたことはないのですが、
色々調べた結果、これはマクロを組まなければ実現できないみたいなんです。
どうか、マクロを使った方法を教えていただけないでしょうか?
私の足りない頭では、まずベタにcsvで吐き出した後、
テキストエディタを使って正規表現で , や先頭を置換していく方法しか分かりません。
1ファイルだけならそんなに手間はかかりませんが、大量のファイルを処理したい場合、
マクロを使えたら便利だと思い質問させて頂いてます。
26:24
08/08/29 10:46:51
ありゃ、ダメだっけ。そりゃ失敬。
んじゃ、1を'1にしたらどう?
# つーか、理由が判らんから喰い付きが悪いんじゃないだろか。
27:デフォルトの名無しさん
08/08/29 11:30:21
>>26
>んじゃ、1を'1にしたらどう?
書式を文字列にしたのと同じ結果で、""では括られませんでした。
># つーか、理由が判らんから喰い付きが悪いんじゃないだろか。
理由をお話ししますと。
仕事上、囲い文字付きのcsvファイルを良く扱うんです。
それはoracleデータベースから吐き出されたテキストデータなんですね。
"00","123","789"
"01","456","098"
上記のような形式のものです。
それを修正する時、テキストエディタで直接編集するのが難しい場合、
一旦excelに読み込ませてexcel上で編集するんです。
そのデータを再び上記のような形式に保存し、データベースに取り込むということをするんです。
その際、単にexcelでcsv形式で保存すると、囲い文字""が無くなってしまいます。
囲い文字""がないとうまくツールでデータベースにロード出来ないので困っているわけです。
単にただのcsvから囲い文字付きcsvに変換したいなら、
そのようなシェルスクリプトを作るなり、手動で置換するなり出来るのですが、
今回excelを使用しているので、マクロを使って自動化することに挑戦したいのです。
ヒントでもリンクでも構いません。とっかかりをどなたかご教示願います。
28:デフォルトの名無しさん
08/08/29 12:04:25
>>27
ファイル保存のコードを流用しているみたいですけど、すべての値を'"'で囲んで、,'で連結してファイルに書き出すコードを書けばいいですよ
囲い文字や区切り文字は変数にしとくと変更も簡単にできます
会社として問題がないならファイルを経由せずに直接DBを更新するとよいかもしれません
「excel oo4o」とかでぐぐれば参考ページが出てきたと思います
29:デフォルトの名無しさん
08/08/29 12:55:59
シート上のセルではなく、プロシージャ内で宣言したRange型変数の書式を
組込ダイアログボックスから操作することは可能でしょうか?
やりたいことは、
[書式]>[条件付き書式]で表示されるダイアログの
[書式(F)]ボタンをクリックしたときの動作を自作フォーム上で再現したいです。
よろしくお願いします
30:デフォルトの名無しさん
08/08/29 13:22:28
Excel2003からOutlook20033の
予定表に書き込む事はできます
でしょうか。
予定をExcelでガーッと書いて、
ポチッとOutlookに流し込みたいです。
MS Exchange serverを使ってます。
VBAについては初心者で、
「Excel Outlook VBA 予定」等でググってみたのですが
見つける事ができず・・・
もしサンプルコードがあればそれをもとに勉強させていただきたいと思っています。
31:デフォルトの名無しさん
08/08/29 20:20:33
>>30
Outlook20033はできない
32:デフォルトの名無しさん
08/08/29 21:38:52
エクセルスレから移動してきました。
【1 OSの種類 .】 WindowsXP
【2 Excelのバージョン 】 Excel2003
【3 VBAが使えるか .】 多少
【4 VBAでの回答の可否】 可
【5 検索キーワード 】 シート作成 ファイル名 付与
原本となるブックがあり
それを元に
Book1
Book2
Book3
Book4
・・・
と任意の数だけブックを任意のフォルダに作成し
かつブック名に日付(8月1日、8月2日・・)と付けて作成する方法を
教えてください。
参考になりそうなサイトでも構わないです。
よろしくお願いします。
33:デフォルトの名無しさん
08/08/29 21:45:36
>>31
あぁ!?そうなんですか!?
ほかのバージョンではできるんでしょうか?!
かいかえようかなぁ・・・
34:y
08/08/29 22:05:49
>>32
「FileCopyステートメント」で検索してみてください。
35:y
08/08/29 22:39:09
>>29
「プロシージャ内で宣言したRange型変数の書式」とありますが、
宣言された時点でのRange型変数は、まだどこのセルを指すか
決まっていないため、書式を設定することはできません。
Range型変数に任意のセル範囲をSetした上で、そのセル範囲の
条件付書式の書式をVBAで設定する方法を、ということでしたら、
まずは条件付書式設定の作業を「マクロの記録」(>>1 ★6)を
使ってコード化し、「Selection」となっているところを任意のセル範囲
に対する操作になるよう書き換えてください。そうして出来上がった
コードを、自作フォーム上のコントロールのイベントプロシージャから
呼び出すようにすれば、自作フォームから操作できます。
始めに「組込ダイアログボックスから操作する」とあり、
後で「自作フォーム上で再現したい」とありますが、
組み込みダイアログボックスと自作フォームは別物です。
おそらく「自作フォーム」のつもりだと思いますが、
混同しないよう気をつけてください。
36:デフォルトの名無しさん
08/08/29 22:49:23
>>32
マクロを記録して、やりたいことやってみろ
37:デフォルトの名無しさん
08/08/29 23:36:33
>>33
そもそもOutlook20033なんてない。
38:デフォルトの名無しさん
08/08/30 19:44:37
Excel20033はあるよ
39:y
08/08/30 21:14:32
Outlook20033の検索結果 5 件中 1 - 5 件目 (0.39 秒)
Excel20033の検索結果 8 件中 1 - 8 件目 (0.15 秒)
40:デフォルトの名無しさん
08/08/30 23:17:12
うちはExcel2003.3だけど
41:デフォルトの名無しさん
08/08/31 02:30:40
>>15はできたの?
42:デフォルトの名無しさん
08/08/31 03:15:03
【1 OSの種類 】 WindowsXP
【2 Excelのバージョン 】 Excel2000
【3 VBAが使えるか 】 皆無
【4 VBAでの回答の可否 】 可
【5 検索キーワード 】 VBA プログラム
現在VBAを勉強し始めたばかりなのですが、9/1までに提出しなければいけない問題があり困ってます。
丸投げとなってしまうのですが、もしよろしければお知恵をお貸しください;
EXCEL名:テンプレート Sheet名:[Sheet1][Sheet2]
CommandButton:[Cmd] 補足:三行目以降にデータが入っている。
ACCESS名:ユーザー テーブル名:T_TOUROKU
フィールド名:[No.][Name][Adr][Tel]
補足:データは数百件入っている。 SELECT文があるとまとめやすいようです。
VBAのDAOを使用して、テンプレ−ト上の[Cmd]ボタンを押すと、
@Sheet1のCell(B)列に書かれた内容と[Name]を比較、
A一致すれば次にCell(A)列と[No.]と比較し,変更のある箇所をSheet1の内容へと更新。
B見つからなければ、新規として追加する。
C又、変更があったものは[Sheet2]へコピーもする。
簡潔に言えば、
名前を主キーとして、EXCELの内容をACCESSへ書き込み・更新をして変更ログを
Sheet2へ書き込みたいのですが、自分の知識ではどのようにコーディングすればいいのか
全然判らないので、よろしくお願いします。。。
43:デフォルトの名無しさん
08/08/31 06:07:21
>>42
>>1★5
「なつやすみのしゅくだい」はじぶんでやりましょう
44:デフォルトの名無しさん
08/08/31 07:18:59
ぎりぎりまで放っておくのが悪い
45:デフォルトの名無しさん
08/08/31 08:56:12
グループ化されたオートシェイプを解除して
テキスト変更して再グループをして終了させたいのですが
これだとその都度グループ番号が変わっちゃって使えません><;
他にいい指定方法ありませんか?
ActiveSheet.Shapes("Group 526").Select
Selection.ShapeRange.Ungroup.Select
ActiveSheet.Shapes("Rectangle 101").Select
Selection.Characters.Text = "ほげ1"
ActiveSheet.Shapes("Rectangle 126").Select
Selection.Characters.Text = "ほげ2"
ActiveSheet.Shapes("Rectangle 127").Select
Selection.ShapeRange.Regroup.Select
Selection.Characters.Text = "ほげ3"
46:デフォルトの名無しさん
08/08/31 10:28:55
>>42
URLリンク(www.amazon.co.jp)
47:y
08/08/31 11:07:20
VBA経験が「皆無」という生徒に、ExcelVBAでDAOを用いMDBに接続してデータを取得・更新する、
という課題は荷が重すぎるような...。>>42の学校ではどういうカリキュラムでVBAを教えているのか
わかりませんが、最低限その課題を解くために必要な授業を受けるか、必要な説明が書かれた
テキストが配布されているなら、とにかくそれらを参考に自分で何かコードを書いて、
再度質問してみてください。
48:デフォルトの名無しさん
08/08/31 11:36:11
んな、難しいもんでもないような。
1日ぐぐって、サンプル試すだけでできるようなるっしょ。
49:デフォルトの名無しさん
08/08/31 11:43:56
>>47
あんた優しいな。
経験皆無なわけないじゃん。
>>42が授業聞いてないだけだよ。
50:y
08/08/31 11:48:33
>>45
GroupItemsプロパティから、そのグループに含まれているすべてのシェイプのコレクションを取得できます。
グループを解除する前に、その情報をCollection型変数にでも保管しておいて、
それぞれのテキストを書き換えた後、その情報をもとに再びグループ化すれば、グループ名を使わずに実現できます。
>>48, >>49
情報系の学生で、ちょっとでも他の言語の経験があれば何とかなるかも
あとは>>42の頑張り次第ですね。
51:デフォルトの名無しさん
08/08/31 12:28:05
参考書とか期限みたら意味ないことくらいわかるでしょ
コードくれよ
52:デフォルトの名無しさん
08/08/31 12:32:00
納期〆切寸前の苦しみを自力できりぬけんのが一番の経験だからな。
おまえのことをおもって、今後誰もレスをせんだろうな。
53:デフォルトの名無しさん
08/08/31 13:11:22
yウゼー
54:y
08/08/31 13:46:53
>>41
それについて私も気になってました。>>16に書いてある方法を自分でも
調べていたんですが、シェイプに「keyプロパティ」ってあるんでしたっけ?
オブジェクトブラウザで探しても見つかりません。
55:45
08/08/31 15:17:38
質問を変えます。
複数のグループ化されたオートシェイプのうちの一つを指定するのに
ActiveSheet.Shapes("Group 526").Select のようにではなく、例えばRange("B5")の上に掛かってるグループを指定する、
というような方法はありますか?
シートもどんどん複写して使いますので名前やインデックスだと手に負えない気がします。
56:デフォルトの名無しさん
08/08/31 15:59:55
>>53
役に立ちそうで立たないからな。
57:デフォルトの名無しさん
08/08/31 17:56:34
コテつけてくれてるんだから見たくない奴はNG指定しろ
それすらできないなら文句言うな
58:デフォルトの名無しさん
08/08/31 22:36:57
>>16
>>54
keyプロパティはないけどidプロパティでシェイプを特定できるから、(id,座標)のような配列や
コレクションを用意しておいて座標<->シェイプの関連づけをすれば解決するんじゃないかな。
59:デフォルトの名無しさん
08/09/01 03:45:00
>>55
TopLeftCell プロパティとか BottomRightCell プロパティを利用するのだと思います
60:デフォルトの名無しさん
08/09/02 00:34:42
Excel.Excel.Excel
61:デフォルトの名無しさん
08/09/02 00:49:54
顧客名簿を作ったのですが、2000件近くなり電話番号で検索できるようにしたいと思っています
で、ユーザーフォームで「電話番号入力」欄を作り、そこに電話番号を入れて「検索」ボタンを押すと、
電話番号が一致した「顧客名」、「住所」を同じユーザーフォームに表示するようにしたいのですが、
どんなコードを使うと良いのかヒントを教えていただけませんか?
シートには、
A B C D
顧客名 電話番号 住所1 住所2
1 あいだ 090xxxxxxxxx 東京都 杉並区
2 いとう 080xxxxxxxx 北海道 札幌市
という風に記入しています
B1の電話番号「090xxxxxxxx」を「電話番号入力」欄に入れて「検索」ボタンを押すと
「顧客名」 あいだ
「住所1」 東京都
「住所2」 杉並区
という風に表示できるようにしたいのです。
Excelは、2000
OSは、Winddows XP SP3です
62:デフォルトの名無しさん
08/09/02 00:51:35
いちおうユーザーフォームを使って形だけは作って、
「検索」ボタンを押すと該当するデータがない場合にメッセージが出るようにはしたのですが、
そこから先が(というか、ほとんど進んでいないのですが)見当がつきません
63:デフォルトの名無しさん
08/09/02 02:35:21
Findで電話番号を検索して行位置を取得
あとはCellsでデータを取ればいい
64:デフォルトの名無しさん
08/09/02 18:47:07
ChDir ThisWorkbook.Path
Chdrive ThisWorkbook.Path とやって作成した奴を
他人のPCで実行させても同じフォルダ内のファイルを探せなくてエラーが出ます。
デスクトップのフォルダで動作させても
msgbox ThisWorkbook.Pathでは〜¥Tempとなっています。
ユーザー設定のカレントは空白にしても変わりません。
XPの2003で作成し、会社の2007では動作しましたが他のPCのXP、2003で発生します。
どのように対処すべきですか?
65:デフォルトの名無しさん
08/09/02 20:52:52
日本語でおk
66:64
08/09/02 22:13:35
要は、デスクトップで起動させたブックのThisWorkbook.Pathが
なぜ関係ないC:\〜¥〜¥Tempになってしまうのか?ってことです。
67:デフォルトの名無しさん
08/09/02 23:44:42
>>64
OfficeXP・2003からOffice2007にアップグレードすればおk
68:デフォルトの名無しさん
08/09/03 19:41:38
EXCEL2007です。
以下のコードで、実行時エラー1004「アプリケーション定義または
オブジェクト定義のエラーです」になります。
何が原因でしょうか。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim o16 As Integer
Dim o1 As Integer
Dim rgbnum As Integer
r = Target.Row
c = Target.Column
省略
rgbnum = o16 * 16 + o1
Range(Cells(r, c - 1), Cells(r, c - 1)).Value = rgbnum ←ここでエラー
End Sub
69:デフォルトの名無しさん
08/09/03 21:50:31
cがゼロになってるとか
70:デフォルトの名無しさん
08/09/03 21:51:17
cがゼロじゃなくて、cが1だからCells(r, c - 1)が存在しないとこを参照してるってことね
71:デフォルトの名無しさん
08/09/03 23:46:30
VBAを1週間前から勉強していて、すごーく簡単なプログラムは作れるようになったのですが、
いまいち理解しているのかどうかがわかりません。
勉強の仕方はネットで調べながら・・・なのですが、
みなさんはどのように勉強してましたか?
課題をもらえるとやりやすいのですが、一人でやってると自分が何をしているのか
わからなくなります。覚えるコツなどありましたら教えてください。
72:デフォルトの名無しさん
08/09/03 23:53:34
>>71
興味あるものを作るところから始めたら?
仕事なら、覚えるしかないからかえってそういう事を悩まずにすむけど。
73:デフォルトの名無しさん
08/09/03 23:57:43
>>71
おれはシューティングゲーム→ギャルゲー→RPGと作って
無駄な時間をすごした。
74:デフォルトの名無しさん
08/09/04 03:13:53
俺はVB→ExcelVBAだったから特に勉強とかしてないけど、
VBは最初はいろんな小物ツールとかつくって覚えたなぁ。
75:デフォルトの名無しさん
08/09/04 03:29:37
ExcelVBAだったらExcelオブジェクトを理解することが重要だけど、
VBA全体を勉強したいならWin32APIやWindowsCOMオブジェクト
についても勉強する必要があると思うなぁ。
最初はコードが公開されているサンプルを眺めたり流用して何か
役に立つものを作ったらいいと思う。その内にコードが公開されて
いないけど実現したい機能とかも自力で作成できるようになるよ。
Officeだったらコードが公開されていなくてもパスワードクラックの
ツールがあるからそれ使ってちょっと高度なコードにも目を通すと
いいかも。
76:デフォルトの名無しさん
08/09/04 03:57:22
結局ダジャレかよ
77:デフォルトの名無しさん
08/09/04 11:53:25
>>71
質問掲示板の「回答者」になるのが良いでしょう。
どの掲示板が良いかは自分で判断して下さい。
別に書き込まなくても良いので、色々な方のコードと自分のコードを比較する事が勉強になる。
78:デフォルトの名無しさん
08/09/04 16:15:58
VBAでオブジェクト指向プログラミングできるの?
79:デフォルトの名無しさん
08/09/04 18:43:38
むしろ、VBAはOO言語だろ
80:デフォルトの名無しさん
08/09/04 19:18:16
まあOO言語としてはかなり不完全だけど
分類的にはOO言語寄りではあるな
81:68
08/09/04 19:49:36
>>69,70
レスありがとうございます。
cはゼロにも1にもなっていないですが・・・。
82:デフォルトの名無しさん
08/09/04 20:41:23
1つのセルが対象なのにrangeで範囲選択してんの?
83:デフォルトの名無しさん
08/09/04 20:45:17
いいじゃまいか
84:デフォルトの名無しさん
08/09/04 21:56:37
うーん。出先なんで確認取れないんだけど、
sheets(hoge).range(
の形でどうかな?
sheet changeイベントで、rangeオブジェクトが保持してるシート名が対象rangeと異なるからエラー出してるとか。
適当だけどw
85:デフォルトの名無しさん
08/09/04 22:23:24
>>71
体系だった入門書を通読しろよ、糞ゆとりが
86:デフォルトの名無しさん
08/09/04 22:44:22
cellsに修飾が足りないな、きっと
87:デフォルトの名無しさん
08/09/04 23:45:43
>>68
cに1が入った場合の処理をしていないから
Changeイベントループして最終的に >>70の言う事になってるだけ
88:デフォルトの名無しさん
08/09/05 00:09:51
toggleMerge("A1:A5")
という命令でA1:A5の範囲のセルを結合させたり結合解除させたいのですが、
実行させても何も起こりません。エラーすら起こりません。
ばらして同様のことをやるとちゃんと動きます。何が悪いのでしょうか。
以下そのコード
Sub toggling(ByRef obj As Variant)
obj = Not obj
End Sub
Sub toggleMerge(ByVal str$)
toggling Range(str).mergeCells
End Sub
89:デフォルトの名無しさん
08/09/05 00:35:04
スレ違いとは思うのですが助けてください
モジュールで有効な変数宣言しようとすると
Dimとか打ってたらエラーダイアログが0.2秒ぐらいで6連続くらい連発して打ち切れない
Excel2008なんだけど構文チェックスピード早すぎて打てない
どうしたらいいのか教えて頂けないでしょうか
90:デフォルトの名無しさん
08/09/05 00:46:23
>>68
"c"にミスがないのであれば
Sheets(hoge).Range((Sheets(hoge).Cells(r, c - 1), Sheets(hoge).Cells(r, c - 1)).Value = rgbnum
↑のようにしてみてはいかがか
91:デフォルトの名無しさん
08/09/05 00:50:36
すみませんが
スレリンク(slotj板)
のスレで確率についてバトルしています
問題はサイコロで1が8回連続して出る確率です
バカが多すぎて疲れました
頭の良い皆様、論破してください
お願いします
92:デフォルトの名無しさん
08/09/05 01:15:08
>>90
Worksheet_Changeイベントに記述しているから
セルに値を入れる前にイベント発生を止める処理を入れるか
cが0にならないようにする処理を入れないと
Changeイベントが連鎖してエラーになる
93:デフォルトの名無しさん
08/09/05 01:20:01
>>89
めっちゃ早く打つ
94:デフォルトの名無しさん
08/09/05 01:28:59
質問するのは全然かまわないんだけどさ、質問スレだからな。
でもさ、質問する前に日本語で質問できるようになってから来いよな。
たのむから。
95:デフォルトの名無しさん
08/09/05 02:00:19
>>92
なるほど。ちょっと賢くなりました。
96:68
08/09/05 08:57:53
みなさん、レスありがとうございます。
cが特定の値の時にしか、
セルに値を入れないようにしたら
うまくいきましたm(__)m
97:y
08/09/05 17:45:41
>>88
おやっ、と思うようなコードですね。
たぶん、MergeCellsプロパティの「実体」を、togglingプロシージャに
参照渡しして、そこからプロパティを操作しようと考えたのでしょうか。
偶然かもしれませんが、なかなか珍しい間違い方をしていると思います。
toggling Range(str).MergeCells
というコードは、
@MergeCellsプロパティを読み出した結果得られた値について、
Aその値をtogglingプロシージャに渡す、
という2段階の処理として実行されます。単純に
「MergeCellsプロパティを、togglingプロシージャに渡す」
わけではありません。
Range(str).MergeCells で取得できるのは、プロパティの実体ではなく、
実体を読み出した結果であり、"True"もしくは"False"というただの値です。
この時点で、実体との関係は断たれてしまっているので、
その値をtogglingに参照渡しして、それを反転させても、
プロパティそのものを操作することにはなりません。
プロパティを操作する場合は、次のように直接操作するようにしてください。
Sub toggleMerge(ByVal str$)
Range(str).MergeCells = Not (Range(str).MergeCells)
End Sub
98:y
08/09/05 18:04:43
>>89
何をした瞬間エラーメッセージが出た、というあたりをもう少し詳しく。>93w
>>58
ありがとうございます。やっぱりKeyプロパティはないんですね。
99:デフォルトの名無しさん
08/09/05 20:14:32
何言ってんだこいつ
100:デフォルトの名無しさん
08/09/05 23:31:49
>>97
どうもありがとうございます。
Boolean型のオブジェクトを渡していたからだったのですね。
でもできれば、汎用的にtoggleプロシージャをつかって実装したいです。
Sub toggle(ByRef obj As Variant, ByVal propertyName$)
obj.propertyName = Not obj.PropertyName
End Sub
という感じです。
そこで、新たに質問なのですが、”.”を使わずにプロパティを参照するには
どのようにすればいいのでしょうか。
たとえば、Javascriptだとobj["PropertyName"]でプロパティ参照できるのですが、
VBAには類似の呼び出し方法は存在しているのでしょうか。
101:デフォルトの名無しさん
08/09/05 23:43:02
ちょっと早めに知りたいので、
スレリンク(bsoft板)l50x
こちらのほうでも同様の質問をしようと思います。
マルチポストはするな、といわれたくないため、先に宣言しておきます。
102:デフォルトの名無しさん
08/09/05 23:50:31
VBAではインクリメントは a = a+1 と記述するしかないですか?
a += 1
a ++
はだめでした。
(下は別言語なので当然ですが・・・。)
103:デフォルトの名無しさん
08/09/06 00:39:09
>>100
CallByName
>>102
諦めろ。
104:デフォルトの名無しさん
08/09/06 01:25:11
hint : overload
105:デフォルトの名無しさん
08/09/06 02:05:01
A列のセルに入力があればA列の中で同じ入力がないか検索する
というマクロを作ろうと思っているのですが、セルの入力判定の方法を教えていただけないでしょうか?
宜しくお願いします。
106:デフォルトの名無しさん
08/09/06 03:17:52
もっと具体的に
107:105
08/09/06 07:39:52
説明が抽象的になってしまいすいません。
A列からF列までそれぞれの列に情報を入力してリストを作っているのですが、
既に何百行も情報を入力していて、都合上同じ情報を追加で入力してしまう恐れがあり、
現在は毎回入力の前にCtrl+Fの検索で既に入力された情報かどうか調べています。
そこでA列のセルに入力があれば入力されたセルより上の既に入力された全てのセルの文字列と比較して、
既に同じ入力があればエラーメッセージを出すというマクロを作りたい次第です。
マクロを作成するにあたって、「A列に入力があれば」という部分をどう書けばいいかわからなかった為質問させていただきました。
A列に同じ情報が入力されるという事は都合上絶対に有り得ない事なのでA列のセルを比較しようと考えています。
・A列には1行目から空白なく順番に情報が入力されている。
・新規に入力する際は現在のリストの最終行の次の行に情報を入力している。
という条件があるので、A列に入力があればというよりA列の最終行の次の行に文字が入力されればという方が正しいかもしれません。
説明が下手で申し訳ありません。
宜しくお願いします。
108:デフォルトの名無しさん
08/09/06 09:22:13
>>107
Worksheet_SelectionChange
109:デフォルトの名無しさん
08/09/06 09:27:52
リアルタイムのイベントハンドラかぁ・・・。
VBAって自分でイベントの作成は出来るのかな。あまり詳しくないんで分からないや:(
若干重くなるけど、sheetのchangeイベントで、セルを移動した時に、A列の最終行の内容と同じ物をチェックするとか。
うーん・・・あまり美しくないよね。
自分でイベント作成出来るのか、私も知りたいです。
詳しい人お願いします。
110:デフォルトの名無しさん
08/09/06 10:56:04
>>103
ありがとうございました。
111:105
08/09/06 14:30:52
>>108,109
アドバイスをくださってありがとうございます。
参考にマクロを組んでみようと思います。
112:デフォルトの名無しさん
08/09/06 14:45:53
>>107
重複データがあるかないかを調べるだけでよければ
VBA使わなくても条件付き書式でできる。
113:デフォルトの名無しさん
08/09/06 16:14:55
Excelの VBA の関数の呼び出し方法が分かりませんので、誰か教えて戴けませんでしょうか?
C では
// 関数の定義
void abc(void)
// メインルーチン
void main(void)
{
// 関数名
abc();
}
void abc(void)
{
---
}
上記の方法で関数を呼び出そうとして、
Sub 名前()
abc()
End Sub
:abc()
---
return
上記記載の方法では動きませんでした。
素人な問い合わせで申し訳ありませんが宜しくお願いします。
114:デフォルトの名無しさん
08/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
115:デフォルトの名無しさん
08/09/06 17:04:48
<<114
113 です。早速のお教え有難う御座います。
なんらか値を返す様に変更します。
116:デフォルトの名無しさん
08/09/06 17:10:04
>>113のCのコードを何も考えずにVBAにするとこうだぞ。
Sub main()
Call abc()
End Sub
Sub abc()
---
End Sub
戻り値の型がvoidの関数はSub、それ以外はFunction。
戻り値を受け取らない場合、Sub/FunctionにかかわらずCallを付ける(Call使わない記法もあるけど)。
117:デフォルトの名無しさん
08/09/06 17:30:42
>>116
113 です。いろいろお教え戴き有難う御座います。
この方法が簡単なので採用させて戴きます。
118:デフォルトの名無しさん
08/09/06 18:07:40
>>114
>>116
113 です。プログラム作成途中ですが、両方とも必要になりましたので、
共に採用させて戴きます。いろいろと、有難う御座いました。
119:デフォルトの名無しさん
08/09/06 21:14:05
スレリンク(tech板:878番)
120:デフォルトの名無しさん
08/09/06 23:37:07
関数は、なんらかの値をかえすべきであるという考えた方が
身に染み付いてるから、SubとVoid関数は非常にきもちわるい。
121:デフォルトの名無しさん
08/09/06 23:38:23
要するに時代遅れですね
122:デフォルトの名無しさん
08/09/07 00:36:46
かえり値もたない関数は、デバッグがむずかしくなるから、医療系の俺の会社じゃ
よほどのことがないかぎり作らない。むしろ121がしろうと
123:デフォルトの名無しさん
08/09/07 00:52:19
>>122
VBAスレで恥ずかしい事いうなよおっさん。
124:デフォルトの名無しさん
08/09/07 01:49:03
LispとかMLでの話なら>>120>>122も分かるが、
VBAで純粋関数型プログラミングは無茶があるだろ、常識的に考えて。
125:89
08/09/07 03:31:47
むっちゃ早く打つ案に似た解決策で自己解決しました。
必殺コピペです。
グローバルエリアに変数定義しようとしたらDimと打った時点でエラーメッセージが頻発
変数書こうとしても打っている途中でメッセージ頻発して書けない。
どこかにエラーチェックのタイミングプロパティがあると思うがコピペで解決したから諦めようかと思います
126:デフォルトの名無しさん
08/09/07 07:55:30
そういや、functionしか存在しない言語もあるな。
127:デフォルトの名無しさん
08/09/07 10:23:41
よくいるんだよね。VBにしかVariant型がないと思ってる自称上級者
128:デフォルトの名無しさん
08/09/07 14:27:52
ファイルを開かずにアクティブシートを変更するにはどうしたら良いでしょうか。
AccessのTransferSpreadsheetでエクセルの任意シートへデータを出力していますが、
エクセルファイルを開いた時に、値を出力したシートがアクティブになっているようにしたいのです。
129:128
08/09/07 14:30:04
ついでに読み取り専用属性の操作もできればサイコーです
130:デフォルトの名無しさん
08/09/07 14:45:07
please tell ass in Japanese...
Sheets("hoge").Activate
Sheets("hoge").SaveAs "c:\hoge.xlsx", xlWorkbookNormal, , , True
131:128
08/09/07 15:15:51
えー、ファイルを開かない状態でアクティブシートを変更したいのです。
そのやり方だとインデックスエラーになっちゃうんですけど。
132:デフォルトの名無しさん
08/09/07 15:26:27
Excelオブジェクト生成
ファイルオープン(非表示)
シートをアクティブにする
保存
133:デフォルトの名無しさん
08/09/07 15:30:41
ここっていちいち一から百まで説明しないといけないから疲れるな
結局ファイルを開かなきゃいけないってことですね。どうもありがとうございました。
134:デフォルトの名無しさん
08/09/07 15:39:47
偉そうに言ってますな w
135:デフォルトの名無しさん
08/09/07 15:45:40
そりゃそうだ。エスパーなんてここにはいない。
136:デフォルトの名無しさん
08/09/07 15:46:46
ここの奴らほとんど、ろくな知識も無いのに
知ったか振っててうざいんだもん
これぐらい言わせなよ
137:デフォルトの名無しさん
08/09/07 15:51:18
うわぁ・・・低脳すぎて煽るきにもならない
138:128
08/09/07 15:52:01
あと別におまえらがエスパーである必要はねーけど
言われた事から、相手がなぜそうしたいのか、ではどういう方法が適切かくらい想像しろよ、と思うね
おまえら自分の知ってることが唯一の回答であるようにこじつけてるだけだろ。
そういうのをバカの一つ覚えって言うんだよ。
でも回答ありがとう。じゃね。
139:デフォルトの名無しさん
08/09/07 15:52:32
っていうかxlsファイルを開くのとExcelのGUIを開くのを同じことだと思っている低脳っているんだね
140:>137
08/09/07 15:53:30
じゃあ書くなよウスノロw
141:デフォルトの名無しさん
08/09/07 15:53:47
うわぁ・・・ひどい池沼ですね・・・
142:デフォルトの名無しさん
08/09/07 15:55:07
日本語で質問できるようになったら書き込みしような。
143:デフォルトの名無しさん
08/09/07 15:56:22
高卒とかFランは書き込みできないようなフィルタかけてくれよ
144:デフォルトの名無しさん
08/09/07 15:59:21
盛り上がってますね
145:デフォルトの名無しさん
08/09/07 16:01:56
>>133
最低限1から5くらいまで説明しようぜ。
俺らお前のお母さんじゃないんだからよ。
146:デフォルトの名無しさん
08/09/07 16:02:48
というより、
出来ないことは出来ないと説明した上で代替案を示すなら
ここまで荒れないと思うのだが。
条件に反することを回答するからこうなる
147:デフォルトの名無しさん
08/09/07 16:03:39
>>132
でできると思うぜ。
148:デフォルトの名無しさん
08/09/07 16:10:34
>>145
えっ?
>128を1から5くらいの説明で理解できるのか?
最近のお母さんてスペック高いんだな!
149:デフォルトの名無しさん
08/09/07 16:11:33
OBJ.FileOpenは知ってたけどコードがごちゃごちゃするから嫌いなのよ。
他にもっとシンプルなやり方が無いのかな、って思っただけ。
150:デフォルトの名無しさん
08/09/07 16:12:30
>>147
非表示だけど、ファイル開いてるからNGだろ。
想像力のない俺からすれば、元の質問自体がNGだけどな。
151:デフォルトの名無しさん
08/09/07 16:13:04
変な知ったかいいわけ始めたぞ
152:デフォルトの名無しさん
08/09/07 16:14:32
ファイル開かずにファイルを変更するなんて方法があったら俺が知りたいな
153:デフォルトの名無しさん
08/09/07 16:16:31
128ってそんなに難しいか
まさかとは思うがプログラム板なのにAccessのVBAを知らん奴がいるのか
154:デフォルトの名無しさん
08/09/07 16:20:31
簡単だぞ。質問がヘタなだけ。で質問の答えに対して実装できるスキルもないだけ。
155:デフォルトの名無しさん
08/09/07 16:23:38
要するに低脳というわけですね。分かります。
156:デフォルトの名無しさん
08/09/07 16:24:49
盛り上がってますなあ
157:128
08/09/07 16:38:58
結局お前らAccessVBAが理解できなかっただけ佳代w
低能エクセル厨乙w
158:デフォルトの名無しさん
08/09/07 16:49:47
スレタイ100回音読してみろ。
それから自分の質問と回答を100回音読しろ。
159:デフォルトの名無しさん
08/09/07 16:56:43
下手な釣りだなあ。次の質問どうぞ。
160:デフォルトの名無しさん
08/09/07 18:49:05
>>128
が見えない
161:デフォルトの名無しさん
08/09/07 20:20:00
excel vba 極めたいのですけど
お勧めの参考書はありますか?元制御系プログラマで
プログラミングの基本は充分できています。
技術評論社のポケットリファレンスはどうですか?
162:デフォルトの名無しさん
08/09/07 20:25:06
便乗質問・・・。
win32APIを勉強したいのですが、お勧めの本ってありますか?
使用目的はExcel VBAで呼び出す事です。
163:デフォルトの名無しさん
08/09/07 20:29:47
Excel VBAによるWin32 APIプログラミング入門 (単行本)
ぐぐることも出来ないの?
164:デフォルトの名無しさん
08/09/07 23:32:31
質問者も回答者もバカが多いな
165:デフォルトの名無しさん
08/09/08 00:05:08
お前ほどじゃないがな
166:デフォルトの名無しさん
08/09/08 03:03:14
だな
167:デフォルトの名無しさん
08/09/08 03:08:05
157 名前:128[] 投稿日:2008/09/07(日) 16:38:58
結局お前らAccessVBAが理解できなかっただけ佳代w
低能エクセル厨乙w
こいつリアルでもこんな感じなんだろうな
168:デフォルトの名無しさん
08/09/08 07:45:44
>>162
マジレスするとWin32APIの為に本を買うのはもったいない。
MSDNとネット上のAPIサンプル集とかで十分。
169:デフォルトの名無しさん
08/09/08 19:00:04
URLリンク(detail.chiebukuro.yahoo.co.jp)
上のようなことの逆は可能ですか?
例えば、セルAに映画のタイトルが縦に並んでて、
セルBにはその映画の詳細が見れるHPアドレスが沢山並んでます。
セルBのそれぞれのアドレスを、セルAに一括でハイパーリンクさせる(埋め込む)
方法が知りたいです。
ご教授、宜しくお願い致します。
170:デフォルトの名無しさん
08/09/08 19:41:35
スレリンク(bsoft板:238番)
171:デフォルトの名無しさん
08/09/08 20:08:18
>>170
循環参照になってる
172:デフォルトの名無しさん
08/09/08 20:09:26
笑!
173:y
08/09/08 20:21:47
>>169
セルB1にあるアドレスを、セルA1にハイパーリンクとして埋め込むのは、
次のようにすればできます。
Sheet1.Hyperlinks.Add Anchor:=Cells(1, "a"), _
Address:=Range(1, "b"), _
TextToDisplay:=Cells(1, "a").Value
(マクロの記録を使って、ハイパーリンクを埋め込む動作を記録してみれば簡単です)
これをループで括って、「1」となっているところ(これは行番号にあたります)を
変えていけば、お好みの行数分操作できます。
174:y
08/09/08 20:25:13
あ! すみません。
169はマルチポストだったんですね。
気づかずに答えてしまいました。
>>169
Wikipedia項目リンク
一度ここを読んでおいてください。
175:デフォルトの名無しさん
08/09/08 20:29:35
> Range(1, "b")
?
176:y
08/09/08 20:29:41
さらに自分のレスの間違いに気づきました。
Address:=Range(1,"b") → Address:=Cells(1,"b")
177:169
08/09/08 21:03:00
>>173 マルチ悪かった。
ツール→マクロ→VBA→標準モジュールに保存した後、
マクロ実行してみたけどできません。
初心者なんでもう少し詳しく教えていただけませんか?
178:169
08/09/08 21:54:01
1行だけできましたけど、
行数分操作ができません。
Cells(1, "a"),
1の部分の範囲指定はどうすればいいの?
179:169
08/09/08 21:55:21
できればセルを範囲指定して、マクロ実行で
一括で変更できると助かります
180:デフォルトの名無しさん
08/09/08 22:01:32
ググレ
181:デフォルトの名無しさん
08/09/08 22:27:39
>>180
いろいろ調べてもわからねぇよ
質問スレなんだから聞いてるんだろ。。意地悪しねぇで教えろよ。
その気がないなら返信するな
182:デフォルトの名無しさん
08/09/08 22:45:30
>>179=>>169=>>こないだの池沼
な
183:デフォルトの名無しさん
08/09/08 22:46:16
>>181=>>179=>>169=>>こないだの池沼
184:デフォルトの名無しさん
08/09/08 23:16:26
モーグでも行けよ池沼
185:デフォルトの名無しさん
08/09/08 23:40:48
で、また169が暴れるのか?
186:デフォルトの名無しさん
08/09/08 23:43:52
>>181=>>179=>>169=>>184=>>こないだの池沼
187:デフォルトの名無しさん
08/09/09 01:33:11
XMLファイルをVBAで扱いたいんですけど、そういった方面を勉強できるような書籍はないでしょうか。
「XML入門」みたいな本はたくさん見るんですけど、あれって具体的なコーディングについては記述が無いorごく少ないですよね。。。
あってもPHPとかばっかりだし。。。
188:デフォルトの名無しさん
08/09/09 08:48:08
書籍があってもバカじゃどうしようも無い
まともな頭があればVBAでCOM(XMLDOM)使ってXML扱うくらい、
ネットの情報だけで事足りる
189:デフォルトの名無しさん
08/09/09 10:31:32
あるセルからあるセルまでソルバーを使うということをやりたいのですが、
↓のを作ったのですが、出来ません。どうすればいいですか?
SOLVERの参照設定はやりました。
Sub Macro1()
Dim x As Integer
For x = 1 To 5
Range("Cells(x, 3)").Select
SolverOk SetCell:=Cells(x, 5), MaxMinVal:=3, ValueOf:="0", ByChange:=Cells(x, 2)
SolverSolve Userfinish:=True
Next x
End Sub
190:y
08/09/09 19:35:50
>>177
173の後半を、もう少し具体的に書きます。
まずループ用の変数rを宣言し、ここでは例として
For 〜 Next間を5回繰り返すループを示しておきます。
Dim r as Long
For r = 1 to 5
Sheet1.Hyperlinks.Add Anchor:=Cells(r, "a"), _
Address:=Cells(r, "b"), _
TextToDisplay:=Cells(r, "a").Value
Next
繰り返しのたびに、rは1, 2, 3, 4, 5と変化していくので、
上のコードでは1〜5行目に対する操作が行われることになります。
初心者の方なら、「VBA デバッグ」などで検索してみて、この過程を
一つ一つ目で確認する方法を身につけると、上達が早くなります。
For r = Inputbox("開始行?") to InputBox("終了行?")
とすれば、処理をしたい行の範囲を簡単に指定できますが、
もっと便利にしたければ、自分でも他の方法を色々調べてみてください。
質問する時は、どんなに間違っていてもいいので、とにかく何か自分なりに
調べて考えたコードを貼って、それに対するアドバイスを求めた方がいいですよ。
181のようなことを書くと、>>1の★5にあるように、「また丸投げか」と
怒りを買ってしまいます。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4840日前に更新/261 KB
担当:undef