[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 10/24 21:30 / Filesize : 261 KB / Number-of Response : 870
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part8



1 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 23:16:33 ]
ExcelのVBAに関する質問スレです

前スレ pc11.2ch.net/test/read.cgi/tech/1212587819/

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
   
 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。 
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

516 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:58:06 ]
>>511
Name ステートメント

517 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:15:55 ]
>>514さん
返信遅くなってすみません
レス有難うございます。

>>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。
最初は>>516さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が
ネックになって上手くいきませんでした。

>>513>>515さん
スレ違いでしたか、すみませんでした。

518 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 20:08:55 ]
>>506
xlsファイルフォーマットが公開されているので(英語)、
解析してソート部分の設定を読み出すコード書いたら。

519 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:24:53 ]
何がわからないのかわからなかった

520 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:42:57 ]
なんでわかってもらえないのかがわからない

521 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:54:48 ]
なんでわかってもらえると思えるのかがわからない

522 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 10:15:24 ]
>>506
ヘルプには「シートごとに保存される」
とは書いてあるがどうやって取り出すか書いてないな・・・

ところでそもそも「ソートの設定」で見ようとするのは危なくないか?
コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う
ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う

523 名前:500,502 mailto:sage [2008/10/14(火) 13:13:28 ]
>506
522に1票
>シートBやシートCを編集する時のシートAのソート条件が異なるので
>編集できるかどうかを判断するためにソート状態を知りたいのです。
とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか?
ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?

524 名前:506 [2008/10/14(火) 13:22:48 ]
基本的には保存しない前提で考えていたので、コピペは考えていませんでした。
出直します。orz




525 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 16:26:52 ]
なんで強制的にソートしちゃいけないのかな
Aが一定の条件でソートされてないとBやCの編集ができないのに、
ソートは人まかせってのが不思議
永遠にソートしてくれなかったらどうするんだろう

ソートされてるかどうかを何かのフラグとして扱うつもりなら、
それこそそんなの信用できないんじゃないの
気まぐれでソートして見てみただけかも知れないし

526 名前:デフォルトの名無しさん [2008/10/14(火) 16:57:54 ]
私の勘違いだと思うのですが、どうしても分からないのでお尋ねいたします。
文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの
があるようです。具体的な例をあげると、
"ad-02-mb.html"
"ad-02.html"
の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと
なります。マッチング処理ができなくて困っています。解決方法を
お教えください。


527 名前:506 mailto:sage [2008/10/14(火) 17:42:10 ]
>>525
説明不足でした
BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が
多めに要するという事です。
強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に
戻す必要があります。
別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ
ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。



528 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 18:03:14 ]
>>526
バージョン差あるかもだけど、option compare は?

>>527
ソートされなくても永遠に作業が滞るわけではないのね。ならよかった
いつの日か希望どおりにソートしてもらえるといいね

529 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:03:09 ]
>>526
その「ソート」って何の事よ

530 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:35:11 ]
>>527
だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。
そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?

531 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:36:19 ]
そぅっとしてやってくれ。

532 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:16:22 ]
早野乙

533 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/10/15(水) 22:38:35 ]
>533
おーっ、感動の回答!ありがとうございます。
自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。
で、どーすりゃいいのか考えないと。。。
とにかく、ありがとうございました。



535 名前:533 mailto:sage [2008/10/15(水) 22:54:32 ]
>534
レスがあるとうれしいですね。
引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。

解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか?
処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら
一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。

536 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:00:23 ]
binary

537 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:03:15 ]
ハイフンは、行末で英単語を分割する際に使われるからだな。

538 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:04:22 ]
どのような時に、なぜマッチング処理ができないのかを明記せよ

539 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:08:50 ]
>536
バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか?
エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は
あるけど、バイナリのことは書いてありません。(Excel2003)

540 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:27:30 ]
マッチング処理ってどういう処理をしてるの?

541 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:35:57 ]
比較にstrcompを使った独自ソート関数書けよ

542 名前:デフォルトの名無しさん [2008/10/15(水) 23:48:53 ]
>>539
Option Compare ステートメント

543 名前:542 mailto:sage [2008/10/15(水) 23:52:53 ]
こっちの勘違いにつき、忘れてcくれ(^^;

544 名前:539 mailto:sage [2008/10/15(水) 23:57:27 ]
>542
エクセルVBAのヘルプを見てみました。
引用はじめ
Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法
である Binary モードが使われます。
引用終わり
ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、
ハイフン"-"を無視しないようにするのは無理なのでは?



545 名前:539 mailto:sage [2008/10/16(木) 00:03:27 ]
>543
リロードしてませんでした。一晩寝ると忘れますので、ご安心を。

546 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:57:46 ]
で今夜は徹夜ですっと

547 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 05:05:36 ]
ある日付から、 n年後 n日後などを求めたい時は dateadd
詳しくはヘルプ読んで
あとそのコードだと保証期間内の時に青になるよ
datediffのヘルプ読んで

549 名前:526 mailto:sage [2008/10/16(木) 22:42:05 ]
なんだかソートとマッチングの問題でいくつか質問をもらったみたいですが、
Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。
Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、
ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、
アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース
してマッチングする処理にしました。
ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、
=のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの
並び順が異なるために、おかしくなっていました。
みなさんのおかげで、なんとか完成しました。ありがとうございました。



550 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 22:51:10 ]
説明する気ないのか

551 名前:526 mailto:sage [2008/10/16(木) 22:52:41 ]
間違えたDo While oldキー >= Newキーはブレーク処理でした。マッチングは
Do While マスターキー >= トランザクションキーでした。


552 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 23:07:51 ]
もう来なくていいよ

553 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 23:09:30 ]
そもそもマッチングを勘違いしてると思われる。

554 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 01:13:46 ]
マイッチングまちこ


てか、正規表現でも使うの?マッチングって事は。



555 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 02:37:01 ]
ブレーク処理とかマッチング処理なんて言葉が出てくるのは業務系のコボラーに多いな。
COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。

556 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 10:56:37 ]
ものすごくアフォな質問で申し訳ないんですが教えてください
For〜Next文内で10回ごとにそれぞれ決まった作業を1回だけさせたい場合、

For I = 1 To 1000
「基本作業」
a = Right(I, 2)
If a = 1 Then
「選択作業1」
ElseIf p = 2 Then
「選択作業2」

以下、0まで選択作業計10個

Else
End If
Next I

こんな感じでいいんでしょうか?
今実行環境が無いのでどなたかアドバイスお願いしますorz

557 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 11:39:21 ]
>>556
あくまで自分ならだが
For I = 1 To 1000
 '「基本作業」
 a = I Mod 10
 Select Case a
  Case 1
  '「選択作業1」
  Case 2, 3
  '「選択作業2」
 End Select
Next I

といった感じにする

558 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 11:44:28 ]
>>557
ありがとう
家に帰ったらいろいろ試してみます

559 名前:デフォルトの名無しさん [2008/10/17(金) 17:54:59 ]
セルの値が1のときセルの色づけ赤,2のときセルの色づけ青
とするマクロをVBAで組んだのですが,一回実行した後,
セルの値を1から2を変更しても,実行ボタンをあらためて
押さないと色が青に変わりません。
2を入力すれば直ちにセルの色づけが青に変わるようにする
ためにはどのようなコードを入れればよいのでしょうか。
よろしくお願いします。

560 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 18:27:43 ]
>>559
ボタン押したら色が変わるようにしたんだろ?
だったら当然だな

入力してすぐに変えたければ
1.ボタンはやめてワークシートのChangeイベントで動かす
2.VBAをやめて条件付書式にする
どちらかだな

ところでテンプレ>>1の★5読んだか?

561 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 19:06:41 ]
>>560
ありがとうございます。
まったくの初心者です。場所を間違えたようです。
失礼しました。

562 名前:547 mailto:sage [2008/10/17(金) 20:36:21 ]
> ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then

なんですが、
dateaddをして、比較したいのですが、

If Dateadd("y", target.offset(0,1).value, target.value) < Date Then
と、やってみてもダメでした、

Private Sub Worksheet_Change
If Target.Column = 1 Then

に、おいて、特定セルと特定セルの右隣を関数に入れて比較する方法は、
上記であっているのでしょうか?

563 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 21:38:26 ]
>>562
ダメだった時はどうダメだったのかを書こうぜ

> 特定セルと特定セルの右隣を関数に入れて比較
そこは合ってる
で、右隣のセルに入ってるのは日数じゃなく年数でしょ?
後はもっぺんヘルプ読んで

564 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 01:46:12 ]
>>559
条件付書式だかそんな感じの奴でマクロなしでできる



565 名前:547 mailto:sage [2008/10/18(土) 04:21:40 ]
>>563
もう一度考えてみました。

やりたいことと、セルの値
購入日   保証年数
2006/10/05  2 ←保証切れ(青色になって欲しい)
2004/08/12  5 ←保証が切れていない(色は黒色に)

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
If DateAdd("d", Target.Cells.Offset(0, 1).Value * 365, Date) < Date Then
  ' 今日の日付に、Target.Cellsの右に入っている年数×365日を足して、今日の日付と比較

Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If

End If
End Sub

日付を入れると「全部青になってしまいます」
ちなみに
If DateAdd("y", Target.Cells.Offset(0, 1).Value, Date) > Date Then
と年数バージョンでもやってみましたが、同じ結果orzでした。

全然わかりません、足して日付が今日より前なら「保証切れ=青色」にしたいのですが・・。
日付と日付を比較できていないのでしょうか?単位が違う状態で比較しているのでしょうか?

566 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 05:47:32 ]
>>565
おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ
今日の日付に足したら、何足したって未来になるだろw

>>562のでほぼ合ってるんだよ
オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、
おまいのにはないのか?

567 名前:565 mailto:sage [2008/10/18(土) 06:29:37 ]
ありがとうございます。
yyyyでしたか・・・、さっそく書き換えるといけました!感動しました。
たしかにadddateで今ヘルプを見ると、

設定値 内容
yyyy yyyy
y 年間通算日

yyyy・・・内容書いていませんwww (by Office 2003)
でもyは、その年から何日後という意味なんですね、こんなの思いもよらなかったです。


しかし、大問題が発生しました。
xlsファイルを「開いたときに今日の日付を比較しないといけない」ので、
worksheet_changeじゃだめなんです。

workbookが開いたとき、な方法があればいいのですが、
worksheet_activate、selectionchangeでも反応しませんでした。

Private Sub Worksheet_Change(ByVal Target As Range)
ここをどのように書き換えれば、読み込み時に再判定してくれるのでしょうか?

568 名前:565 mailto:sage [2008/10/18(土) 06:53:58 ]
何度もすいません、
たぶん、worksheet_activateイベントで良いと思うのですが、

activateになった時に計算させるということは、
自動的に

Private Sub Worksheet_Activate(ByVal Target As Range)

If Target.Column = 1 Then
If DateAdd("yyyy", Target.Cells.Offset(0, 1).Value, Target.Cells.Value) < Date Then
Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If
End If
End Sub

Private Sub部分を変えただけだと
違うシートを選んで、選択し直すと

「コンパイルエラー プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」
と出ますが、すでに上の言葉が理解できません。
if文以下も変更しなければならないのでしょうか?

byヘルプ
プロシージャの名前はイベントと同じ名前ですが、パラメータの数と型が一致しません。
イベント プロシージャに新しくパラメータを追加したときなどに、このエラーが発生します。
たとえば、フォームの Form_Load イベント プロシージャを次のように変更すると、このエラーが発生します。

ダメです、わけわかりませんorz

569 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 08:23:40 ]
>>567-568
> yyyy yyyy
ちょwマジでw
おちおち「ヘルプ読め」とも言えんじゃないか
まあそっちは解決したようで良かった

イベント変更の方だが、worksheet_activateは引数を取らないから、
そうなるのは当然だな
引数を消して、targetを自前で指定してやればOK

つか、workbook_openイベントもあるんだが
つか、今さらだけど、
色変えたいだけなら条件付き書式でもできるがw

570 名前:デフォルトの名無しさん [2008/10/19(日) 02:32:28 ]
VBAにEffective C++やEffective Javaみたいなガイドラインってある?

571 名前:568 mailto:sage [2008/10/19(日) 02:58:41 ]
>>569
>色変えたいだけなら条件付き書式でもできるがw

こ、こんなのあったんですか・・。
春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。

わざわざVBAを使う必要無かったんだ・・・。
___________
   ||     
   ||     ⊂⊃
   ||    ∧ ∧
   ||    (  ⌒ ヽ でも勉強にナターヨ・・・
 ∧||∧   ∪  ノ
(  ⌒ ヽ 彡  V
 ∪  ノ  フワーリ
  ∪∪

572 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 03:29:41 ]
ほんとに色変えるだけなのかよwまいったw

>>559もそうだし、こういう奴、実は多いのか?
何という時間の無駄

573 名前:デフォルトの名無しさん [2008/10/19(日) 07:09:25 ]
悪いけど笑わせてもらう


  ァ   ∧_∧ ァ,、
 ,、'` 。゚( ゚^∀^゚)゚。,、'`
  '`   ( ⊃ ⊂)  '`




574 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 07:12:51 ]
関数でできることをマクロでやろうとしたり、案外よくあるよな



575 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 12:16:55 ]
だんだんとワークシート関数がウザくなってくるんだよなw


576 名前:デフォルトの名無しさん [2008/10/19(日) 17:15:03 ]
暇だから何か問題だしやが……出して下さい

577 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 20:25:44 ]
>576
Excel総合相談所74で質問が出てますよ。(レス番号325です)

578 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 20:49:32 ]
プログラミング初心者かつエクセルにも詳しくない奴が、
この手ので延々悩むんよね
心理的ハードルを超えさせる書式の魔力おそるべし

579 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 21:31:47 ]
>>576
4色問題お願いします。

580 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:29:21 ]
>>577
ありがと
解決済みだった

>>579
全ての図形が4色で塗り分けられるとかなんとかだよね
図形の形とか定義あるのかな?

セルに色塗るなら二色で出来ちゃうし

581 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:33:43 ]
二次元配列に書き出したセル範囲のデータををリストないしはコンボボックスに
格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?

582 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:43:16 ]
>>581
あります

入力規則のリストなら、マクロの記録録ればわかります
コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます
但しフォームツールのコンボボックスなら多分セル書き出し必須

583 名前:581 mailto:sage [2008/10/19(日) 22:50:06 ]
>>582
すみませんコントロールツールボックスの方です
シートに書き出せばRowSourceプロパティで簡単なのは存じてますが…


584 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:51:02 ]
>>580
4色問題ってこんな感じのです。
ttp://yougo.ascii.jp/caltar/4%E8%89%B2%E5%95%8F%E9%A1%8C



585 名前:デフォルトの名無しさん [2008/10/19(日) 22:59:02 ]
>>584
ありがとう

1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす

2.領域ごとに、隣り合わせ同色にならないように色IDを付ける

3.色IDが1から4で収まっているか判定


っていうアプローチでよいかなあ
アルゴリズムの問題っぽいがw

586 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:36:57 ]
セルに依存しない計算は速いのですが結果をセルに
出力するのに時間がかかります。たとえば

Dim X(10000, 10) As Double
Dim I As Integer
Dim J As Integer

'計算
For I = 1 To 10000
For J = 1 To 10
X(I, J) = Sqr(I) * Sqr(J)
Next J
Next I

' 出力
For I = 1 To 10000
For J = 1 To 10
Cells(I, J) = X(I, J)
Next J
Next I

で出力の所要時間を計算時間と同程度にすることができるような
出力の書き方があれば教えてください。


587 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:51:32 ]
For I = 1 To 10000
For J = 1 To 10
Cells(I, J) = Sqr(I) * Sqr(J)
Next J
Next I

588 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:51:40 ]
ちらつき抑制でよいかな?

forの前に

Application.ScreenUpdating = False

を入れると、シートの描画しないから早くなる
少しずつ描画見たいなら、例えばNextの間に
Application.ScreenUpdating = Tlue
Application.ScreenUpdating = False
を追加すると、Iが一つ進むごとに描画される

例えばIが100ごとに実行したいなら

J Mod 100 使ったりできる

589 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:54:01 ]
つーか、配列を0始まりではなく1始まりにしてそのまま書き出したらいいやん

590 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:20:55 ]
>588
21秒から13秒に8秒も短縮できました。ありがとうございます。

>589
具体的に「そのまま書き出す」ってどうすればいいんですか?
よろしくお願いします。


591 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:29:07 ]
>>590
>>589じゃないけど、
range(cells(1,1),(cells(10000,10)) = X

592 名前:591 mailto:sage [2008/10/20(月) 00:30:17 ]
タイプミス
range(cells(1,1),cells(10000,10)) = X

593 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:36:38 ]
base 1 にするのはお勧めできない。
変数に+1しる。


594 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:41:35 ]
592>>

やってみました。1秒かからないんですね!ありがとうございました。




595 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:42:22 ]
base 1 にするのはお勧めできないが
変数に+1するのもお勧めできない
X(1 To 10000,1 To 10)にしる

596 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:49:07 ]
すみません
Range(Cells(1, 1), Cells(1000, 10)) = X(1 To 10000,1 To 10)
とするとコンパイルエラーがでるんですが・・・。

597 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:52:29 ]
>>596
違う違うw
1 to 10000 とかを書くのは dim のとこ

598 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:56:26 ]

Dim X(1 To 10000, 1 To 10) As Double
でしたね。失礼しました。
みなさんどうもありがとうございました。

599 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 02:02:50 ]
EXCEL XP, 2000, 2003, 2007において、
VBAはクアッドコアに対応しているの?

コア4つのVBAはやはり処理が早いんだろうか・・。

600 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 04:35:01 ]
>>582
余談だけどフォームの方もできる

601 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 06:43:22 ]
すみません
文字列の入ったセルをselectした際に、単にselectにするだけではなく、
編集中の状態にまでもっていきたいのですが、
そのような方法を御存じないでしょうか。
select後、sendkeys"{F2}"で実現できるのですが、
Sendkeysを使用しない方法を探しています。どうか宜しくお願いします。

602 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 08:24:46 ]
数式バーで編集じゃだめなの?

603 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:42:57 ]
Excel2003でSheet1のセルA1に日付を入れる(08/10/01)とSheet2以降のセルA1に次の日付になるように反映させるにはどうしたらいいですか?

604 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:52:14 ]
>>603
Sheet2以降のセルA1に、「=Sheet1!A1」と入力。



605 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:54:49 ]
+1忘れた

606 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 14:05:48 ]
>>604
d

607 名前:デフォルトの名無しさん [2008/10/20(月) 16:56:04 ]
どこがVBAやねん

608 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 18:13:53 ]
春から悩んでたかも知れないじゃないか

609 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 20:11:15 ]
>>599
まず、複数スレッドを作ることが実質的に無理だ。
Excel自体も、2007から再計算を複数スレッドで行えるようになったくらい。

610 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 20:17:31 ]
依存関係ありまくりの計算だからなあ。

611 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:00:07 ]
オートフィルターがオンになっているシートの選択行について、ソートと処理を
行った後、再度元の並びに戻す方法を模索中です。

1)選択行範囲の最後(列n)に式["=ROW()"]を設定
2)列nの式を値に変更(コピぺ)
*ソートと処理を行う
4)列nで昇順にソートした後、列nを削除

この方法だと選択範囲内に不可視のデータが存在すると、[2)]でコピーと貼付け
の領域が違うため貼付けエラーになります。

1行ずつ行番号をセットする方法は件数が多いと時間が掛かる為オートフィルター
情報を取得しておき、一旦オートフィルターオフにしてからコピペしています。
他にもっと良い方法をご存知でしたら御教授願います。

選択データを他ワークシートにコピーして処理する方法が一番良い気もしますが
データ量が三万件とかだとコピーにも多少時間が掛かるので...

612 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 17:29:28 ]
>>611
仮に、"=row()" を入れた範囲を range("G5:G10") として、
G列を非表示にして、
range("G5:G10").value = range("G5:G10").value
ってのはダメ?

613 名前:611 mailto:sage [2008/10/21(火) 18:27:03 ]
>>612
助かりました、有難うございます。orz

だけど、非表示だと何故上手くいくのでしょう?

614 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 18:33:32 ]
どこがVBAの問題なのか春先まで悩みそうだ



615 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 19:41:59 ]
>>613
わからん。なんかやってみたらできた
仕様なのかバグなのかも知らんw

616 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:01:59 ]
非表示だと pastespecial もうまくいくな
どうやら仕様くさい






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<261KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef