Excel VBA質問スレ Part8at TECH
Excel VBA質問スレ Part8 - 暇つぶし2ch2:デフォルトの名無しさん
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]を比較、
 ②一致すれば次にCell(A)列と[No.]と比較し,変更のある箇所をSheet1の内容へと更新。
 ③見つからなければ、新規として追加する。
④又、変更があったものは[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プロパティを読み出した結果得られた値について、
②その値を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
URLリンク(ja.wikipedia.org)
一度ここを読んでおいてください。

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にあるように、「また丸投げか」と
怒りを買ってしまいます。

191:y
08/09/09 20:01:47
>>189

マクロの記録を使って、ソルバーでやりたい作業をマウスでやってみて、
どんなコードが記録されるか確かめてみてください。(>>1★5)

189のコードについては、
①単純な構文ミス Range("Cells(x, 3)").Select → Cells(x, 3).Select
②目的セルをどこにしたいのか、可変セルをどこにしたいかが不明
です。特に、②が分からないとアドバイスができません。


192:y
08/09/09 20:03:56
>189

>>1★6」でした。失礼しました。


193:デフォルトの名無しさん
08/09/09 20:44:23
>>190
 ご親切にありがとうございました。
勉強になりました


194:デフォルトの名無しさん
08/09/09 22:41:34
>>191
すみません
目的のセルがCells(x, 5)で、可変セルがCells(x, 2)のつもりでした。

で、①のやつをやったら出来ました。
ありがとうございました。

195:デフォルトの名無しさん
08/09/09 22:50:31
VBA初心者です

何か作ろうと思うのですが…自分では思いつかないので…
何か問題お願いします。

196:デフォルトの名無しさん
08/09/09 22:57:53
>>195
このスレを集計してyの貢献度を調査せよ。

197:195
08/09/09 23:04:59
>>196
ラジャ

198:デフォルトの名無しさん
08/09/09 23:34:22
式を教えてください。

A列には文章が入っています。
B列には文章に含まれる単語、C列にはコード番号が入っています。
それぞれ数百~数千行になります。
A列にはB列の単語のいずれかが含まれる場合には、
単語に対応するC列のコードをD列に表示させたいのですが、
どのような式がよいでしょうか。

VLOOLUPやFINDなどを組み合わせてみても上手くいきません。
お手数ですが、どなたか至急お教え願えますでしょうか。

199:デフォルトの名無しさん
08/09/10 00:31:40
具体的なセルの中身教えろよ
このスットコドッコイ

200:デフォルトの名無しさん
08/09/10 07:26:43
A列…デフォルトの名無しさん、具体的なセルの中身教えろよ、このスットコドッコイ
B列…デフォルト、セル、スットコドッコイ
C列…E46194、H23t55、342421

201:デフォルトの名無しさん
08/09/10 07:44:07
ここはExcel VBAのスレです

202:デフォルトの名無しさん
08/09/11 00:16:48
XPでExcel2003です

c:\aaa 配下にある全てのファイルとサブフォルダを
c:\bbb 配下に全てコピーする事は可能ですか?

また、サンプルコード等ありましたらヒントを頂けると助かります
色々と探してはいるのですが、いまいちピンとこないので
サンプルがあると助かるのですが、、、、

VBAはまだまだ初心者なので未熟者で恐縮です。

203:デフォルトの名無しさん
08/09/11 06:12:54
>>202
>>1★3 ★4

204:デフォルトの名無しさん
08/09/11 19:30:31
たまにmougヲチするんだけど、痛い回答者が多いのね。

205:デフォルトの名無しさん
08/09/11 19:59:47
シートにコンボボックスを貼り付けて
AddItemで追加した後にシートを
Xボタンを押して閉じようとすると
変更を保存しますかと聞かれるんですが
このチェックを外す方法ってあります?

OSはXPでExcel2003です。

206:y
08/09/11 20:15:03
>>198
文章中の、特定の単語の有無の判定なら、たぶんInStr関数で何とかなると思います。
調べてみて使えそうなら使ってください。
>199にもありますが、具体的なデータが分からないとアドバイスしずらいです...


207:y
08/09/11 20:17:20
>>195
どんな業界で働いている方か分かりませんが、
実務に役立つ知識が増すようなテーマを選ぶと、
何かと都合がいいのではないでしょうか。

為替、株式市況、地価、青果水産物市況など、
ネット上にはたくさんの生データが公開されています。
それらを自動的に取得し、テーマに沿って演算し、
レポートを出力するマクロを組むだけでも、
相当勉強になると思います。

やるのであれば、日々刻々と変化する数字の方が面白いです。
例えばある人は、東京に10数箇所ある中央卸売市場の毎日の市況データを
取得し、各市場の卸売価格差をグラフに出力するマクロを作っていました。
仲買業者なら、どこの市場で買い付けをすれば一番安いか、
逆に生産者なら、どこの市場に出荷すれば一番高いか、
一目で分かるというものです。ちなみに彼は商社に勤めていますが、
似たようなことをしている人は結構いるでしょう。

Excelは基本的にデータ処理の道具なので、何を試すにしても、
まずは題材になるデータを見つけてこなければなりません。
ならば自分が、分析対象として最も興味を覚えるデータを選ぶのがベターです。
その上で、自分のスキルに応じた試行錯誤をしてみればいいと思います。
仮に「VBA解説書に載っている多機能な家計簿を作るんだ」と決意したとして、
自分で小遣い帳をつけているほどの人ならともかく、付属CDに入っている
仮想データを使って作っていくようなやり方は、モチベーションが湧きづらい
ように感じます。

208:デフォルトの名無しさん
08/09/11 22:02:38
あれ今日y絶好調だな

209:デフォルトの名無しさん
08/09/11 23:07:26
>>206
×しずらい
○しづらい
◎しにくい

210:デフォルトの名無しさん
08/09/12 01:38:18
>>195
WindowsVBAつくってよ

211:デフォルトの名無しさん
08/09/12 03:36:31
yには、人生相談にすら答えてくれそうな勢いを感じる

212:y
08/09/12 20:05:30
>>205
「シートを Xボタンを押して閉じようとすると」とありますが、
シートに×ボタンはないので、たぶん「ブックを」のつもりでしょうか。

「変更を保存しますか」というメッセージは、ブックを保存した直後の状態であれば
表示されません。この状態は、WorkbookオブジェクトのSavedプロパティをTrueに
することで、強制的に作り出すことができます。
ブックが閉じられる直前に、その操作が自動で行われるようするためには、
ThisWorkbookオブジェクトのコード領域にBeforeCloseイベントを挿入し、
その中でSavedプロパティを操作します。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 ThisWorkbook.Saved = True
End Sub

213:デフォルトの名無しさん
08/09/12 20:44:06
うざいな

214:デフォルトの名無しさん
08/09/12 20:51:26
>>213
お前がな

215:205
08/09/12 22:35:11
なるほど。Savedプロパティですか。
ありがとうございました。

216:デフォルトの名無しさん
08/09/13 00:10:19
確かにうざいわ

217:y
08/09/13 02:54:40
・・・

218:デフォルトの名無しさん
08/09/13 03:49:12
何コイツ

219:デフォルトの名無しさん
08/09/13 06:49:48
煽りなんか気にすんな。

220:デフォルトの名無しさん
08/09/13 07:14:09
未だに169が粘着してる

221:デフォルトの名無しさん
08/09/13 08:56:37
>>217は、マジでうざいなw

222:デフォルトの名無しさん
08/09/13 09:06:33
まぁ、2chではあまり見ないキャラであることは確かだな。
嫌ならNGしとけ。

223:デフォルトの名無しさん
08/09/13 09:25:58
凄い粘着だな。。。おい。

224:デフォルトの名無しさん
08/09/13 10:01:34
>>218-223をNG指定した

225:デフォルトの名無しさん
08/09/13 11:55:22
マクロなんですけど、行挿入のマクロを作りたいんです。
だけど、挿入する行をセルの値から指定したい場合はどうすればよいですか?

B2 = 3
3行目と4行目の間に行挿入をするようB2をつかってさせる。

226:デフォルトの名無しさん
08/09/13 13:16:55
Dim i As Integer
i = Range("B2")
Rows(i).Insert

227:デフォルトの名無しさん
08/09/13 13:18:30
これだけでもいけるな

Rows(Range("B2")).Insert

228:デフォルトの名無しさん
08/09/13 14:07:04
>>226-227
助かります、ありがとうございました。

229:y
08/09/13 16:13:47
・・・

230:デフォルトの名無しさん
08/09/13 22:03:03
yそろそろコテにしたら?なりすましが出るくらい名が知れてきたんだからさ

231:デフォルトの名無しさん
08/09/13 22:16:44
yがコテじゃなかったら何だと言うのだ

232:デフォルトの名無しさん
08/09/13 22:33:41
トリップつけたら?ってことじゃね?

233:デフォルトの名無しさん
08/09/13 23:38:26
いい加減、yの話題やめろよ

234:デフォルトの名無しさん
08/09/14 00:06:42
うざすぎ

235:デフォルトの名無しさん
08/09/14 03:08:08
エクセルのシートに画像をドラッグした時に、指定場所に指定のサイズに変換したいのですができますか?

また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?

236:デフォルトの名無しさん
08/09/14 05:20:37
> エクセルのシートに画像をドラッグした時に、指定場所に指定のサイズに変換したいのですができますか?
「シートに画像をドラッグした時に」というイベントが用意されてないから、
「ドラッグした」ら自動で処理するってのは無理
「シートに画像をドラッグしてからボタンを押したら」なら可能だが

> また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?
可能だがExcelでやるべきことじゃないな
Excelでやるってことは、Excelとその警告マクロを作ったブックを立ち上げてないと警告文出ないわけだし
やるとすれば、「n日前」ではなく、「n日前以降、最初にExcelを立ち上げたとき」という条件になるかな

237:デフォルトの名無しさん
08/09/14 16:10:42
前者:できない
後者:できない


238:デフォルトの名無しさん
08/09/14 17:37:16
EXCEL関数についてお教えください

あいうえお(abc)
かきくけ(ほげほげ)
さしすせそたちつ(nekdk)

という行がありまして、()とその中の文字列だけを全部消したいです。
()は全角です。()内の文字、文字数数がことなるので置換が使えないでいます。。

239:デフォルトの名無しさん
08/09/14 18:02:25
マッチコレクション

240:デフォルトの名無しさん
08/09/14 18:10:17
>>238
>>1 ★2

241:デフォルトの名無しさん
08/09/14 21:03:02
>>238

関数ではないけど
ツール→区切り位置で区切り文字を ( にすると
( の前後で別のセルに分かれるからそれではダメかな?

242:デフォルトの名無しさん
08/09/14 22:58:50
 VBAで検索システム的なものを作っています。
行き詰ってしまったので何かアドバイスをいただければと思います。
OSはXPでエクセルのバージョンは2002です。よろしくお願いします。
 ブック内に「メイン画面」「情報A」「情報B」という3つのシートがあります。
「メイン画面」のB5セルに会員番号(K_Ban)を入力してマクロを実行すると「情報A」「情報B」から該当の会員番号に関する情報が「メイン画面」の任意のセルに代入されるというものです。
ただし「メイン画面」の形式の都合で、該当する「情報A」のうち、上から3件のみを出力させて4件目以降はカットしています。(下記コード参照)
「情報B」は「種別」という項目があり、「野菜」「肉類」「魚類」…などの分類が30種類ほどあります。
「情報B」についても、各種別毎に3件目以降はカットしたいのですが、行き詰っています。
すなわち、会員番号1について「情報B」は30件あり、野菜25件、肉類5件があるとすると
「メイン画面」には野菜3件、肉類3件分の情報を出力させたいのです。
また、種別については、今後随時変更があるので「種別毎に変数を設定して直接数える」のではないようなコードにしたいと思っています。

243:デフォルトの名無しさん
08/09/14 23:00:25
Public Sub 検索()

Dim K_Ban As String
Dim MyRange As Range
Dim MyAddress As String
Dim cnt As Integer

K_Ban = Worksheets("メイン画面").Range("B5")
Set MyRange = Worksheets("情報A").Range("A1:A50").Find(K_Ban, LookAt:=xlWhole)
MyAddress = MyRange.Address
cnt = 8

Do
Worksheets("メイン画面").Cells(cnt, 3) = MyRange.Offset(0, 0).Value
Worksheets("メイン画面").Cells(cnt, 4) = MyRange.Offset(0, 1).Value
Worksheets("メイン画面").Cells(cnt, 5) = MyRange.Offset(0, 2).Value
cnt = cnt + 1

If cnt = 11 Then
Exit Do
End If
Set MyRange = Worksheets("情報A").Range("A1:A50").FindNext(MyRange)
Loop Until MyRange.Address = MyAddress
End Sub

244:デフォルトの名無しさん
08/09/14 23:25:44
シートの構造書くか、Bookをどこかにアップ

245:デフォルトの名無しさん
08/09/15 08:41:27
だよな普通

246:y
08/09/15 11:18:44
>>242

    |A列.     |B列.      |C列.      |D列.      |E列.      
01  | 0123456789|        .|        .|        .|        
02  |        .|        .|        .|        .|        
03  |        .|        .|        .|        .|        
04  |        .|        .|        .|        .|        
05  |        .|        .|        .|        .|        

シート内のデータ内容を説明するために、以前こんなテンプレを使っている人がいました。
「情報A」「情報B」シートの中身を、文章で説明するより楽だと思ったら使ってください。


247:242
08/09/15 13:54:22
>>244-246
以下のようなシート構造で、種別→日付で並べ替えてあります。

A     B   C    D
番号 種別 データ1 データ2
1    肉類 豚肉  20080915
1    肉類 牛肉  20080912
1    肉類 鶏肉  20080801
1    魚類 その他 20080401
2    肉類 猪肉  20080905
2    野菜 その他 20080802


248:y
08/09/15 16:03:53
>>247
Sub Sample()
 Dim K_Ban As Long: K_Ban = Worksheets("メイン画面").Range("B5")
 Dim r As Long
 Dim shubetsu As String
 Dim shubetsuCnt As Integer
 With ThisWorkbook.Sheets("情報B")
  .Range(.Cells(1, 1), .Cells(.Rows.Count, 4).End(xlUp)).AutoFilter Field:=1, Criteria1:=K_Ban
  r = 2
  Do While .Cells(r, 1) <> ""
   If .Rows(r).Hidden = False Then
    If shubetsu <> .Cells(r, 2) Then
     shubetsu = .Cells(r, 2)
     shubetsuCnt = 1
    ElseIf shubetsuCnt < 3 Then
     shubetsuCnt = shubetsuCnt + 1
    Else
     .Rows(r).Hidden = True
    End If
   End If
   r = r + 1
  Loop
  .Range(.Cells(2, 1), .Cells(.Rows.Count, 4).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy _
   Destination:=ThisWorkbook.Sheets("メイン画面").Cells(8, 3) '←任意のコピー先セル
  .AutoFilterMode = False
 End With
End Sub




249:y
08/09/15 16:04:42
上のコードは、条件に合わない行を非表示にしていき、最終的に表示されている行だけを
「メイン画面」の任意のセルにコピーする、という考え方です。デバッガでステップ実行していけば、
不要な行が非表示になっていく様子がよく分かると思います。不便なところは改良してみてください。
なお、データは「種別→日付で並べ替えてあります」とありますが、見たところ「番号→種別→日付」で並んで
いますね。上のコードは、そう並んでいる必要があります。

他のやり方を提案する方もいるかもしれませんので、そちらも参考にしてください。

250:デフォルトの名無しさん
08/09/15 18:09:00
先日行挿入について質問したものです。
C3で指定した値の行に行を挿入して、D3,Fj,D3で与えた値を挿入した行のHi、Fi,Iiに値を入れたいのですが、どこが間違っていますでしょうか、ご指摘お願いします。
Sub Main

Rows(Range("C3")).Insert

Dim i As Integer
Dim j As Integer
i = Range("C3")
Range("D3").Copy Destination:=Range("Hi")
j = i-1
Range("Fj").Copy Destination:=Range("Fi")
i = Range("E3")
Range("D3").Copy Destination:=Range("Ii")

END SUB
このように作ったのですが、うまくいきません。

251:デフォルトの名無しさん
08/09/15 18:39:29
>>250
まず、Range("Hi")というセルの指定のやり方はない
Rangeを使いたいんなら、Range("H" & i )
ほかには、Cells(i, 8)、もしくは、Cells(i, "H")

解説サイトいっぱいあるから基本的とこから少し勉強したほうがいいよ

252:デフォルトの名無しさん
08/09/15 19:29:45
エクセルの使い方もロクに知らない俺が
今日これからVBAの勉強を力尽きるまでやってみるぜ。
困ったときはお前らだけが頼りだ。

253:デフォルトの名無しさん
08/09/16 06:39:12
>>251
ご指摘、解説ありがとうございます。
出来る限り自分でやるようにしてみます。

254:242
08/09/16 23:49:49
>>248
ありがとうございます。
(もしかしたら上級者の方には普通なのかもしれませんが)
自分には全くない発想でした。勉強になりました。
お示しいただいたコードを元に自分でも勉強したいと思います。

255:デフォルトの名無しさん
08/09/17 00:16:06
そう考えること自体は不思議ではないと思うよ。
現によその言語ではそういうことができるものだってある(Perlとか)。
いずれにせよVBAはそういうことをしないということに変わりはないけれど。

256:デフォルトの名無しさん
08/09/17 01:45:49
ねぇねぇみんな。
Microsoft Forms 2.0 TextBoxだと右クリックしてもメニューが出てこないよね。
出てくるようにしたいんだけど、何かいい知恵あるかな?

257:デフォルトの名無しさん
08/09/17 17:14:06
すいません、質問です。

1004エラーが出ます。(´Д`;
worksheet記述を加えてみたり、色々試してみたのですが消えません。

作りたいものとしては、
A列を縦にチェックして異なる文字列が出てきたら罫線(太線)を引く、
というものです。
突っ込み、お願いします。

Sub test()
  Dim i As Integer
  Dim st_flag As Byte
  Dim range1 As Range
  
  st_flag = 0
  i = 3
  Do While Cells(i, 1).Value <> ""
    If (st_flag = 1) Then
      If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then
        Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium
      End If
    Else
      st_flag = 1   ''最初の1セルは比較をしない
    End If
    i = i + 1
  Loop
End Sub

258:デフォルトの名無しさん
08/09/17 19:04:30
読むのめんどいからどの行でエラーなのか教えて

259:デフォルトの名無しさん
08/09/17 19:37:16
Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium

Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).Weight = xlMedium

260:デフォルトの名無しさん
08/09/17 20:29:58
実行時エラー '1004':

Border クラスの LineStyle プロパティを設定できません。

これくらいコピペしようぜ

261:デフォルトの名無しさん
08/09/17 20:30:38
時間の許す限りエラーの内容くらい小一時間考えよう

262:デフォルトの名無しさん
08/09/17 20:37:01
質問者と回答者よりも講釈師の方がが多いスレ

263:デフォルトの名無しさん
08/09/17 21:21:15
板全体に言えるわけだが
すれ違い甚だしい質問だとか煽りだとか
ここはまだまし

264:デフォルトの名無しさん
08/09/17 21:42:26
>>262
質問者 回答者 講釈師
貴方はどれに該当しますか?

265:デフォルトの名無しさん
08/09/17 21:43:55
ヌルポ

266:デフォルトの名無しさん
08/09/17 21:51:22
ポルヌ

267:デフォルトの名無しさん
08/09/17 21:52:59
>>262は煽り専門要員だよ

268:y
08/09/17 23:26:36
>>254
念のため補足しますが、>>248のコードは決して最善の方法ではありません。
合致する会員番号でふるいをかけ、その中から種別ごとに最大3つまでの
アイテムを取り出していく取捨選択の過程を、視覚的に理解するために利用してください。

仕組みが単純なので、コードが短くて済むというのが唯一の利点ですが、
マスタデータの行の表示・非表示を切り替えて実現する「検索システム」というのは、
>255でも指摘をいただいていますが、普通はやらないでしょう。
(数がたくさんになると、けっこう動作が重くなってしまいます)

まじめに実装するとすれば、取捨選択の考え方はそのまま生かすとしても、
転記の仕方に改良の余地があります。適当な二次元配列を用意して、
取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに
書き込む、というのが一般的なやり方になると思います。

>>256
TextBoxのMouseDownイベントプロシージャ内で、Commandbars("登録されているCommandbar名").ShowPopup を
実行すれば、そのタイミングで表示されます。ユーザー設定のショートカットメニューも表示できます。
ちなみにMouseDownイベント発生時は、Button引数 が 定数xlSecondaryButton と等しければ、右クリックと判断できます。



269:デフォルトの名無しさん
08/09/18 01:50:36
さすがy

270:デフォルトの名無しさん
08/09/18 05:40:38
うぜぇ

271:デフォルトの名無しさん
08/09/18 09:07:55
>>257っす。

>>258
申し訳ないっす。ブレークポイントで調べてみたらここらしいです。
      If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then
→       Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium
      End If

>>259
うぉ、できました!
罫線の種類とか太さとか、指定する先が間違っていたのですね。

>>260
そこまで親切に表示されませんでした。orz
出てきたのは、
 実行時エラー '1004':
 アプリケーション定義またはオブジェクト定義エラーです。
でした。あ、verはexcel2003です。

>>261
小一時間考えて駄目だったので聞いてみました。orzorz
Cのコンソール系しか打ったことが無いので、感覚的につかめなくて。

ともあれ、無事にできたので。
ありがとうございました。m(_ _)m

272:デフォルトの名無しさん
08/09/18 14:26:11
>>266

!ッガ

273:デフォルトの名無しさん
08/09/18 18:15:17
>>242をわざわざVBA使ってまでやってる理由が分からんな…
関数だけで何とでもなりそうだw

274:デフォルトの名無しさん
08/09/18 19:42:37
>適当な二次元配列を用意して、
>取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに
>書き込む、というのが一般的なやり方になると思います。

はぁ?
何でお前ごときが一般論を語れるんだよ?

275:デフォルトの名無しさん
08/09/18 20:49:36
>>274
お前ごときがここにくんな

276:デフォルトの名無しさん
08/09/18 22:30:24
今独学でVBAを学んでいます。
皆さんにお聞きしたいのですが、
独学で学ぶにお薦めの本はありますか?

大村あつし著 かんたんプログラミング EXCEL VBA基礎編
と できるシリーズのVBAを読んでいます。



277:デフォルトの名無しさん
08/09/18 23:40:24
>>276
漏れの場合はVBAに関する知識はほとんどネットやヘルプで調べたものだったりするし・・・
VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
便利なテクニックとかはネットで拾い集めて行く

最初に手に入れたVBAの本に載ってたサンプルがコンパイル通らなかったから
本は全然信用してないだけだけどなw
でも1冊だけ役に立った本があったな・・・
「Excel VBA逆引き大全」とかだったかな?

278:デフォルトの名無しさん
08/09/19 01:19:38
すいません。
VBA作成経験なく、ここを答えを求める場として
使うことに申し訳なく思っています。

複数のExcelファイルを指定する。
当該ファイルを新ブックにして保存する。
→その際、シート名が重複しても問題なし
 新ブックのファイル名はあらかじめ指定したものを

このようなマクロをつくることは可能でしょうか。
前述のとおり、まったく経験なしなので、
サンプル、たたき台程度で構いませんので、
ご教示いただけたら嬉しいです。

279:デフォルトの名無しさん
08/09/19 01:57:51
相変わらずyきめぇw

280:デフォルトの名無しさん
08/09/19 02:05:09
>>278
さっぱり意味がわかりません。

281:デフォルトの名無しさん
08/09/19 02:08:42
>>277
>VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
できる奴の戯言だな

282:デフォルトの名無しさん
08/09/19 04:03:48
>>278
簡単だよ。

283:デフォルトの名無しさん
08/09/19 06:07:09
>>275
アホ?

284:デフォルトの名無しさん
08/09/19 06:25:29
>>281
いや普通できると思うできないのは文盲

285:デフォルトの名無しさん
08/09/19 06:26:23
>>283
ゆとり乙

286:デフォルトの名無しさん
08/09/19 06:37:00
ここの奴ら「簡単」だの「出来て当たり前」だの口ばかり達者で
入門書レベルの事しか回答出来ないから笑える

287:デフォルトの名無しさん
08/09/19 06:43:18
>>286
お前だろそれ

288:デフォルトの名無しさん
08/09/19 07:01:00
あらあらw

289:デフォルトの名無しさん
08/09/19 07:04:32
vbogl.tlbのedxさんめちゃくちゃいい人だ。メールしたら速攻返事きたw


290:デフォルトの名無しさん
08/09/19 07:05:18
誤爆した

291:デフォルトの名無しさん
08/09/19 07:06:03

>>278
複数ファイルのブック内のシートを結合するマクロなら昔適当に作ったのがあるけど

292:デフォルトの名無しさん
08/09/19 08:52:57
>>278
まとめると
複数ファイルのブック内のシートを結合する
シート名は重複している場合がある
だよな?
シート数は全部でどのくらいになるんだ?
あまり多いと1つのブックに収まらないよ

293:デフォルトの名無しさん
08/09/19 09:10:07
>>292
すいません、追加・変更があります。

○○システムの情報 ブック*2
□□システムの情報 ブック*2
(全部で5システム)

上記1ブックに1シートのみ

これをシステムごとに1ブックとして新規に保存。
なので、計5ブックができる。

これを一回でやりたいです。

下記の情報をあらかじめ指定(変更可)
- 各システムの情報ブック
- 新ブックの名前

を考えています。

294:292
08/09/19 10:40:41
>>293
かなり手抜きだが書いてみた
コピー後のシート名は指定するように作った
マクロを入れるブックに
A列(ファイルバス)| B列(コピー後のシート名)
○○システム
C:\A1.xls| Sheet○○1
C:\B1.xls| Sheet○○2
C:\C1.xls
○×システム
C:\A2.xls| Sheet○×1
C:\B2.xls| Sheet○×2
C:\C2.xls

といった感じにデータ入れて以下のマクロを動かす
(AとBはコピー元Cがコピー先)

295:292
08/09/19 10:41:55
Sub Macro1()
Dim wkAWorkbook As Workbook
Dim wkBWorkbook As Workbook
Dim wkCWorkbook As Workbook
Dim i As Long

For i = 0 To 1
With ThisWorkbook.Worksheets(1)
'コピー元1つ目を開く
Set wkAWorkbook = Workbooks.Open(.Cells(2 + i * 4, 1))
'1つ目を新規ブックにコピー
wkAWorkbook.Worksheets(1).Copy
Set wkCWorkbook = ActiveWorkbook
'コピーしたシートをリネーム
ActiveSheet.Name = .Cells(2 + i * 4, 2)

改行多すぎので次レスに続く

296:292
08/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

297:デフォルトの名無しさん
08/09/19 20:49:06
頭悪そうなコード

298:デフォルトの名無しさん
08/09/19 21:05:31
変数名のつけかたって、読んだ参考書や勉強したサイトにけっこう影響されない?

299:デフォルトの名無しさん
08/09/19 21:08:44
変数名のセンスが悪いな

300:y
08/09/19 21:23:03
>>276

「VBAの絵本」(アンク)
アンクの絵本シリーズは、その言語の仕組みや考え方を、豊富なイラストを用いて直感的に
伝える工夫がなされています。他人に薦めた本の中で、「分かりやすかった」という反応がいちばん
多かったのがこの本です。ACCESS VBAの内容も包括しているので、将来的にも役に立つでしょう。
概念の説明が中心で用例は乏しいので、メイン本にはできませんが、「かんたんプログラミング」を
持っているのであればそれで足りると思います。

「Excel VBAのプログラミングのツボとコツがゼッタイにわかる本~最初からそう教えてくれればいいのに」(秀和システム)
「絵本」よりも実際性があり、個人的には一押しです。解説文と図の取り合わせがとても洗練されており、
文脈の多義性によるストレスや誤読を最小限に抑えようとする、手厚い推敲の跡が感じられます。新しい本なので
まだ他人に薦めたことはありませんが、アマゾンでは好評なようです。

「VBAポケットリファレンス」(技術評論社)
ヘルプがあればリファレンス本はいらない、という声もありますが、個人的には手離せません。
ページをめくるより、ヘルプを開いた方が速いような気もするかもしれませんが、
書式指定子の一覧、よく使うオブジェクトのプロパティ一覧など、よく開くページに
付箋を貼って机に置いておくだけで、パッと見たい時には最速のツールになり、ディスプレイも汚れないので
思考が中断されません。(※ただし、ヘルプを使って調べる習慣は、それはそれで必要です)

「逆引き」本(各社)
>276で既に上がっていますが、豊富な用例がほしい時は逆引き本です。ただ、「やりたいこと」をもとに
用例を探す場合、インターネット検索のほうがより楽な場合が結構あることも覚えておいてください。
「VBA + (やりたいことに関連するキーワード)」で検索すると、似たようなことを既にやっている人の
コードが割と簡単に見つかったりします。


301:y
08/09/19 21:24:04
他にも良書はたくさんあるので、上にこだわることはありませんが、ひとつだけ、初心者が解説書を選ぶ上で
ぜひ注意してほしい点は、VisualBasicEditorの使い方、特にデバッグの作法を丁寧に解説している章があるかどうかです。
ステップ実行、ローカルまたはウォッチウィンドウでの変数の監視、イミディエイトウィンドウからの介入、これらの意味を
早いうちに知り、使いこなせるかどうかが、その後の上達に明らかに影響します。


302:デフォルトの名無しさん
08/09/19 21:27:08
たいしたデバッガじゃないからヘルプで十分だよ

303:y
08/09/19 21:56:25
>>273
Excel2007なら、オートフィルタの抽出条件で「上位○位まで」という設定が可能になったので、
それを組み合わせれば、フィルタだけで何とかなるような気がします。
ただ関数だけでやるとなると… いい方法が思いつきません。

304:y
08/09/19 22:28:11
すみません。>>300の「>276で既に上がっていますが」は、「>277」の間違いです。
さらに内容も、結構>277とかぶってしまっています。失礼しました。




305:292
08/09/19 23:27:08
>>297
頭悪そうなレス

>>299
センスが良いネーミングをぜひとも教えてくれ


貶すことしか知らない無能って多いな

306:デフォルトの名無しさん
08/09/19 23:31:05
あらあらw

307:デフォルトの名無しさん
08/09/20 00:29:08
先週金曜日あたりから突然会社のExcel2002がおかしくなった。ネットワークが切断されたかなんたらで、ファイルにアクセスできないやらなんたらというのがおきるようになった。
コンパイルするとファイルサイズが600kbから740kbになる場合とならない場合があり、(ソースはバックアップから同じ様にに変更したのに)大きくなった場合、実行すると強制終了になるという症状も現れた。
自宅の2003では問題なかったがためしに2002に変更。SP3を適用したまでは問題なかったが会社と同じバージョンになるよう、全部の更新を適用したところ同じ症状となった
ためしに最新のKB8951551を削除するとあっさり解決した・・。同じ目にあってる人いますか?
解決にいたるまでめちゃくちゃ苦労したよ・・・。(いやまだ会社のエクセルでは試せてないけど・・・)

308:デフォルトの名無しさん
08/09/20 01:39:41
IDでないのにわざわざコテつけて煽るってなにこいつ

309:デフォルトの名無しさん
08/09/20 02:37:18
初心者です、お世話になります。
他の板で質問したあとに、こちらで質問すべきだったと気付きましたマルチポストですが勘弁してください。
セルA1とB1にそれぞれシリアル値による時間が入っています。
セルの書式設定により時間が表示されています。
ユーザーフォームの中のラベル1にB1からA1を引いた時間を時分秒の形で表示したいのです。
A1は開始時間、B1は終了時間、ラベル1は所用時間と考えてください。
Label1.Caption = Range("B1") - Range("A1").value
とやるとシリアル値っぽいのが出るのですが、時間を表示したいのです。
助けてくださいませ。

310:デフォルトの名無しさん
08/09/20 03:58:49
>>292
ホントありがと。
まったくプログラム経験なしだけど、
書いていただいたものをもとに
勉強含め動かしてみたいと思います。

感謝します。

311:デフォルトの名無しさん
08/09/20 08:40:23
>>309
DateDiff関数でintervalに"s"を指定して秒単位の差分を取得、
後はそこから時分秒に分割して文字列に結合して完成、って所?

312:デフォルトの名無しさん
08/09/20 09:24:11
>>305
一生そのままで朽ち果てろ

313:デフォルトの名無しさん
08/09/20 10:14:55
ジョン3兄弟

314:y
08/09/20 13:55:32
>>309

>311のやり方で可能ですが、他にこういう書き方も。
Label1.Caption = Format(Range("B1") - Range("A1"), "hh:nn:ss")


315:デフォルトの名無しさん
08/09/20 16:18:39
>>311>>314
アドバイスどうもありがとうございます。
テストをしてみたのですが、両方とも「’実行時エラー’438:オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というエラーが出てしまいます。
私は知識不足なので対応がわかりません。
これは、どういうことなのでしょうか?

316:デフォルトの名無しさん
08/09/20 16:35:45
>>311>>314
失礼しました、できました。
ほんとうにありがとうございました。

317:デフォルトの名無しさん
08/09/20 19:35:44
hh:mm:ssでなくて?

318:デフォルトの名無しさん
08/09/20 20:41:32
nnでもいけるんだよね

319:y
08/09/21 00:37:26
そうですね。
書式指定子 "m" または "mm" は、時刻の分も表しますが、日付の月も表します。それによる混乱を回避するため、
分のみを表す指定子「n」が実装されている、という話を何かの本で読んだことがあります。
ヘルプには、「"h" または "hh" の直後、あるいは "ss" の直前に "m" を指定した場合、月ではなく分が表示されます」とあります。
逆に言うと、mだけを独立して使うと、分ではなく月を表します。つまり分のみを表示させたい状況では、どうしても「n」を使う必要があります。
そういうわけで、分は最初から「n」を使う習慣をつけておいたほうが、間違いが少ないように思います。


320:デフォルトの名無しさん
08/09/21 00:47:17
うざ

321:デフォルトの名無しさん
08/09/21 03:56:03
>>320
なんでこいつこのスレに粘着してるの?

322:デフォルトの名無しさん
08/09/21 08:47:58
Excel 2009を使用しております。

テーブルを作成し、いくつか項目を入力した状態で、
GUIでテーブルの見出し行にある矢印メニューボタンを押した時に表示される
フィルタのメニューの処理を、VBAから行うにはどのようにすればよいでしょうか?

例えば、TODOリストを想像してください。
ボタンを配置して、ボタンを押すと、
テーブルの1つの列の「開始日付」が今日のもので、
「状態」列が「未完」となっているもののみを表示する。
また、他のボタンを押すと、元に戻る(というか全部表示)。
といったようなことをしたいのです。

画像を見てもらったほうが早いので、説明画像も作成しました。
URLリンク(sylphys.ddo.jp)

どのようなクラスのオブジェクトにアクセスすればいいかだけでも、手がかりがあればと思います。

323:y
08/09/21 09:13:13
>>322
チェックを入れたり外したりする操作を、「マクロの記録」(>>1★6)を使って記録して、
生成されたコードを見れば、どんなオブジェクトにアクセスしているか手がかりが
得られると思います。

324:デフォルトの名無しさん
08/09/21 09:37:36
>>321
うざいからだろw

325:デフォルトの名無しさん
08/09/21 09:42:50
>>323
ありがとうございます。
基本的なことを聞いてしまった様な気がします。テンプレ嫁よ俺。

「開始日付」を「今日」のみ選択、「状態」を「途中」「予定」「スキップ」のみ選んだ時は、
こんな感じで記録されていました。

  ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=2, Criteria1:= _
    xlFilterToday, Operator:=xlFilterDynamic
  ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=1, Criteria1:=Array _
    ("途中", "予定", "スキップ"), Operator:=xlFilterValues

ListObjectsでListObject(テーブル)が得られて、そのRangeにAutoFilterをかますんですね・・・。

326:デフォルトの名無しさん
08/09/21 15:51:36
質問なのですが、
同一ファイル内で、シート1上の左側にはシート1の内容、右側にはシート2の内容
のように分割して表示することは可能でしょうか?
(ウィンドウを別々に開くのではなく)
もしやり方があるのであれば教えてください。
Excel2003を使用しています。

よろしくお願いします。

327:デフォルトの名無しさん
08/09/21 17:20:23
スレ違い

328:デフォルトの名無しさん
08/09/21 20:07:05
質問です。
-------------------------------------------
【やりたいこと】
(1).ファイル保存ダイアログでファイル名を選択させる。
(2).新規ファイル名を入力することも可能にする。
(3).ファイル保存時に選択可能なファイルタイプ(拡張子)をVBAで指定する。

【直面している問題】
・Office.FileDialog で msoFileDialogSaveAs を指定すると(3)を満たす方法がわからない
・Office.FileDialog で msoFileDialogFilePicker を指定すると(2)を満たす方法がわからない

【環境】
WindowsXp SP3 + Excel2002 SP3
-------------------------------------------
よろしくお願いします。


329:デフォルトの名無しさん
08/09/21 21:06:15
>>328です。事故解決しました。
Excel.Application.GetSaveAsFilename
を使えばよかったんですね。

スレ汚し失礼。

330:デフォルトの名無しさん
08/09/24 00:40:37
ExcelVBAって、.netよりもVB6に近いですか?


331:デフォルトの名無しさん
08/09/24 07:22:11
うーん。その質問は難しいな。
似てるけど全くの別物と思っておいた方がいいよ。

332:デフォルトの名無しさん
08/09/24 13:31:46
いやVB6とほとんど同じ

333:デフォルトの名無しさん
08/09/24 15:45:03
VB6でオブジェクトブラウザ開いてみな VBAがあるでよ

334:デフォルトの名無しさん
08/09/24 16:05:39
>>330-332
何処に焦点当てるかで変わってくる
VB6とVBAは、構文規則は全く同じ
組込関数はほとんど同じ
組込オブジェクトは全然別物

>>333
そのVBAとVisual Basic for Applicationは意味違うからw

335:デフォルトの名無しさん
08/09/24 18:37:44
Worksheets("表").Range("A2").Select

と記述するとA2にデータの未入力状態ということで実行エラーが出てしまうのに、

With Worksheets("表")
  .Select
  .Range("A2").Select
End With

と記述するとエラーが出ずに問題なく実行されるのはなぜなの?

336:y
08/09/24 21:36:05
あるセル範囲に対してSelectメソッドを実行したとき、
そのセル範囲が含まれるシートが選択されていなければ、
実行時エラーが発生する仕様になっているためです。

>335の下のコードは、シートを選んでから、セル範囲を選んでいるので、エラーは発生しません。
上のコードも、「表」シートが選んである状態であれば、エラーは発生しません。


337:デフォルトの名無しさん
08/09/24 21:57:49
>Worksheets("表").Range("A2").Select
こうすればいい。
>Worksheets("表").Select
>Worksheets("表").Range("A2").Select
# って、既に歪の人が書いていたか。

338:デフォルトの名無しさん
08/09/24 23:27:58
スレチでしたら誘導願います。
xp・excel2002で、関数が物足りなくなってきたのでマクロとVBAの勉強始めました。
ネットで検索するとaccessにもVBAとかマクロとか関数も?あるようです?

同僚に挫折したaccessのVBAの本ならあるから1500円で譲るよ。と言われたのですが、
excelとaccessのVBAは同じものですか?全く別物でしょうか??
すみません、宜しくお願いします。

339:デフォルトの名無しさん
08/09/24 23:33:34
>>338
AccessVBAの本ではVBの勉強にはなるかもしれないがExcelVBAの勉強にはならないので
1500円も出すくらいならちゃんとした本を買いましょう。

340:デフォルトの名無しさん
08/09/24 23:37:41
>>338
VBAそのものは同じだけど操作対象が全く別物なのでお勧めできない

341:デフォルトの名無しさん
08/09/24 23:44:40
>>339>>340
レス㌧くすです。

つまり、同じものだけど違うものだから?エクセルのVBAの本を買うべき。
と言うことですね?ありがとうございました。
危うく、accessの本を読んでexcel挫折するところでしたw

342:デフォルトの名無しさん
08/09/25 00:42:24
いらないならタダでくれればいいのにセコイ同僚だな

343:デフォルトの名無しさん
08/09/25 15:13:33
Dim Cnt, Num As Integer
Dim Tbx As TextBox
Num = 0
For Cnt = 1 To 9
Num = Num + 1
Set Tbx = "TextBox" & Num
Tbx.Text = ""
Next

VBAは変数の型を自動変換してくれると考えて、これを実行すると、
「コンパイルエラー:型が一致しません」と出ちゃいます。無理かな。

344:デフォルトの名無しさん
08/09/25 16:09:13
>>343
>Dim Tbx As TextBox
>Set Tbx = "TextBox" & Num←何がしたいんだ?

TextBoxは文字列ではないからコンパイル通らなくて当たり前だな
Set Tbx = Worksheets(1).OLEObjects("TextBox" & Num)
なら理解できる

345:デフォルトの名無しさん
08/09/25 16:39:59
>>344
サンキュー!!!!!!!!!

346:デフォルトの名無しさん
08/09/25 16:45:25
ちなみに余計なお節介かもしれんけど
Dim Cnt, Num As Integer と書くと cntはVariant型だぞ

347:デフォルトの名無しさん
08/09/25 17:07:39
>>346
わざわざ有難うございます。いただいたアドバイスをヒントに修正しました。
やりたかったのはUserForm1のコントロールTextBox1~9までの値をクリアすることでした。

Private Sub CommandButton5_Click()

' TextBox1~9までのTextプロパティの値をクリアする
Dim iCnt As Integer, iNum As Integer, oTbx As Control
iNum = 0
For iCnt = 1 To 9
iNum = iNum + 1
Set oTbx = UserForm1.Controls("TextBox" & iNum)
oTbx.Text = ""
Next

End Sub


348:デフォルトの名無しさん
08/09/25 18:48:29
ExcelVBAExpressEditionってないの?

349:デフォルトの名無しさん
08/09/26 09:26:40
えっえっえっえっ
えっろっびっでぉー

350:デフォルトの名無しさん
08/09/26 18:02:31
>>348
excelが対象なのに、VBAだけじゃ意味無いだろw
おとなしくメモ帳に書いとけ。

351:デフォルトの名無しさん
08/09/27 22:33:47
Hになればなるほど、固くなるものってな~んだ?

352:デフォルトの名無しさん
08/09/27 22:35:18
鉛筆の芯

353:デフォルトの名無しさん
08/09/27 22:53:05
エクセルにVBAが付いてくる…一般
VBAにエクセルが付いてくる…マ
>350は素人

354:デフォルトの名無しさん
08/09/27 23:28:04
> VBAにエクセルが付いてくる…マ
これ、笑うところ?
あ、マってプログラ"マ"じゃなくて"マ"ヌケってことか
それなら納得

プログラマがこんな本質を違えた愚かな発想するわけないもんなw

355:デフォルトの名無しさん
08/09/28 00:02:57
VBAって、いわゆるスクリプトだろ?
サクラエディタにでも書けばいいじゃん。

356:デフォルトの名無しさん
08/09/28 00:09:48
Excel 2008ではVBAサポートが廃止されました

357:ちら裏
08/09/28 06:12:41
VBとVBA,VB.NETは共にプログラミング言語文法の名前がVisual BASICというだけで
3つとも全部違うと思って欲しい。

それぞれ用途がかなり違う。文法も基本的な部分は同じでも、
実際にコードしてみると、かなーり違うことがわかる。

例えばVBA(もしかしてVB.NETも)では識別子に漢字交じり日本語が使える。

DLLなどの外部モジュールを最も簡単に呼び出せるのはVB。
VB.NETでは網羅されて使いやすいCLRが使える。
Excel付属のVBAでは、これらは出来ないか出来ても酷く面倒

しかしExcelのVBAは
精々ユーザー定義関数の定義や、外部ファイル入出力関係の
典型処理の組み込みや、フールプルーフ目的のフォーム作成
といった補助的な利用に留めておくべきで、ExcelをVB
環境の一種として取り扱うのはやめたほうがいい。
(VBを学ぶ環境としては余り適していない)

358:デフォルトの名無しさん
08/09/28 08:25:19
Visual Studio Tools for Applications
って何かと思っていたら、VBAの次世代版だったのか。
Office2003からVBAと並行して使えるようになっていたのな。
.NET2.0ベースで、VB.NET以外にもC#が使えるのは楽しそうだなあ。

>>356
VBAサポート打ち切ったら、マジ売れなくね?

359:デフォルトの名無しさん
08/09/28 12:22:40
>>357
ひどい知ったかなので、初心者は信じないように。

360:デフォルトの名無しさん
08/09/28 12:56:22
>>359
失敗の経験も貴重だから、確かにそうだな。

361:デフォルトの名無しさん
08/09/28 14:37:52
>>358
2008で「切り捨てて」AppleScriptに変更したら非難ごうごうで(当たり前)
次でやっぱりVBAを復活させるってさ

362:デフォルトの名無しさん
08/09/28 21:06:11
>>360
意味がわからん

363:高島彩
08/09/29 15:57:37
ワークシートつかわないでVBAでRSSの値とるやり方おしえて

364:HIRO ◆225xxx6ZSE
08/09/29 16:07:10
   , - ,----、 
  (U(    ) 
  | |∨T∨  皆さん、>>363をよろしくお願いします。
  (__)_)

365:高島彩
08/09/29 16:12:29
       ____
      /∵∴∵∴\
     /∵∴∵∴∵∴\
    /∵∴∴,(・)(・)∴|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
    |∵∵/   ○ \| <  >>364 氏ねよ!!
    |∵ /.  ミ  | 彡 |   \_______
    |∵.|  \___|_/|    ___
     \|   \__ノ /   /     \  
       \___/    /∧      \
      /      )  | ×       | _     _
     / ,イ 、  ノ/   |●(     ―= ̄ `ヽ, _
    / / |   ( 〈 ∵. ・\  〈__ >  ゛ 、_―
   | !  ヽ  ー=- ̄ ̄=_\_(/ , ´ノ
   | |   `iー__=―_ ;, / / /   
    !、リ  -=_二__ ̄_=;, / / ,'
        /  /       /  /|  |
       /  /       !、_/ /   〉
     / _/             |_/
     ヽ、_ヽ

366:デフォルトの名無しさん
08/09/29 21:36:04
>>363
ごく普通にやればいいだけだよ
VBやCでやるのと同じように

つーか、ワークシート使わない方法になると>>1にも書いてある通り
VBAではなくVB分野になるのでスレ違いだな
あとは自分で調べましょう

367:HIRO ◆225xxx6ZSE
08/09/30 00:14:01
   , - ,----、 
  (U(    )  >>366
  | |∨T∨  ありがとうございます。
  (__)_)


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch