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∨ ありがとうございます。
(__)_)
368:デフォルトの名無しさん
08/10/01 00:19:39
URLリンク(www.nicovideo.jp)
ニコ動で一時期流行った侵略ゲームをExcelで再現してみたのですが、
やはり(?)あまり速度が出ません。
いろいろ頑張ってみたのですが、自分の限界に達したようなので、
速度が向上する方法がありましたらアドバイスをいただけると助かります。
URLリンク(uproda11.2ch-library.com)
369:368
08/10/01 00:36:04
バージョン:Excel2007
OS:Vista
私の環境では、ウィンドウを最大化しておかないと何故かフリーズしやすいです。
フリーズというか、画面は固まりますが裏では動いています。
370:デフォルトの名無しさん
08/10/01 03:44:42
>>368
全く試さない上でVBA素人の俺が脊髄反射レス
・基点となるセルからoffsetで上下左右1ずつ隣のセルの値を取得して、
それを評価した方がいいんジャマイカ
・セルのプロパティのアクセスを都度行うのは重いから、
一度マップ範囲を c = Range("x:y") のように配列に入れて、
値から何とかした方がいいんジャマイカ
・ScreenUpdating を最初から False に(ry
嘘ですごめんなさい
371:デフォルトの名無しさん
08/10/01 07:26:33
Private Sub CommandButton1_Click()
Randomize
Dim hsXmax As Integer 'マップの横最大値
Dim hsYmax As Integer 'マップの縦最大値
Dim hsMap() As Integer 'マップの戦闘力格納用配列変数
Dim i As Integer '行番号
Dim j As Integer '列番号
Dim hsMaxPow As Integer '最大戦闘力
Dim x As Integer 'For用
hsXmax = Cells(6, 57).Value
hsYmax = Cells(5, 57).Value
ReDim hsMap(1 To hsYmax, 1 To hsXmax)
For x = 1 To 1000
Application.ScreenUpdating = False
'マップに戦闘力を設定。マップの一番外側は必ず白色
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If Cells(i, j).Interior.Color <> RGB(255, 255, 255) Then '白色以外のセルに戦闘力を設定
hsMap(i, j) = Int((99 * Rnd) + 1)
End If
Next j
Next i
372:デフォルトの名無しさん
08/10/01 07:27:04
'戦闘結果算出
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合
'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する
hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1))
If hsMap(i - 1, j) = hsMaxPow Then '上のセルが最大だった場合は、上と同じ色にする
Cells(i, j).Interior.Color = Cells(i - 1, j).Interior.Color
ElseIf hsMap(i, j - 1) = hsMaxPow Then '左のセルが最大だった場合は、左と同じにする
Cells(i, j).Interior.Color = Cells(i, j - 1).Interior.Color
ElseIf hsMap(i + 1, j) = hsMaxPow Then '下のセルが最大だった場合は、下と同じ色にする
Cells(i, j).Interior.Color = Cells(i + 1, j).Interior.Color
ElseIf hsMap(i, j + 1) = hsMaxPow Then '右のセルが最大だった場合は、右と同じ色にする
Cells(i, j).Interior.Color = Cells(i, j + 1).Interior.Color
End If
End If
Next j
Next i
Application.ScreenUpdating = True
Next x
End Sub
373:368
08/10/01 07:43:19
↑はソースのコピペです。
一応貼っときます。
戦闘力はランダムのはずですが、
何故か名古屋が強い気がします・・・
374:デフォルトの名無しさん
08/10/01 14:08:29
>>368
フリーズは再現できなかったけどとりあえず軽くしてみた
やったことは
1.色を配列に入れてこねくり回すようにした
2.色が変化しない時は再設定しないようにした
3.気に入らなかったのでElseifをSelect Caseにした
375:374
08/10/01 14:08:53
Option Explicit
Sub CommandButton1_Click()
Randomize
Dim hsXmax As Integer 'マップの横最大値
Dim hsYmax As Integer 'マップの縦最大値
Dim hsMap() As Integer 'マップの戦闘力格納用配列変数
Dim hsColor() As Long 'マップの色格納用配列変数
Dim hsColor_old() As Long 'マップの色格納用配列変数(比較用)
Dim i As Integer '行番号
Dim j As Integer '列番号
Dim hsMaxPow As Integer '最大戦闘力
Dim x As Integer 'For用
Dim hsCells As Object
hsXmax = Cells(6, 57).Value
hsYmax = Cells(5, 57).Value
ReDim hsMap(1 To hsYmax, 1 To hsXmax)
ReDim hsColor(1 To hsYmax, 1 To hsXmax)
ReDim hsColor_old(1 To hsYmax, 1 To hsXmax)
With Range(Cells(1, 1), Cells(hsYmax, hsXmax))
'シートから色を取得
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
hsColor(i, j) = .Cells(i, j).Interior.Color
Next j
Next i
376:374
08/10/01 14:10:02
For x = 1 To 1000
Application.ScreenUpdating = False
'マップに戦闘力を設定
'マップの一番外側は必ず白色
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsColor(i, j) <> vbWhite Then '白色以外のセルに戦闘力を設定
hsMap(i, j) = Int((99 * Rnd) + 1)
End If
Next j
Next i
hsColor_old = hsColor
'戦闘結果算出
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合
'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する
hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1))
Select Case hsMaxPow
Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
hsColor(i, j) = hsColor(i - 1, j)
Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
hsColor(i, j) = hsColor(i, j - 1)
Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
hsColor(i, j) = hsColor(i + 1, j)
Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
hsColor(i, j) = hsColor(i, j + 1)
End Select
End If
Next j
Next i
377:374
08/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
378:デフォルトの名無しさん
08/10/01 15:41:37
どこかのセルが変更された時に処理(以下、処理A)が走るようにしています。
最初の処理(以下、処理B)でセルを変更しています。
処理Bのときだけ処理Aを走らせないようにしたいのですが、
どうしたらいいでしょうか。
379:デフォルトの名無しさん
08/10/01 16:09:13
>>378
Application.EnableEvents = False
かな?
380:デフォルトの名無しさん
08/10/01 16:31:03
>>379
まさにそれでした。ありがとうございました。
最初「Application.EnableEvents = False」の一行見たとき意味わかりませんでしたが、
ググッたら使い方でてきて何とかなりました。
ありがとうございました。
381:368
08/10/01 22:30:32
>>370
>>374
ありがとうございます。
予想以上に速くなりすぎていて驚きました。
色を配列に入れるところまで考えが至りませんでした。
ところで、戦闘力はランダムのはずなのに勝者に偏りがありすぎます。
いくつかのマップで10戦ずつやってみたところ、
愛知県マップ・・・名古屋9勝、西三河1勝、東三河0勝
「目(上中下の3色)」マップ・・・上9勝、中0勝、下1勝
「田(4色)」マップ・・・左上8勝、左下2勝、右上0勝、右下0勝
という結果で、左上に近いほど強いとしか思えません。
謎です・・・
382:デフォルトの名無しさん
08/10/01 23:44:27
>>381
謎でもなんでもないじゃん。
・hsMapの値が整数で0-100程度でしかないから最大値を取るセルが複数できやすい。
・Select Caseで上左の順でチェックしているから上や左が優先されやすい。
つまり、上や左から侵食されやすい傾向があるわけ。
最大値を取るセルが複数ある場合に微妙に優先度を調整するか、
値の変動幅を大きく取って最大値を取るセルが一つになるようにするかってところかな。
383:デフォルトの名無しさん
08/10/02 05:20:47
Excel2000 で 255文字以上のフルパスの存在チェックで DIRでチェックしようとすると「ファイルが見つかりません。」になるんですが回避するにはどうすれば良いですしょうか?
if dir( 255文字以上のパス ) <> "" then
384:デフォルトの名無しさん
08/10/02 05:48:56
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.fileExists(ぱす) = False Then
でいけたかも。他にあれば教えてください。
385:368
08/10/02 07:45:57
>>382
それは私も考えました。
それが原因なら、判定の順序を「下→右→上→左」とすれば、
下や右が強くなるはずです。
順序を変えてやってみましたが、
名古屋8勝、西三河2勝、東三河0勝
上7勝、中3勝、下0勝
左上7勝、左下1勝、右上2勝、右下0勝
と、やはり左上に近いほど強いようです。
まあ、10回程度だと偶然偏りができることも考えられますが・・・
386:374
08/10/02 10:40:57
>>365
比較する順序ではなく色を入れ替えるタイミングの問題では?
Select Case hsMaxPow
Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
hsColor(i, j) = hsColor_old(i - 1, j)
Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
hsColor(i, j) = hsColor_old(i, j - 1)
Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
hsColor(i, j) = hsColor_old(i + 1, j)
Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
hsColor(i, j) = hsColor_old(i, j + 1)
End Select
と更新前の色を入れてやれば少しは改善するかもしれません
387:デフォルトの名無しさん
08/10/02 14:59:02
マクロを実行してファイルを閉じ、再び同じウィンドウで
マクロ入りのファイルを開いても、マクロが実行できません。
VBAを使っていろいろ処理して終了させます。
処理の中では画面更新の抑制やら色々やってます。
マクロを実行したbookを閉じてから、マクロが入った
ファイルを開くと、右クリックで新規ウィンドウ等を
やらない限りは必然的に、既に開いているExcelを使って
ファイルが開かれると思うのですが、そうなるとマクロが
動かないんです。
セキュリティの問題ではなくマクロが無いファイルのような
そんな扱いです。やはり、色々標準の機能を殺しているのが問題で
それが終了しても保持され続けているのが問題なのでしょうか??
388:デフォルトの名無しさん
08/10/02 15:20:53
>>387
セキュリティの設定は何になっているんですか?
低になっていてかつApplication.EnableEventsがFalseだった場合
マクロは自動実行されないはずなので何も起きていないだけでは?
389:デフォルトの名無しさん
08/10/02 20:31:10
1行目と3行目を選択(1行目を選択してからCtrl+3行目を選択)すると、
Range("1:1,3:3").Select
と言うコードが得られますが、
変数を用いて、a行目とb行目を選択する場合には、どのように記述すれば良いのでしょうか。
よろしくお願いします。
390:デフォルトの名無しさん
08/10/02 20:41:43
>>389
Dim a As Integer, b As Integer
Rows(a & ":" & b).Select
391:390
08/10/02 20:45:59
動かなかった・・・orz
Dim a As Integer, b As Integer
a = 1: b = 3
Range(Rows(a).Address & "," & Rows(b).Address).Select
392:デフォルトの名無しさん
08/10/02 21:42:23
お世話になります。
for loopの入れ子でループを抜けたいときは
gotoするのが一般的なんでしょうか?
gotoってあんまり使うなと言われているので
For intI = 3 To 65535
For intJ = 1 To 255
'条件が一致すればここからいっきに2つのループを抜けたい
Next intJ
Next intI
あとループ変数って単純にi,j,kとするか
なにかしらわかりいい名前をつけるのかどちらがいいのでしょうか
よろしくお願いします。
393:デフォルトの名無しさん
08/10/02 21:48:27
多重ループ脱出は数少ないgotoの出番だぞ。
(無論そのための仕組みが存在する言語なら話は別だが)
ループ変数はi, j, kとするのが単純かつ分かりやすい。
intIですらやめてくれと言うところだ。
394:デフォルトの名無しさん
08/10/02 22:11:03
なるほど そうでしたか
ありがとうございました
395:デフォルトの名無しさん
08/10/02 22:40:28
>>393
プログラムが大きくなってくると1文字の変数は探しにくい
やりたいことにもよるだろうが
1文字で済ませる癖は付けないほうがいいと思う
396:デフォルトの名無しさん
08/10/02 23:09:51
>>395
それはプロシージャを分割した方がいいんじゃないかな
397:デフォルトの名無しさん
08/10/02 23:23:45
クラスモジュールと
標準モジュールの違いがいまいちわからん
クラスはオブジェクトとして使ったりコンパイルしてDLLとして参照すると
名前でプロシージャーを呼び出せるってことなのか?
標準だと他のモジュールのって呼び出せない?
398:デフォルトの名無しさん
08/10/02 23:39:33
>>389
union(rows(a),rows(b)).Select
399:368
08/10/02 23:51:05
>>374
ありがとうございます。
強さが均等になりました。
言われてみれば、あのプログラムでは左上が強くなるのも当然ですね。
実は、初期はちゃんと古いマップから色を持ってきていたのですが、
高速化のためにいろいろやっているうちに、古いマップを省略してしまったようです。
400:デフォルトの名無しさん
08/10/03 00:02:25
>>395
ループ自体をForで探せばいいじゃない。
あと、ループ変数をi, jとしないなんてVB以外では聞いたことないってただの個人的経験だけど。
401:デフォルトの名無しさん
08/10/03 09:05:00
>>397
VBA分野の話じゃないね、スレ違い
402:デフォルトの名無しさん
08/10/03 09:26:22
>>392
2重ループ脱出はForとDoを併用するのが常套手段
For intI = 3 To 65535
Do Until intJ = 255
Exit For
Loop
Next intI
403:デフォルトの名無しさん
08/10/03 19:39:08
Do/Loopを使うと速度が落ちちゃうじゃないか、とか言ってみる。
404:デフォルトの名無しさん
08/10/03 20:28:55
>>402
それは無い
405:デフォルトの名無しさん
08/10/03 22:13:12
ループ抜けの話が出ていたので、質問をさせてください。
例えば、
for i = 1 to 100
if cells(i,1).value like "hoge" then
set cl = cells(i,1)
end if
next
のような形で、該当する最初のセルに処理をした時点でループを抜けるにはどのように記述すれば良いのでしょうか。
上記だと2つ以上の該当があった場合、後のセルがsetされてしまいます。
406:>401
08/10/03 23:22:31
( ゚д゚)
407:デフォルトの名無しさん
08/10/03 23:40:02
>>405
セルをセットした後にExit For
408:デフォルトの名無しさん
08/10/04 00:55:23
ほとんど基礎もできていませんがアドバイスお願いします
自宅にパソがないので平日会社で試すしか方法がないのですが、何枚かのエクセルファイルを開きセルA6に別の表から拾った値を引っ張ります
これがシートならば全シートを選んでVLOOKの式でもA6に入れればいいのでしょうが各ファイルを別々に保存しなければなりません
一度一つのファイルにまとめて入力後またばらしてもいいのですがそれならファイルを開けて手入力する手間とさほど変わりません
多くて40ファイルです
どうぞよろしくお願いしますm(_ _)m
409:デフォルトの名無しさん
08/10/04 01:25:38
>>408
その情報だけだと使えそうな手段は2つくらいしか思いつかない
1.VBAで表をまとめてLOOKUP
2.VBAで該当する値を直接取りにいく
>一度一つのファイルにまとめて入力後またばらしてもいいのですが
何がしたいのかよく分からないw
>ファイルを開けて手入力する
これは目視で値を確認していって該当する値を移すってことでしょうか?
>多くて40ファイルです
40ファイル見るだけなのかすべて更新するのかどちらでしょうか・・・
410:デフォルトの名無しさん
08/10/04 01:47:52
早速のレスを有難うございます。説明が至らずすみません
おそらくあまりに初級なので難しく捕らえていらっしゃるかもしれません
見に行く表にはA列に番号(12桁)B列にも番号(9桁)がありこれが多くても40種の意味です。重複はしていない番号ばかりです
そしてA列の番号がファイル名にもなっている1枚シートしかないファイルのセルA4に先程の12桁が入っているがセルA6に今までは手入力で9桁番号を入れていました
目視です。一応FIND窓で捜しはします…
独立させずシートとしてまとめたら一度に処理できるかと考えたのですが、、
411:デフォルトの名無しさん
08/10/04 02:00:03
すみません余りに眠いのでちょっと離れます
なお40種は40行の意味です
412:デフォルトの名無しさん
08/10/05 09:52:11
>408,410
横レスします。
状況を私なりに解釈し、不足するところをおたずねします。
1 参照元ファイル(以下ブックと呼びます)は最大40個ある
(408の下から2行目の記述から)
2 参照元ブックにはそれぞれ40行×2列(A列、B列)のデータがある
(410の上から3行目の記述と411の「40種は40行」の記述から)
3 (結果を求める)作業用ブックのA4セルに12桁の番号が入っている
(410の上から4行目の記述)
4 作業用ブックのA6セルには今まで9桁番号を手入力していたが → これを自動で表示させたいってこと?
質問
Q1 上の解釈でいいんでしょうか?
Q2 40個のブックはそれぞれシートは何枚ですか? 1枚ずつだったら40シートの1ブックにまとめられませんか?
413:デフォルトの名無しさん
08/10/05 12:46:49
レスを有難うございます
まず参照元と作業用の違いを私自身があまりわかってないかもしれません。携帯からのカキコで字数が限られ申し訳ないです(>_<)
①②→参照する表は1ブックでそこに多くて40行2列、少ない時は10行2列くらいの表が1シートだけに表記してあります
③④→OKです
Q2→確かにひとつのブックにまとめればいいのですが、保存が1ブック1シートでないといけないのです(請求書みたいな感じ)
なおかつそのブック名もセルA4の番号をつけないといけません
15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると間違いや画面の一杯さで
頭がくらくらしてしまい、楽な方法がないかとお尋ねしてみました
まだ言葉足らずかと思いますがどうぞよろしくお願いいたします
414:デフォルトの名無しさん
08/10/05 14:25:37
初心者にありがちなこと:
やりたいことの自分なりの稚拙な解決方法を思いつくのだが、その具体的なやり方がわからずに
ぐだぐだと質問&回答を続ける。
良い質問方法:
やりたいことをまず具体的に書く。やりたいことというのは、ユーザレベルでの話し。
415:デフォルトの名無しさん
08/10/05 15:03:16
すみません本当に初心者なもので……
やりたい事は毎日新たに発生するブックのセルA6に、セルA4に対応した9桁の番号を拾ってきて自動入力し保存するという事です
セルA4に対応した番号は他のブックに見に行きます
この表現ではどうでしょうか? あまりに簡単な作業かもしれませんが良い方法があればよろしくお願いします
416:デフォルトの名無しさん
08/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列
これはどのタイミングでどのような理由で変更されるのか?
417:デフォルトの名無しさん
08/10/05 16:16:17
それから簡単、簡単言うな。
お前が超絶難しいと思ってるものでも、ソルバ一発で解決できる類の問題もあれば、
単純作業を自動化するだけなのに、プログラム的にはすげー面倒な場合もある。
418:デフォルトの名無しさん
08/10/05 17:42:54
はぁー言われてみたらその通りです。こういう表現をするんですね? 確かにこのように書け、と言われたらできるのかどうか
それで1点、OrderBook名には「請求書M...」みたいにセルA4に日本語が3文字ついていたかもしれません
また、10コか40コかはメール受信によって左右されます。メールの添付をどこかのフォルダに保存し何等かのマクロを実行するとよそにそれに対応した9桁の番号が、
検索されるのか作成されるのかするのでそれを本日分として拾ってくるわけです。でセルA6は空白なので入力して完成させる…
自分は記録マクロしかできないのですが、もし自分がVBAに詳しければ①OrderBookのシート1を一つのブックにまとめる
②Productシートもそこに挿入③VlookupでセルA6に値入力④シートをばらして保存
とかが簡単に出来るのかな?のイメージでした;ω;
スミマセン
419:412
08/10/05 17:49:34
>408,410,413,415
もう一回自分なりに解釈したものを書きます。
1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。
(内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測)
2 結果を求める(作業用)ブックは複数生まれる
(413の「保存が1ブック1シートでないといけない」ということと、
「15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると」から推測)
3 作業用ブックは「ひな型」となるものを呼び出してA4セルに12桁の番号を入力し、A6セルには参照元
ブックから自動参照した結果が表示されたところで「12桁の番号」をブック名として名前を付けて保存する
4 上記3を15~40回繰り返す
これでいいのかな?
もし、参照元ブックの名前が固定されているんであればVBAじゃなくてもできそうだけど。
作業用ブックのひな型のある範囲に参照元ブックのデータをまるごと外部参照でもってきておいて、
A6セルにVLOOKUP関数を書いたらいいんじゃないかな。
外部参照って言い方が正しいのかわからないけど、ヘルプで
「ほかのブックやアプリケーションへのリンクを設定する」を見てみてください。
420:412,419
08/10/05 17:50:56
ありゃ、回答を書いているうちに質問者さんからの書き込みがあった。419はなかったことにしてください。
421:デフォルトの名無しさん
08/10/05 18:16:27
お世話になります
3.の行程上でセルA4には12桁の番号が既に入った状態で届きます。こちらで入力はしません
VLOOKもいいのですが作業用ブックの開け閉めが面倒いというか少ない時はいいのですが、多い時にはどれがどれやらわからなくなるのです
422:420
08/10/05 18:41:03
>421
↑のことも入れて、もう一回自分なりに解釈したものを書きます。
1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。
(内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測)
2 結果を求める(作業用)ブックはメールにて複数送られてくる
なので、作業用ブックに個々に計算式等を入れるのは無理(あるいは極力回避)
3 作業用ブックのA4セルには既に12桁の番号が入力されていて、
・現状では 参照元ブックを開いてA列に一致する行のB列の番号(9桁)をA6セルに入力して保存(の繰り返し)
・したいこと マクロブックを開いてマクロを実行したら、複数の作業ブックを手動で開かなくても
それぞれのブックのA6セルに自動的に対応する9桁の番号が記録されている
※作業対象のブックを指定する作業は手動か?
(作業対象ブックが保存されているフォルダを指定できれば自動化も可能)
423:デフォルトの名無しさん
08/10/05 18:52:53
出来の悪いSEと出来の悪いクライアントのgdgdな打ち合わせの例
424:デフォルトの名無しさん
08/10/05 19:10:08
確かに文章だけで説明する事がこんなに大変とは!
'作業対象のブック指定は手動?'の意味が今一つわかりませんがデスクトップにでも予めフォルダごと保存しておいて、作業をしてもらおうか?という算段です
というのも引継ぎでは手入力推奨でしたのでネットワークの中で何かやると怒られるかも?とか考えたり
ま、推奨程度ですからきちんとセルA6に番号が拾えていたら結果オーライだと思うのですが…
425:422
08/10/05 20:00:20
>424
流れとしてこんな感じかな? 画面更新をしないようにすれば画面がチラつきません。
1 作業ブックが収められているフォルダ中のエクセルファイルの一覧取得
2 参照元ブックを開く(ついでに2列×数十行のデータを配列に取得)
3 参照元ブックを閉じる
4 上記1で取得したファイル一覧からひとつずつ処理
(1) カレントブックを開く
(2) A4セルの値を取得
(3) 配列を調べて対応する値をA6セルに書き込む
(4) カレントブックを閉じる(変更確認ダイアログを非表示にしておくといい)
(5) (1)~(4)の繰り返し
5 終了(画面更新再開)
処理がちゃんと進んでいるか確認するために、マクロを記録したブックに
A列:カレントブック名(もしくはフルパス)
B列:A4セルの値
C列:A6セルに書き込んだ値
を上から順に書き込んでみるといい。その場合は画面更新を停止しないように。
426:デフォルトの名無しさん
08/10/05 20:02:14
ググったのですが適切な単語が思いつかなかったので質問させてください。
関数を自作しようと思ったのですが、
その関数が代入されるセルのオブジェクトを取得することは可能でしょうか?
入門サイトを一通り見たのですが、そのような記述が見つかりませんでした・・・。
可能であれば関連するキーワードか、簡単な実装方法など教えていただけるとうれしいです。
427:デフォルトの名無しさん
08/10/05 20:02:53
よろしくお願いします。
OS:XP、Excel2003
Module5で、Public Sub AAA() という関数を作成して
Module1で使おうとすると「名前が適切ではありません」というエラーが出ます。
Module1に関数を作成して、Module5使うことは出来ています。
これは、モジュール名の順番みたいなものが関係しているのでしょうか?
428:デフォルトの名無しさん
08/10/05 20:30:01
質問です。(WinXP,Excel2003)
マルチスレッドで処理をしたいのですがうまくいきません。
以下のテストコード(スレッド系関数の宣言は省略)で、セルへの書き込み自体は問題なく出来るのですが、
エクセル終了時や保存時等ににエクセル自体が落ちてしまいます。
どこが問題なのでしょうか?ご教示お願いします。
'----モジュール------
Public Const STILL_ACTIVE As Long = 259
Public Function testThread(ByVal n As Long) As Long
Dim i
For i = 1 To 10
Sheet1.Cells(1, n) = i
DoEvents
Next i
testThread = 0
End Function
'----シート------
Private Sub test_Click()
Dim hThd, idThd, dwExCode As Long
hThd = CreateThread(0&, 0&, AddressOf testThread, 1, 0&, idThd)
Do
DoEvents
If (GetExitCodeThread(hThd, dwExCode)) Then
If (dwExCode <> STILL_ACTIVE) Then Exit Do
End If
Loop While True
CloseHandle hThd
End Sub
429:デフォルトの名無しさん
08/10/05 21:11:43
>>425
は、はぁ、、そんなかんじかと思いますがそれは記録マクロでできる作業なのでしょうか……
あまりな初級な質問ですみません
430:デフォルトの名無しさん
08/10/05 21:36:03
作ってくださいとちゃんと言えよ、アホ
431:デフォルトの名無しさん
08/10/05 21:37:46
>>428
ド素人がVBAでマルチスレッドを使おうとするのが問題
432:デフォルトの名無しさん
08/10/05 22:21:52
は、はぁ、、例えばコードを書いてもらう事を作るといいますか?
作ってください!お願いします(^人^)
でももしかして記録マクロでもできる人はできるのかと思ったり(自分では無理ですが)……
何か自分の知らない簡単な方法があるような気がしてならなかったり?
433:デフォルトの名無しさん
08/10/05 22:32:39
コード書いてもらう事は、作る事に他ならないが・・・。
作るって、何を作る事だと思う?
と言うか、作成依頼はスレ違い。
自分でやって、分からない事を聞くようにしておくれ。
434:425
08/10/05 22:39:17
>432
このスレの№1の
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
は見てなかったようですね。
自分は明日の夕方以降ならなんとか対応できると思いますが、急ぐんだったら
この件のやりとりの部分 を印刷でもして職場でVBAのわかる人に見せてください。
マクロの記録だけではほとんどできません。条件分岐とか繰り返しとかファイル処理とかいろいろ
あります。
あるフォルダの中のディレクトリ一覧を取得して印刷する部分だけでも↓みたいになります。
URLリンク(www.excel.studio-kazu.jp)
435:デフォルトの名無しさん
08/10/05 22:39:41
皮肉もわからないとかw
436:デフォルトの名無しさん
08/10/05 22:44:42
dirなりなんなりでファイルをリストアップして、オープンしてfindしてrange.valueに代入してセーブしてクローズする
ってだけの簡単なことなんだけど、細かいところが不明なんで丸々作るめんどくさいのでパス。
437:デフォルトの名無しさん
08/10/05 22:46:49
>>425でわかんないなら、もうこのスレ向きの話題じゃなくなった。
438:デフォルトの名無しさん
08/10/05 22:47:20
マァマー(´・ω・`)
439:デフォルトの名無しさん
08/10/05 23:08:07
>>434
エクセルの学校の添付を有難うございました
私自身は忘れているとはいえ?ベーシックくらいは少し学んだのですが全く身についていないようですorz
手でやると、1回なら簡単な作業なのに文章にするとこんなにややこしくなるとは!!
ちょっとこの週末は時間がなかったのですが確かに自分であれこれ試してみたいと思います
会社では現在は時間が全くありませんがそのうち手薄になれば挑戦してみます!
440:デフォルトの名無しさん
08/10/05 23:30:16
昔かじった言語でも、1年経つとほとんど動かせなくなるんだよね。
以前仕事で、とあるScript言語で食ってたんだけど、1年経ったら全部忘れてた。
441:デフォルトの名無しさん
08/10/05 23:32:35
>>426は自己解決しました。(というかバグが別の場所にあることが分かった)
で、もう一つ質問させてください。
自作関数の演算結果を複数のセルに表示したいのですが、
Function func()
func = 1
ActiveCell.Offset(1).Value = 2
End Function
こうやるとこけてしまいます。
funcの返り値でなくActiveCell.Valueに代入すると循環参照で怒られます。
どうにか解決する方法はないのでしょうか?
442:427
08/10/05 23:38:12
>>427
お願いします。
443:デフォルトの名無しさん
08/10/05 23:54:28
>>427,>>442
Module5に作成してModule1で呼ぶのも
Module1に作成してModule5で呼ぶのも
問題なく出来ている
つまり「Module5に作成してModule1で呼ぶ」こと以外に問題があるということだ
ちょっとした自分のミスに気付かず、首を捻り続けたりソフトを疑ったりなんてよくあることだ
まずは新規ブックを作成して、標準モジュールを5個挿入し
Module5にPublic Sub AAA()
Module1にAAAの呼び出しプロシージャだけ書いて実行してみろ
それでダメならExcelもしくはOfficeはたまたWindowsを再インストールした方がいい
これで問題なく実行できるなら、自分のミスに気付いてないだけだ
444:デフォルトの名無しさん
08/10/06 01:10:32
>>440
プロの人でさえ1年で!?
なんとか頑張ってみますと書いたものの、あの業務量を思うと頑張る暇などとてもなくゆーうつ・・・
はぁー、、楽したい。。
445:デフォルトの名無しさん
08/10/06 01:44:55
>>441
URLリンク(support.microsoft.com)
446:441
08/10/06 02:03:42
>>445
こんな・・・制限が・・・あった・・・なん・・・て・・・orz
VBAなんか大っ嫌いだうわあぁぁん
ありがとうございました。本当に助かりました。
447:デフォルトの名無しさん
08/10/06 02:41:53
厨ばっか湧いて来やがるのはなぜだ
448:デフォルトの名無しさん
08/10/06 05:32:26
なんかゴネてる人さあ、、、
まずは、A6にvlookup入れて値コピーで上書きするマクロでも作ったら?
ファイル開いたり保存するのは取り敢えず手動としても、目視手作業で
入力してるよりよっぽど楽になると思う。
そこから徐々に、自動でできる部分を増やしてけばいいんじゃねーの?
あんたがVBA習得するまで仕事が待っててくれるならいいけどさ、
なんも出来ねーくせに余計なことばか考えて、自分で仕事増やしてるだけじゃね?
449:デフォルトの名無しさん
08/10/06 09:12:10
>>444
月100時間勉強するのを三ヶ月位続ければ、あとは楽になるよ
450:デフォルトの名無しさん
08/10/06 19:17:30
皆様お疲れ様です
>>448
それはいい考えだと、本日早速セルA6にA4を見て予め用意した表から拾って来てくれ頼む!を打ち込んだところ………
後ろにもう一枚嫌なシートがあってなんと式がセルA6にそのまま表示されてしまうていたらく
後ろのシートとなんかリンク?が貼ってあるかのような得体のしれなさでもう素直にFIND窓で目視で探しました
件数も15件くらいでしたし
他の仕事があまりに立て込んでてそのシート間の関係さえ検討できないほどの忙しさなのです
もうフラフラです
皆様も季節柄お体気をつけて!
451:デフォルトの名無しさん
08/10/06 19:30:13
えーと、このスレはVBAでプログラミングする人の為のスレだから、
Excelの使い方はよそで聞いて&愚痴ってくれ。
452:デフォルトの名無しさん
08/10/06 20:24:01
記録マクロで挑戦したんですよ~ 一月100時間3ヶ月をいつか夢見て……
453:434
08/10/06 20:52:44
>408,~,452
作ってみました。長いので2件に分けます。
' DEBUG と書かれた行はテストのためにマクロを記録しているブックのアクティブシートに
処理対象ブックのフルパス、12桁の番号、FINDで求めた9桁の番号を表示させるためのもので、
丸々1行消しても動くと思うけど、こちらでは試してません。
例外処理は入れてません。フォルダーのパスとか検索範囲とかもプログラムで直接指定してますが、
マクロを記録しているブックに設定できるようにするとメンテがラクですね。
詳しい方には添削してもらえるとありがたいです。
Option Explicit
Dim BK_M As Excel.Workbook, TATE As Long ' DEBUG
Dim BK_I As Excel.Workbook, BK_O As Excel.Workbook
Dim SEARCH_PATH As String, FILE_NAME As String
Sub prog_408()
Set BK_M = ActiveWorkbook ' DEBUG
' 参照するだけとなるブックのフルパスやファイル名は適当に変えてください。
Workbooks.Open Filename:="D:\TEST_FOLDER\PRODUCT\PRODUCT.xls"
Set BK_I = Workbooks("PRODUCT.xls")
TATE = 3 ' DEBUG
' 変更対象となる10~40個のブックが記録されているフォルダです。
' このフォルダにはメールで送られてくるという処理対象だけのブックを置いておくこと。
SEARCH_PATH = "D:\TEST_FOLDER\"
FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal)
Do While FILE_NAME <> Empty ' 繰り返し
Call PROC_1
Loop
BK_I.Close
Set BK_I = Nothing
Set BK_M = Nothing ' DEBUG
End Sub
454:デフォルトの名無しさん
08/10/06 20:53:51
続きです。
Private Sub PROC_1()
Dim WK_PATH As String, BANGO_12 As String, BANGO_9 As String
Dim c As Excel.Range
WK_PATH = SEARCH_PATH & FILE_NAME
Workbooks.Open Filename:=WK_PATH
Set BK_O = Workbooks(FILE_NAME)
With BK_M.Worksheets(1) ' DEBUG
.Cells(TATE, 1).Value = WK_PATH ' DEBUG A列に処理対象ブックのフルパスを書き込む
BANGO_12 = BK_O.Worksheets(1).Range("A4").Value
.Cells(TATE, 2).Value = BANGO_12 ' DEBUG B列に「12桁の番号」を書き込む
End With ' DEBUG
' 次行のA2:A41は実際のデータの開始位置と考え得る最大の範囲を指定してください。
Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues)
If c Is Nothing Then
BANGO_9 = ""
Else
BANGO_9 = c.Offset(0, 1).Value ' ←ここで9桁の番号が求められました
End If
BK_O.Worksheets(1).Range("A6").Value = BANGO_9 ' ←やりたいこと はこの部分です
BK_M.Worksheets(1).Cells(TATE, 3).Value = BANGO_9 ' DEBUG C列に「9桁の番号」を書き込む
BK_O.Close
Set BK_O = Nothing
TATE = TATE + 1 ' DEBUG
FILE_NAME = Dir()
End Sub
455:デフォルトの名無しさん
08/10/06 21:37:47
y様に頼めば全て解決
はい次の方
456:448
08/10/06 21:40:19
今までさんざんシートは1枚だと言ってたのは嘘か。
もうあきれて物も言えん、、、
457:デフォルトの名無しさん
08/10/07 10:54:20
マンマー(´・ω・`)
458:デフォルトの名無しさん
08/10/07 22:39:19
408,410,411,413,415,418,421,424,429,432,439,450,452の人はもういなくなったのかな?
459:デフォルトの名無しさん
08/10/07 22:54:35
初心者でおじゃまします。
:= ←これはどういう時に使うものですか?
本見てもよくわかりませんでした('A`)
460:デフォルトの名無しさん
08/10/07 23:59:42
>459
詳しい人がいないようなので、未熟ながら小生がヒントを。
上の454のマクロに2カ所使ってありますが、いずれもメソッドのパラメータを指定してますね。
Workbooks.Open Filename:=WK_PATH
→Openメソッドでフォルダのパスを指定(Openには読みとりモードも指定できますが、この場合は
記載してないので規定値ということ)
Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues)
→Findメソッドで値検索を指定
VBAのエディタの画面でsortメソッドのHELPを見てください。10個以上のパラメータを指定できます。
省略できるものもあるので、どのパラメータをどのように指定するかをメソッドの行の中に(見た目は
改行されていてもひとつながりなら1行とみなす)続けて書くときに必要となるものです。
こういう説明でわかりますか?
461:デフォルトの名無しさん
08/10/08 00:02:45
一般に名前付き引数と呼ばれている。
462:460
08/10/08 00:12:19
一部訂正
→Openメソッドでフォルダのパスを指定 じゃなくて、
→Openメソッドでファイルのフルパスを指定 だった。
463:デフォルトの名無しさん
08/10/08 21:17:17
>>453-454さん
お時間を割いて頂きたいへん有難うございました
ノートに早速書き写したところなんと2頁にも及ぶなんて!(記録マクロと大違い)
段落が判らないので近い内ネカフェに印刷しに行けたら、と思っています
本当にありがとうございました
また、余りの忙しさにお礼が遅れすみませんでした
あの後記録マクロに成功し開けたり閉じたり繰り返したりができないものの、VLOOKでショートキーを使い保存までこぎつけました
目視と比べとても楽ちんでした
ところがご指摘のとおり後ろにマクロ用?のようなシートがついているせいか?セルの表示が尋常でなく無理矢理値貼付けで乗り切ったのです
その後9桁の数字が入力されたブックをマクロに通す作業がありましたので
464:sage
08/10/08 21:22:35
今度マクロを使って集計表を作ることになったのですが
その中でVBAという物を使うということで質問をしに来ました。
内容は集計ボタンを押すと
同フォルダ内に配置されてるエクセルのファイル名を読み取って
事前に用意されている集計表の中に概要をコピーするというものです。
集計対象のエクセルは毎週作成され、「ファイル名称(作成日付)」で作られていき
数ヶ月に一度集計ボタンを実行します。
VBA、というかプログラムは全くのド素人ですが、
どういった文法?で作れば良いかなにかヒントだけでも教えて頂ければと思いこのスレに来ました。
皆さんどうか知恵をお貸し頂けないでしょうか、宜しくお願いします。
465:デフォルトの名無しさん
08/10/08 21:36:56
1ブックずつ再度開けて自分のマクロのみ消去するのが面倒くさく、VBAの方を開き自分のショートキーのモジュールを解放しました
間違えて人の(どのブックにも3~5個はある)は解放してないとは思うのですが、その後マクロの消えたブックになったりならなかったり
挙句いつもきちんと実行(9桁の番号が入ったブック達を通す)できていたマクロがデバッグ
とりあえず慌てたものの優先事を片付け、再度初めからメール添付を保存しなおし今度はマクロを使わず手入力し、
手順のマクロを実行すると……………デバッグ
解放がいけなかったのでしょうか
記録マクロがいけなかったのでしょうか
黄色い行には"後ろのシートをアクティブにetc…"となっています。勿論このマクロは私が実行した記録マクロと違いえらい長く書いてある別の仕事の為のマクロです(抽出とまとめ)
466:デフォルトの名無しさん
08/10/08 21:41:57
>>464
>>1★5
ここは右も左も解らない奴が来るところじゃない
どういう処理がしたくて、どういうコードを書いたが、どの部分で躓いてるのかを
具体的に質問できるレベルになってから出直すか
急ぎや勉強が嫌なら、金払ってVBAコード書いてくれるところに依頼しろ
車を運転するには免許が居るように、便利な物を利用するにはそれに応じた資格(スキル)が要る
その資格無しに利便性を求めるなら、車でもタクシー使ったり運転手雇ったりするように
金使って解決しろ
467:デフォルトの名無しさん
08/10/08 21:48:54
指定されたフォルダ中のエクセルファイルの一覧を取得する処理は、
453、454の中に書かれていますよ。
あと、434で紹介されたurlも参考になると思います。
文法云々ということであれば、エクセルVBAの入門書を入手するか、
ウェブの初心者向けサイトを調べてみてください。
それから、このスレの№1をよく読んでください。
468:デフォルトの名無しさん
08/10/08 21:54:43
例えばデバッグの黄色い行を削除したりすればうまくいくのでしょうか
その場合保存さえしなければ誰かが作成された、いつもは健全に働くモジュールを壊す事にはなりませんよね?
いつもエラーなど発生しないのに私が要らないマクロを被せたせいで何かがどうかなったのでしょうか
自分のだけ解放しても他のマクロに影響があるのでしょうか
それだけではないのです
今日は昼飯時に453さんの回答に気づきお礼をカキコするつもりが横に置いていた鞄に散歩中の犬がしっこをかけたのです!
こんな目に遭う人がいますでしょうか
仕事もテンパリは続き少々のアルコールでは何にもなりません
皆様もこの寒暖の激しさにはお気をつけ下さい
469:453,454
08/10/08 22:11:56
>465
まだ、私が453~454に書いたものは実行していないと思いますが、念のため書いておきます。
上記マクロは新規ブックの標準モジュールに書いてください。(ファイル名は任意ですが、
以下の説明ではマクロブックと呼びます)
あなたが仕事で扱うブックには絶対に書かないでください。
エクセルを起動したらマクロブックを開き、ツール-マクロ-編集- prog_408 を選びます。
マクロ文中のフォルダ指定とかセル範囲などを実際のものに変更したうえで、いったん保存。
そのうえでprog_408を実行してみてください。
なお、私はWindowsXp、Excel2003で試しています。
ここまで書いたところで、468を見たので追加
465で書いてある「自分のショートキーのモジュールを解放」が気になる。そのモジュールにはあなたの
マクロだけしか書いてなかったのかな? 本当に「自分のだけ」のモジュールでしょうか?
ひとつのモジュールには複数のマクロが記録されるんですよ。
壊れてしまったものは、現場で対応してもらうしかないと思います。
470:デフォルトの名無しさん
08/10/08 22:56:33
なんなの、最近の流れ
471:デフォルトの名無しさん
08/10/08 23:34:46
スレ№1-★5を読まない初心者ばっかり。
472:デフォルトの名無しさん
08/10/09 00:01:02
469さん、ご丁寧にありがとうございました
モジュールが単独だったか複数かという事ですが、珍しくうまくいった為解放する前にモジュールを表示させて自分の記録マクロを印刷しました
そこには15行程度の構文が書かれていたのみですので下の方にもあったか?となるとおそらくなかったような……
なお記録する前に保存先を作業中のブックよりもう一つ深い範囲に適用する、を選択したと思います
これがいけなかったのかもしれません
あぁ楽をするのも大変ですね……
お先にお休みさせて頂きます。ありがとうございました。。
473:デフォルトの名無しさん
08/10/09 07:42:16
過去スレですね?
現在PC環境にありませんが是非訪ねてみたいと思います! 晴れた今日も良い一日を!!
474:デフォルトの名無しさん
08/10/09 08:47:46
>>473
>>1の★5のことだ・・・
マジでテンプラ読めないやつ増えてるのか?
475:デフォルトの名無しさん
08/10/09 09:51:50
そりゃ犬もションベンかけるわ
476:デフォルトの名無しさん
08/10/09 10:17:49
>>465
どのブックにもVBAモジュールがある…だと?
あんた、「1ブックにはそれぞれ1シートしかないから、全シートを
一旦まとめて、後でまたバラして保存すれば…」なんて書いてたよな。
それでどういうことになるのかわかってるのか?
あんたみたいなのは下手なことに手を出すな。
気づかない内に絶対まわりに迷惑かけてるから。
後始末する側の身にもなれ。
477:デフォルトの名無しさん
08/10/09 11:00:15
2chで相談する前にそのブック配布したやつに相談するのが先だろ・・・
他にVBAとか入ってるなら下手したら変数名とかかぶるし
478:デフォルトの名無しさん
08/10/09 11:17:51
VBAを勉強する前に、「仕事のやり方」から勉強するべき
479:デフォルトの名無しさん
08/10/09 18:06:20
Excel2000でメニュー(データ>並べ替え)で現在のソート状態が表示されますが
この値をVBAで取得する方法があれば教えて下さい。orz
480:デフォルトの名無しさん
08/10/10 21:21:37
2chねらならVBEオブジェクトくらい使ったことあるよな
481:デフォルトの名無しさん
08/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
482:デフォルトの名無しさん
08/10/11 07:15:22
いったんエラー処理はずしてどの行でエラーか書いてくれよ
まあfooかbazに入れてる値がまずいんだろう
483:デフォルトの名無しさん
08/10/11 07:46:33
472です。その節はお世話になりました
犬に聖水をかけられた鞄は無事洗濯いたしました
ところで9桁の番号を取得した後に'抽出とりまとめ'の長いコードの最初でデバッグが出始めた話でしたが
なんと手順を間違えていたらしい事が昨日判明しました
そのとりまとめ用の長いコードを実行するにはエクセルを全部閉じておいて、マクロブックを先に開いた後
例の9桁番号を取得したブックたちを開かなければならなかったのが、9桁の事で頭いっぱいでそちらを先に開いていたのです
恐らくこれが原因だったようです。まだ1回しか成功していませんがこの、全部閉じとけよ!はどのコードだったのでしょう?
しかもそこで黄色になる訳ではないのですね??
もっと丁寧なデバッグ説明表示ならいいのに……
484:デフォルトの名無しさん
08/10/11 07:59:35
なお、1枚だけだと思っていたのにシートがもう一枚あるもののマクロの組んであるブックはごく一部だけで全ブックではありません
ほんとに単純なシートなので高度なコード?ではないようです
デバッグが出てヒィヒィ言っていたマクロブックも長いコードながら実行できない間は手作業でカバーできるものではありました
けれど実行できればそれはそれでたいへん楽です!
なんとか仕事が手薄な時間を作り出し教えて頂いたコードに挑戦できる日がくるのを夢みて…
485:469
08/10/11 10:09:56
>483,484
「全部閉じとけよ!はどのコードだったのでしょう?」への回答→そんなコードはない。
まさか、最大42ものブックを開いたところでマクロを実行させるつもりだったのか?
[42=マクロブック+(2列×40行のデータのブック)+メールで送られる40ブック]
FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal)
Do While FILE_NAME <> Empty ' 繰り返し
Call PROC_1
Loop
と
WK_PATH = SEARCH_PATH & FILE_NAME
Workbooks.Open Filename:=WK_PATH
Set BK_O = Workbooks(FILE_NAME)
~
BK_O.Close
FILE_NAME = Dir()
でファイル一覧からひとつずつ開いて転記してクローズしている。
ちなみに、マクロを実行すると変更を保存するかどうかのダイアログが表示されるはず。
その際A4セルの12桁の番号に対応した9桁の番号がA6セルに入っているので確認できる。
486:481
08/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
487:デフォルトの名無しさん
08/10/11 12:45:27
ByRef渡しでもVBAの方でうまくやってくれたっけ?
488:デフォルトの名無しさん
08/10/11 14:52:03
>>486
だからOn Error外せって
489:デフォルトの名無しさん
08/10/11 16:23:17
>>485
>>483-484は、まだおまいの作ったコードは実行してないと思う
ネカフェで印刷して会社へ持って行って、見ながら手打ちしてからだから、
来年ぐらいじゃないかな
490:479
08/10/11 17:48:11
キーワードを変えてググってみても見つけられなかった。
VBAからソートプロパティを取得する方法は無いのでしょうか?
491:デフォルトの名無しさん
08/10/11 18:52:51
>>486
テキストボックスの値を関数に渡す前にVal()で数値に
変換したら。
492:デフォルトの名無しさん
08/10/11 19:03:24
>>490
> キーワードを変えてググってみても見つけられなかった。
> VBAからソートプロパティを取得する方法は無いのでしょうか?
>
ソートの設定のこと?
これならマクロの記録でできるけど。
Range.Sort Key1:= ・・・・ Order1:= ・・・・
493:デフォルトの名無しさん
08/10/11 19:10:50
>492
これまでの書き込みから、ソートの「設定」ではなく「設定内容の参照」のようです。
なので、今まで回答がない。詳しい人の目にとまるまで回答はないかも。
494:デフォルトの名無しさん
08/10/11 20:58:41
>>479
単純にセルの値取得すればいいだけじゃないの??
495:デフォルトの名無しさん
08/10/11 23:01:15
OS: WindowsXP
Excel: 2007
チャートの目盛線のスタイルを「破線」にしたいと思っていますが、
以下のようなコードを実行しても、「長破線」になってしまいます。
ActiveChart.Axes(xlCategory).MajorGridlines.Border.LineStyle = xlDash
LineStyleの値として設定できる値(xlDash, xlDashDot, xlDashDotDotなど)を
すべて試しましたが、やはり破線にはなりませんでした。
今は、手動で「目盛線の書式設定」→「線のスタイル」→「実線/点線」から、破線に設定しています。
VBAからは、チャートの目盛り線のスタイルを破線にはできないのでしょうか?
496:デフォルトの名無しさん
08/10/12 00:38:29
エクセル2002 ウインドウズxp で質問!
①列を選択
②ダイアログBoxに文字を入れ検索
③検索にヒットしたセルの左のセルに*を入力
具体例
①’D列・F列を選択
②’ダイアログBOXに検索したい文字 イロハ を入力
③’ イロハニホ が入力されてるセルD1の左C1と
アイロノカニ が入力されてるセルF3の左E3に*を入力
この作業のうち②と③(例は②’③’)をマクロで効率化したいと思っています。
詳しい方、コードを教えて下さい m( )m
この板を知る前に総合相談所にカキコしてしまったことをご容赦願います。
497:デフォルトの名無しさん
08/10/12 05:46:19
置換でいいじゃんd
498:デフォルトの名無しさん
08/10/12 07:07:43
>>496
先に総合相談所にも謝って来いよ
499:479
08/10/12 13:44:23
>>493
おっしゃる通り、ソートの設定状態を参照したいのです。
Excelの並べ替えメニューに現在のソート状態が表示されるので、何処かに
ソート状態を保持している筈なのです。
これを取得する方法が分かりません。
500:デフォルトの名無しさん
08/10/12 16:54:02
>499
で、(直前に行われたであろう手動による)ソートの各種設定を参照してナニしようとしてるんですか?
501:デフォルトの名無しさん
08/10/12 17:29:28
>>500
シートAにデータがあり、
シートBがアクティブ時にはシートAの選択データからシートBを編集します
シートCがアクティブ時にはシートAの選択データからシートCを編集します
シートBやシートCを編集する時のシートAのソート条件が異なるので
編集できるかどうかを判断するためにソート状態を知りたいのです。
実際には、プログラム用ブックと上記のデータ用ブックに分かれていて
プログラム用ブック側でデータブックのイベントを拾って汎用的に処理
しています。
502:500
08/10/12 19:23:34
>501
シートAは手動でソートするんですか? シートAのソートをマクロで実行して、
その際のパラメータをデータブックに記録しておけばどうですか?
シートAのソートのパターンをいくつかつくっておいてマクロ実行時選ぶように
したらいいのでは?
503:デフォルトの名無しさん
08/10/12 22:26:40
シートA(B&Cも)は別ブック(任意のデータブック)ですので、単独で開いて
ソートされる事も想定が必要です。
プログラムブックからデータブックを開いて、データブックに定義されている
内容によりデータブックのアクティブシートを編集しています。
データブック側にはVBAコード等の記述は不要であり、プログラムブック側に
VBAコードを記述し、データブックのイベントを拾ってデータブックの編集を
行っています。
データブックは任意のxlsファイルが指定できます。
504:デフォルトの名無しさん
08/10/12 23:42:02
誰か早く無理だって言ってやれよ
505:デフォルトの名無しさん
08/10/13 00:01:29
無理です
506:503
08/10/13 00:02:44
自分も最初は無理だと思っていたのですが、メニューで現在のソート状態が表示
(Excel2000)されている事に気付いたので、取得する方法がある筈と考えた次第
です。
Excel2007を一寸見たら、現在のソート状態は表示されないみたいですね。
諦めかな...
507:デフォルトの名無しさん
08/10/13 00:27:16
無理かどうかは知らんけど、Excelが覚えてるからといって、それを取得できる公開I/Fがあるとは限らない。
508:デフォルトの名無しさん
08/10/13 00:35:54
二つのセルを比較して降順か昇順かしらべることはできるんじゃないの?
509:デフォルトの名無しさん
08/10/13 00:46:52
無理です
510:デフォルトの名無しさん
08/10/13 01:40:17
ExcelVBAの関数のコールグラフを作成してくれるツールってある?
ちなみにDoxygen+VBFilterは関数の中は全く解析してくんなかった。
511:デフォルトの名無しさん
08/10/13 14:36:23
フォルダにある複数の報告書のファイル名を変更したいのですが
方法を知っている方おられませんか?
報告書(Aさん)→済_報告書(Aさん)
報告書(Bさん)→済_報告書(Bさん)
報告書(Cさん)→済_報告書(Cさん)
上記のように
()内の名前が変わってもファイル名を
報告書()→済_報告書()
と変更できる方法を探しています。
何か良い方法を知っている方がいれば教えて頂けないでしょうか?
お願いします。
512:デフォルトの名無しさん
08/10/13 15:12:43
ファイル名を fileName As String とすると、
まず fileName LIKE "報告書(*)" で想定した書式であることを確認した後、
fileName = "済_報告書(" & Mid(fileName,5,Len(fileName)-(4+1)) & ")"
って感じ?
513:デフォルトの名無しさん
08/10/13 16:40:36
>>511
スレ違い
ファイル名変更ぐらいならRENコマンドでできる。
514:512
08/10/13 17:50:21
この条件だと、wsh使わないと一寸厳しいとは思う。
というか、何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
違うの? >>511
515:デフォルトの名無しさん
08/10/13 18:51:55
>>1
516:デフォルトの名無しさん
08/10/13 18:58:06
>>511
Name ステートメント
517:デフォルトの名無しさん
08/10/13 19:15:55
>>514さん
返信遅くなってすみません
レス有難うございます。
>>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。
最初は>>516さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が
ネックになって上手くいきませんでした。
>>513、>>515さん
スレ違いでしたか、すみませんでした。
518:デフォルトの名無しさん
08/10/13 20:08:55
>>506
xlsファイルフォーマットが公開されているので(英語)、
解析してソート部分の設定を読み出すコード書いたら。
519:デフォルトの名無しさん
08/10/13 21:24:53
何がわからないのかわからなかった
520:デフォルトの名無しさん
08/10/13 21:42:57
なんでわかってもらえないのかがわからない
521:デフォルトの名無しさん
08/10/13 22:54:48
なんでわかってもらえると思えるのかがわからない
522:デフォルトの名無しさん
08/10/14 10:15:24
>>506
ヘルプには「シートごとに保存される」
とは書いてあるがどうやって取り出すか書いてないな・・・
ところでそもそも「ソートの設定」で見ようとするのは危なくないか?
コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う
ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う
523:500,502
08/10/14 13:13:28
>506
522に1票
>シートBやシートCを編集する時のシートAのソート条件が異なるので
>編集できるかどうかを判断するためにソート状態を知りたいのです。
とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか?
ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?
524:506
08/10/14 13:22:48
基本的には保存しない前提で考えていたので、コピペは考えていませんでした。
出直します。orz
525:デフォルトの名無しさん
08/10/14 16:26:52
なんで強制的にソートしちゃいけないのかな
Aが一定の条件でソートされてないとBやCの編集ができないのに、
ソートは人まかせってのが不思議
永遠にソートしてくれなかったらどうするんだろう
ソートされてるかどうかを何かのフラグとして扱うつもりなら、
それこそそんなの信用できないんじゃないの
気まぐれでソートして見てみただけかも知れないし
526:デフォルトの名無しさん
08/10/14 16:57:54
私の勘違いだと思うのですが、どうしても分からないのでお尋ねいたします。
文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの
があるようです。具体的な例をあげると、
"ad-02-mb.html"
"ad-02.html"
の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと
なります。マッチング処理ができなくて困っています。解決方法を
お教えください。
527:506
08/10/14 17:42:10
>>525
説明不足でした
BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が
多めに要するという事です。
強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に
戻す必要があります。
別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ
ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。
528:デフォルトの名無しさん
08/10/14 18:03:14
>>526
バージョン差あるかもだけど、option compare は?
>>527
ソートされなくても永遠に作業が滞るわけではないのね。ならよかった
いつの日か希望どおりにソートしてもらえるといいね
529:デフォルトの名無しさん
08/10/14 19:03:09
>>526
その「ソート」って何の事よ
530:デフォルトの名無しさん
08/10/14 19:35:11
>>527
だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。
そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?
531:デフォルトの名無しさん
08/10/14 19:36:19
そぅっとしてやってくれ。
532:デフォルトの名無しさん
08/10/14 21:16:22
早野乙
533:デフォルトの名無しさん
08/10/14 21:58:59
>526
自分のPC(WinXp Excel2003)で試したら再現したので並べ替えのヘルプを見たら原因判明です。
ヘルプから引用
一重引用符 (') とハイフン (-) は無視されます。ただし、ハイフン以外は同じ文字列がある場合、
ハイフンを含む文字列が後に配置されます。
引用終わり
つまり、並べ替えの時は-が無視されるので、ad-02mb.html と ad-02.html が比較される。
先頭から6文字目は"m"と"."なので、"."のあるad-02.htmlが先になる。大小比較のときは"-"も
比較に利用されるので、bd-02-mb.htmlが先になる。
文字コード(10進表記)では、"-":45 ".":46 "m":109 です。
534:526
08/10/15 22:38:35
>533
おーっ、感動の回答!ありがとうございます。
自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。
で、どーすりゃいいのか考えないと。。。
とにかく、ありがとうございました。
535:533
08/10/15 22:54:32
>534
レスがあるとうれしいですね。
引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。
解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか?
処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら
一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。
536:デフォルトの名無しさん
08/10/15 23:00:23
binary
537:デフォルトの名無しさん
08/10/15 23:03:15
ハイフンは、行末で英単語を分割する際に使われるからだな。
538:デフォルトの名無しさん
08/10/15 23:04:22
どのような時に、なぜマッチング処理ができないのかを明記せよ
539:デフォルトの名無しさん
08/10/15 23:08:50
>536
バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか?
エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は
あるけど、バイナリのことは書いてありません。(Excel2003)
540:デフォルトの名無しさん
08/10/15 23:27:30
マッチング処理ってどういう処理をしてるの?
541:デフォルトの名無しさん
08/10/15 23:35:57
比較にstrcompを使った独自ソート関数書けよ
542:デフォルトの名無しさん
08/10/15 23:48:53
>>539
Option Compare ステートメント
543:542
08/10/15 23:52:53
こっちの勘違いにつき、忘れてcくれ(^^;
544:539
08/10/15 23:57:27
>542
エクセルVBAのヘルプを見てみました。
引用はじめ
Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法
である Binary モードが使われます。
引用終わり
ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、
ハイフン"-"を無視しないようにするのは無理なのでは?
545:539
08/10/16 00:03:27
>543
リロードしてませんでした。一晩寝ると忘れますので、ご安心を。
546:デフォルトの名無しさん
08/10/16 01:57:46
で今夜は徹夜ですっと
547:デフォルトの名無しさん
08/10/16 03:44:56
購入日 保証年数
2006/10/05 2
2004/08/12 5
2005/04/22 3
という値があって、購入日から保証年数を足して、今日現在(Date)に達していない(つまりは保証切れ)の場合、
・・・するという場合、
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then 'もし列がA(1)なら
★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then
'今日との日付差がマイナスなら
Target.EntireRow.Font.ColorIndex = 5 'その行のフォント色を青(5)にする
Else
Target.EntireRow.Font.ColorIndex = 0 'その行のフォント色は黒(0)にする
End If
End If
End Sub
保証切れの場合、色をつけたいのですが、
★をどのようにすればいいでしょうか?
548:デフォルトの名無しさん
08/10/16 05:05:36
ある日付から、 n年後 n日後などを求めたい時は dateadd
詳しくはヘルプ読んで
あとそのコードだと保証期間内の時に青になるよ
datediffのヘルプ読んで
549:526
08/10/16 22:42:05
なんだかソートとマッチングの問題でいくつか質問をもらったみたいですが、
Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。
Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、
ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、
アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース
してマッチングする処理にしました。
ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、
=のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの
並び順が異なるために、おかしくなっていました。
みなさんのおかげで、なんとか完成しました。ありがとうございました。
550:デフォルトの名無しさん
08/10/16 22:51:10
説明する気ないのか
551:526
08/10/16 22:52:41
間違えたDo While oldキー >= Newキーはブレーク処理でした。マッチングは
Do While マスターキー >= トランザクションキーでした。
552:デフォルトの名無しさん
08/10/16 23:07:51
もう来なくていいよ
553:デフォルトの名無しさん
08/10/16 23:09:30
そもそもマッチングを勘違いしてると思われる。
554:デフォルトの名無しさん
08/10/17 01:13:46
マイッチングまちこ
てか、正規表現でも使うの?マッチングって事は。