Excel VBA質問スレ Part8
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/08/25(月) 23:16:33前スレ http://pc11.2ch.net/test/read.cgi/tech/1212587819/
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
0526デフォルトの名無しさん
2008/10/14(火) 16:57:54文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの
があるようです。具体的な例をあげると、
"ad-02-mb.html"
"ad-02.html"
の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと
なります。マッチング処理ができなくて困っています。解決方法を
お教えください。
0527506
2008/10/14(火) 17:42:10説明不足でした
BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が
多めに要するという事です。
強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に
戻す必要があります。
別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ
ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。
0528デフォルトの名無しさん
2008/10/14(火) 18:03:14バージョン差あるかもだけど、option compare は?
>>527
ソートされなくても永遠に作業が滞るわけではないのね。ならよかった
いつの日か希望どおりにソートしてもらえるといいね
0529デフォルトの名無しさん
2008/10/14(火) 19:03:09その「ソート」って何の事よ
0530デフォルトの名無しさん
2008/10/14(火) 19:35:11だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。
そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?
0531デフォルトの名無しさん
2008/10/14(火) 19:36:190532デフォルトの名無しさん
2008/10/14(火) 21:16:220533デフォルトの名無しさん
2008/10/14(火) 21:58:59自分のPC(WinXp Excel2003)で試したら再現したので並べ替えのヘルプを見たら原因判明です。
ヘルプから引用
一重引用符 (') とハイフン (-) は無視されます。ただし、ハイフン以外は同じ文字列がある場合、
ハイフンを含む文字列が後に配置されます。
引用終わり
つまり、並べ替えの時は-が無視されるので、ad-02mb.html と ad-02.html が比較される。
先頭から6文字目は"m"と"."なので、"."のあるad-02.htmlが先になる。大小比較のときは"-"も
比較に利用されるので、bd-02-mb.htmlが先になる。
文字コード(10進表記)では、"-":45 ".":46 "m":109 です。
0534526
2008/10/15(水) 22:38:35おーっ、感動の回答!ありがとうございます。
自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。
で、どーすりゃいいのか考えないと。。。
とにかく、ありがとうございました。
0535533
2008/10/15(水) 22:54:32レスがあるとうれしいですね。
引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。
解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか?
処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら
一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。
0536デフォルトの名無しさん
2008/10/15(水) 23:00:230537デフォルトの名無しさん
2008/10/15(水) 23:03:150538デフォルトの名無しさん
2008/10/15(水) 23:04:220539デフォルトの名無しさん
2008/10/15(水) 23:08:50バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか?
エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は
あるけど、バイナリのことは書いてありません。(Excel2003)
0540デフォルトの名無しさん
2008/10/15(水) 23:27:300541デフォルトの名無しさん
2008/10/15(水) 23:35:570542デフォルトの名無しさん
2008/10/15(水) 23:48:53Option Compare ステートメント
0543542
2008/10/15(水) 23:52:530544539
2008/10/15(水) 23:57:27エクセルVBAのヘルプを見てみました。
引用はじめ
Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法
である Binary モードが使われます。
引用終わり
ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、
ハイフン"-"を無視しないようにするのは無理なのでは?
0545539
2008/10/16(木) 00:03:27リロードしてませんでした。一晩寝ると忘れますので、ご安心を。
0546デフォルトの名無しさん
2008/10/16(木) 01:57:460547デフォルトの名無しさん
2008/10/16(木) 03:44:562006/10/05 2
2004/08/12 5
2005/04/22 3
という値があって、購入日から保証年数を足して、今日現在(Date)に達していない(つまりは保証切れ)の場合、
・・・するという場合、
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then 'もし列がA(1)なら
★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then
'今日との日付差がマイナスなら
Target.EntireRow.Font.ColorIndex = 5 'その行のフォント色を青(5)にする
Else
Target.EntireRow.Font.ColorIndex = 0 'その行のフォント色は黒(0)にする
End If
End If
End Sub
保証切れの場合、色をつけたいのですが、
★をどのようにすればいいでしょうか?
0548デフォルトの名無しさん
2008/10/16(木) 05:05:36詳しくはヘルプ読んで
あとそのコードだと保証期間内の時に青になるよ
datediffのヘルプ読んで
0549526
2008/10/16(木) 22:42:05Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。
Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、
ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、
アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース
してマッチングする処理にしました。
ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、
=のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの
並び順が異なるために、おかしくなっていました。
みなさんのおかげで、なんとか完成しました。ありがとうございました。
0550デフォルトの名無しさん
2008/10/16(木) 22:51:100551526
2008/10/16(木) 22:52:41Do While マスターキー >= トランザクションキーでした。
0552デフォルトの名無しさん
2008/10/16(木) 23:07:510553デフォルトの名無しさん
2008/10/16(木) 23:09:300554デフォルトの名無しさん
2008/10/17(金) 01:13:46てか、正規表現でも使うの?マッチングって事は。
0555デフォルトの名無しさん
2008/10/17(金) 02:37:01COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。
0556デフォルトの名無しさん
2008/10/17(金) 10:56:37For〜Next文内で10回ごとにそれぞれ決まった作業を1回だけさせたい場合、
For I = 1 To 1000
「基本作業」
a = Right(I, 2)
If a = 1 Then
「選択作業1」
ElseIf p = 2 Then
「選択作業2」
↓
以下、0まで選択作業計10個
↓
Else
End If
Next I
こんな感じでいいんでしょうか?
今実行環境が無いのでどなたかアドバイスお願いしますorz
0557デフォルトの名無しさん
2008/10/17(金) 11:39:21あくまで自分ならだが
For I = 1 To 1000
'「基本作業」
a = I Mod 10
Select Case a
Case 1
'「選択作業1」
Case 2, 3
'「選択作業2」
End Select
Next I
といった感じにする
0558デフォルトの名無しさん
2008/10/17(金) 11:44:28ありがとう
家に帰ったらいろいろ試してみます
0559デフォルトの名無しさん
2008/10/17(金) 17:54:59とするマクロをVBAで組んだのですが,一回実行した後,
セルの値を1から2を変更しても,実行ボタンをあらためて
押さないと色が青に変わりません。
2を入力すれば直ちにセルの色づけが青に変わるようにする
ためにはどのようなコードを入れればよいのでしょうか。
よろしくお願いします。
0560デフォルトの名無しさん
2008/10/17(金) 18:27:43ボタン押したら色が変わるようにしたんだろ?
だったら当然だな
入力してすぐに変えたければ
1.ボタンはやめてワークシートのChangeイベントで動かす
2.VBAをやめて条件付書式にする
どちらかだな
ところでテンプレ>>1の★5読んだか?
0561デフォルトの名無しさん
2008/10/17(金) 19:06:41ありがとうございます。
まったくの初心者です。場所を間違えたようです。
失礼しました。
0562547
2008/10/17(金) 20:36:21なんですが、
dateaddをして、比較したいのですが、
If Dateadd("y", target.offset(0,1).value, target.value) < Date Then
と、やってみてもダメでした、
Private Sub Worksheet_Change
If Target.Column = 1 Then
に、おいて、特定セルと特定セルの右隣を関数に入れて比較する方法は、
上記であっているのでしょうか?
0563デフォルトの名無しさん
2008/10/17(金) 21:38:26ダメだった時はどうダメだったのかを書こうぜ
> 特定セルと特定セルの右隣を関数に入れて比較
そこは合ってる
で、右隣のセルに入ってるのは日数じゃなく年数でしょ?
後はもっぺんヘルプ読んで
0564デフォルトの名無しさん
2008/10/18(土) 01:46:12条件付書式だかそんな感じの奴でマクロなしでできる
0565547
2008/10/18(土) 04:21:40もう一度考えてみました。
やりたいことと、セルの値
購入日 保証年数
2006/10/05 2 ←保証切れ(青色になって欲しい)
2004/08/12 5 ←保証が切れていない(色は黒色に)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
If DateAdd("d", Target.Cells.Offset(0, 1).Value * 365, Date) < Date Then
' 今日の日付に、Target.Cellsの右に入っている年数×365日を足して、今日の日付と比較
Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If
End If
End Sub
日付を入れると「全部青になってしまいます」
ちなみに
If DateAdd("y", Target.Cells.Offset(0, 1).Value, Date) > Date Then
と年数バージョンでもやってみましたが、同じ結果orzでした。
全然わかりません、足して日付が今日より前なら「保証切れ=青色」にしたいのですが・・。
日付と日付を比較できていないのでしょうか?単位が違う状態で比較しているのでしょうか?
0566デフォルトの名無しさん
2008/10/18(土) 05:47:32おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ
今日の日付に足したら、何足したって未来になるだろw
>>562のでほぼ合ってるんだよ
オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、
おまいのにはないのか?
0567565
2008/10/18(土) 06:29:37yyyyでしたか・・・、さっそく書き換えるといけました!感動しました。
たしかにadddateで今ヘルプを見ると、
設定値 内容
yyyy yyyy
y 年間通算日
yyyy・・・内容書いていませんwww (by Office 2003)
でもyは、その年から何日後という意味なんですね、こんなの思いもよらなかったです。
しかし、大問題が発生しました。
xlsファイルを「開いたときに今日の日付を比較しないといけない」ので、
worksheet_changeじゃだめなんです。
workbookが開いたとき、な方法があればいいのですが、
worksheet_activate、selectionchangeでも反応しませんでした。
Private Sub Worksheet_Change(ByVal Target As Range)
ここをどのように書き換えれば、読み込み時に再判定してくれるのでしょうか?
0568565
2008/10/18(土) 06:53:58たぶん、worksheet_activateイベントで良いと思うのですが、
activateになった時に計算させるということは、
自動的に
Private Sub Worksheet_Activate(ByVal Target As Range)
If Target.Column = 1 Then
If DateAdd("yyyy", Target.Cells.Offset(0, 1).Value, Target.Cells.Value) < Date Then
Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If
End If
End Sub
Private Sub部分を変えただけだと
違うシートを選んで、選択し直すと
「コンパイルエラー プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」
と出ますが、すでに上の言葉が理解できません。
if文以下も変更しなければならないのでしょうか?
byヘルプ
プロシージャの名前はイベントと同じ名前ですが、パラメータの数と型が一致しません。
イベント プロシージャに新しくパラメータを追加したときなどに、このエラーが発生します。
たとえば、フォームの Form_Load イベント プロシージャを次のように変更すると、このエラーが発生します。
ダメです、わけわかりませんorz
0569デフォルトの名無しさん
2008/10/18(土) 08:23:40> yyyy yyyy
ちょwマジでw
おちおち「ヘルプ読め」とも言えんじゃないか
まあそっちは解決したようで良かった
イベント変更の方だが、worksheet_activateは引数を取らないから、
そうなるのは当然だな
引数を消して、targetを自前で指定してやればOK
つか、workbook_openイベントもあるんだが
つか、今さらだけど、
色変えたいだけなら条件付き書式でもできるがw
0570デフォルトの名無しさん
2008/10/19(日) 02:32:280571568
2008/10/19(日) 02:58:41>色変えたいだけなら条件付き書式でもできるがw
こ、こんなのあったんですか・・。
春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。
わざわざVBAを使う必要無かったんだ・・・。
___________
||
|| ⊂⊃
|| ∧ ∧
|| ( ⌒ ヽ でも勉強にナターヨ・・・
∧||∧ ∪ ノ
( ⌒ ヽ 彡 V
∪ ノ フワーリ
∪∪
0572デフォルトの名無しさん
2008/10/19(日) 03:29:41>>559もそうだし、こういう奴、実は多いのか?
何という時間の無駄
0573デフォルトの名無しさん
2008/10/19(日) 07:09:25ァ ∧_∧ ァ,、
,、'` 。゚( ゚^∀^゚)゚。,、'`
'` ( ⊃ ⊂) '`
0574デフォルトの名無しさん
2008/10/19(日) 07:12:510575デフォルトの名無しさん
2008/10/19(日) 12:16:550576デフォルトの名無しさん
2008/10/19(日) 17:15:030577デフォルトの名無しさん
2008/10/19(日) 20:25:44Excel総合相談所74で質問が出てますよ。(レス番号325です)
0578デフォルトの名無しさん
2008/10/19(日) 20:49:32この手ので延々悩むんよね
心理的ハードルを超えさせる書式の魔力おそるべし
0579デフォルトの名無しさん
2008/10/19(日) 21:31:474色問題お願いします。
0580デフォルトの名無しさん
2008/10/19(日) 22:29:21ありがと
解決済みだった
>>579
全ての図形が4色で塗り分けられるとかなんとかだよね
図形の形とか定義あるのかな?
セルに色塗るなら二色で出来ちゃうし
0581デフォルトの名無しさん
2008/10/19(日) 22:33:43格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?
0582デフォルトの名無しさん
2008/10/19(日) 22:43:16あります
入力規則のリストなら、マクロの記録録ればわかります
コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます
但しフォームツールのコンボボックスなら多分セル書き出し必須
0584デフォルトの名無しさん
2008/10/19(日) 22:51:024色問題ってこんな感じのです。
ttp://yougo.ascii.jp/caltar/4%E8%89%B2%E5%95%8F%E9%A1%8C
0585デフォルトの名無しさん
2008/10/19(日) 22:59:02ありがとう
1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす
2.領域ごとに、隣り合わせ同色にならないように色IDを付ける
3.色IDが1から4で収まっているか判定
っていうアプローチでよいかなあ
アルゴリズムの問題っぽいがw
0586デフォルトの名無しさん
2008/10/19(日) 23:36:57出力するのに時間がかかります。たとえば
Dim X(10000, 10) As Double
Dim I As Integer
Dim J As Integer
'計算
For I = 1 To 10000
For J = 1 To 10
X(I, J) = Sqr(I) * Sqr(J)
Next J
Next I
' 出力
For I = 1 To 10000
For J = 1 To 10
Cells(I, J) = X(I, J)
Next J
Next I
で出力の所要時間を計算時間と同程度にすることができるような
出力の書き方があれば教えてください。
0587デフォルトの名無しさん
2008/10/19(日) 23:51:32For J = 1 To 10
Cells(I, J) = Sqr(I) * Sqr(J)
Next J
Next I
0588デフォルトの名無しさん
2008/10/19(日) 23:51:40forの前に
Application.ScreenUpdating = False
を入れると、シートの描画しないから早くなる
少しずつ描画見たいなら、例えばNextの間に
Application.ScreenUpdating = Tlue
Application.ScreenUpdating = False
を追加すると、Iが一つ進むごとに描画される
例えばIが100ごとに実行したいなら
J Mod 100 使ったりできる
0589デフォルトの名無しさん
2008/10/19(日) 23:54:010590デフォルトの名無しさん
2008/10/20(月) 00:20:5521秒から13秒に8秒も短縮できました。ありがとうございます。
>589
具体的に「そのまま書き出す」ってどうすればいいんですか?
よろしくお願いします。
0591デフォルトの名無しさん
2008/10/20(月) 00:29:07>>589じゃないけど、
range(cells(1,1),(cells(10000,10)) = X
0592591
2008/10/20(月) 00:30:17range(cells(1,1),cells(10000,10)) = X
0593デフォルトの名無しさん
2008/10/20(月) 00:36:38変数に+1しる。
0594デフォルトの名無しさん
2008/10/20(月) 00:41:35やってみました。1秒かからないんですね!ありがとうございました。
0595デフォルトの名無しさん
2008/10/20(月) 00:42:22変数に+1するのもお勧めできない
X(1 To 10000,1 To 10)にしる
0596デフォルトの名無しさん
2008/10/20(月) 00:49:07Range(Cells(1, 1), Cells(1000, 10)) = X(1 To 10000,1 To 10)
とするとコンパイルエラーがでるんですが・・・。
0597デフォルトの名無しさん
2008/10/20(月) 00:52:29違う違うw
1 to 10000 とかを書くのは dim のとこ
0598デフォルトの名無しさん
2008/10/20(月) 00:56:26Dim X(1 To 10000, 1 To 10) As Double
でしたね。失礼しました。
みなさんどうもありがとうございました。
0599デフォルトの名無しさん
2008/10/20(月) 02:02:50VBAはクアッドコアに対応しているの?
コア4つのVBAはやはり処理が早いんだろうか・・。
0600デフォルトの名無しさん
2008/10/20(月) 04:35:01余談だけどフォームの方もできる
0601デフォルトの名無しさん
2008/10/20(月) 06:43:22文字列の入ったセルをselectした際に、単にselectにするだけではなく、
編集中の状態にまでもっていきたいのですが、
そのような方法を御存じないでしょうか。
select後、sendkeys"{F2}"で実現できるのですが、
Sendkeysを使用しない方法を探しています。どうか宜しくお願いします。
0602デフォルトの名無しさん
2008/10/20(月) 08:24:460603デフォルトの名無しさん
2008/10/20(月) 13:42:570604デフォルトの名無しさん
2008/10/20(月) 13:52:14Sheet2以降のセルA1に、「=Sheet1!A1」と入力。
0605デフォルトの名無しさん
2008/10/20(月) 13:54:490606デフォルトの名無しさん
2008/10/20(月) 14:05:48d
0607デフォルトの名無しさん
2008/10/20(月) 16:56:040608デフォルトの名無しさん
2008/10/20(月) 18:13:530609デフォルトの名無しさん
2008/10/20(月) 20:11:15まず、複数スレッドを作ることが実質的に無理だ。
Excel自体も、2007から再計算を複数スレッドで行えるようになったくらい。
0610デフォルトの名無しさん
2008/10/20(月) 20:17:310611デフォルトの名無しさん
2008/10/21(火) 15:00:07行った後、再度元の並びに戻す方法を模索中です。
1)選択行範囲の最後(列n)に式["=ROW()"]を設定
2)列nの式を値に変更(コピぺ)
*ソートと処理を行う
4)列nで昇順にソートした後、列nを削除
この方法だと選択範囲内に不可視のデータが存在すると、[2)]でコピーと貼付け
の領域が違うため貼付けエラーになります。
1行ずつ行番号をセットする方法は件数が多いと時間が掛かる為オートフィルター
情報を取得しておき、一旦オートフィルターオフにしてからコピペしています。
他にもっと良い方法をご存知でしたら御教授願います。
選択データを他ワークシートにコピーして処理する方法が一番良い気もしますが
データ量が三万件とかだとコピーにも多少時間が掛かるので...
0612デフォルトの名無しさん
2008/10/21(火) 17:29:28仮に、"=row()" を入れた範囲を range("G5:G10") として、
G列を非表示にして、
range("G5:G10").value = range("G5:G10").value
ってのはダメ?
0614デフォルトの名無しさん
2008/10/21(火) 18:33:320615デフォルトの名無しさん
2008/10/21(火) 19:41:59わからん。なんかやってみたらできた
仕様なのかバグなのかも知らんw
0616デフォルトの名無しさん
2008/10/21(火) 21:01:59どうやら仕様くさい
0617VBAの初心者
2008/10/21(火) 21:24:20無くよく分らなくてもし良かったら教えて下さい。
だだ走らせるだけの凄い簡単なプログラムらしいんですが私には走らせ方が分らな
くて困ってます。
10 for m=1 to12
20 print m
30 next m
40 stop
なんですが凄い初心者なのでエクセル開いた所から分らなくて教えて下さい。
0618デフォルトの名無しさん
2008/10/21(火) 21:27:300619VBAの初心者
2008/10/21(火) 21:30:01なってしまったので、まず見れる簡単なの教えてと頼んだんですが、今のじゃ無理
なんでしょうか;
0620デフォルトの名無しさん
2008/10/21(火) 21:50:26VBAも含めてナントカBasicってのは山ほどあるけど、どれも全く別物。
敢えて共通点をあげるとしたら名前にBasicが付いていることだけ、というのはさすがに言い過ぎだけど。
そして、お前は何をやりたいのか。Excel VBAで間違いないんだよな?
0621デフォルトの名無しさん
2008/10/21(火) 22:39:240622デフォルトの名無しさん
2008/10/21(火) 23:24:210623デフォルトの名無しさん
2008/10/22(水) 07:27:310624デフォルトの名無しさん
2008/10/22(水) 10:00:180625デフォルトの名無しさん
2008/10/23(木) 00:27:13■ このスレッドは過去ログ倉庫に格納されています