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)
0577デフォルトの名無しさん
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:130626デフォルトの名無しさん
2008/10/23(木) 19:16:21個数や上限決めておらず、必要に応じて作る場合とか
1万や2万は当たり前に使ってることあるが
ちゃんと配慮してれば全然問題ない
0627デフォルトの名無しさん
2008/10/24(金) 11:20:18例えば、選択したアドレスが[$A$2:$A$5,$A$5:$A$10]の場合、そのアドレス
範囲で集計(Subtotal)するとA5が重複して集計されてしまいます。
Excelのステータスバー(右側)には重複を除いた合計値が表示されます。
これと同様の値(特定bフ1列のみ)をVBAで取得したいのです。
0628デフォルトの名無しさん
2008/10/24(金) 12:06:03unionしちゃばOK
0629デフォルトの名無しさん
2008/10/24(金) 12:09:11Sub test1()
Dim rg1 As Range, rg2 As Range
For Each rg1 In Selection.Areas
If rg2 Is Nothing Then
Set rg2 = rg1
Else
Set rg2 = Range(rg2, rg1)
End If
Next rg1
Debug.Print WorksheetFunction.Sum(rg2)
End Sub
>>628
Unionは無理じゃない?
0630629
2008/10/24(金) 12:20:320631デフォルトの名無しさん
2008/10/24(金) 12:22:27? range("$A$2:$A$5,$A$5:$A$10").cells.count
10
? union(range("$A$2:$A$5"),range("$A$5:$A$10")).cells.count
9
? union(range("$A$2:$A$5"),range("$A$5:$A$10")).address
$A$2:$A$10
「特定の1列のみ」だそうだからOKかなと
0632629
2008/10/24(金) 12:29:120633デフォルトの名無しさん
2008/10/24(金) 14:52:48Set rg2 = Union(rg2, rg1)
に変更したら上手くいきました。
もう1つ教えて下さい。
選択された範囲の行を対象に特定の列(例では8列目)を以下の様に集計して
いますが、選択範囲から集計範囲(特定列)への変換にもっと簡単なやり方が
ありますでしょうか?
Dim vals As Variant, i As Integer, c As Integer, addr As String
c = 8
vals = Split(Selection.Address, ",")
For i = 0 To UBound(vals)
With Range(vals(i))
vals(i) = Range(Cells(.Row, c), Cells(.Row + .Rows.Count - 1, c)).Address
End With
Next
addr = Join(vals, ",")
Debug.Print WorksheetFunction.Subtotal(9, Range(addr))
0634633
2008/10/24(金) 16:24:56>>629さんの方法に組み込むと良い様に思います。
Set r1 = Cells(rg1.Row, 8)
Set r2 = Cells(rg1.Row + rg1.Rows.Count - 1, 8)
If rg2 Is Nothing Then
Set rg2 = Range(r1, r2)
Else
Set rg2 = Union(rg2, Range(r1, r2))
End If
0635デフォルトの名無しさん
2008/10/24(金) 16:33:53エクセルで資料を作ったがMacroで両面コピーの方法が分からないので両面コピーの方法を教えて下さい。
0636デフォルトの名無しさん
2008/10/24(金) 19:46:01訳あって欧文(ウムラウトを含むラテン文字の文章)の書き込まれたExcelシートから
内容を読み出してテキストファイルに起こしたいのですが、
Cells(?,?).valueやCells(?,?).TextからStringsの変数に読み出した時点でウムラウトが飛んで
近しい形状の通常のアルファベットに置き換えられてしまうようです。
結構ぐぐって見たのですが、読み出せなくて困った的な話はいくつか見つけたのですが
対処法について言及しているページが無かったので、皆さんのお知恵をお借りできないかと
思って書き込みさせていただきました。
なにかお知恵などありましたらよろしくお願いいたします<(__)>
0637デフォルトの名無しさん
2008/10/24(金) 20:14:02何を何処へコピーするのか
0638デフォルトの名無しさん
2008/10/24(金) 20:26:200639デフォルトの名無しさん
2008/10/24(金) 20:33:08元となるExcelファイルは、Excelのどのバージョンで作られたものですか?
あるいは、どこの国用のExcelで作られたものでしょうか?
VBAを利用せず、直接シートの必要な範囲をコピーしてエディタへ(ウムラウトは消えずに)
ペーストすることはできたのでしょうか?
↓このサイトは見ましたか?
http://www.microsoft.com/japan/office/ork/three/intd02.mspx
Office XP リソース キット / 国際環境での導入計画 / 国際環境でのメンテナンス
Unicode サポートの活用
「多国語テキストのコピー」の項と、「VBA で Unicode 値を使用する」の項が参考になるかも。
0640デフォルトの名無しさん
2008/10/24(金) 21:48:44500回とかそれ以上になるとなぜか無限ループにでも入ったみたいに計算が終わってくれません。
オーバーフローのエラーメッセージが出ることもないし、実際オーバーフローするほど大きな数を扱っているわけでもない。
原因としてはどんなことが考えられるでしょうか?
0641デフォルトの名無しさん
2008/10/24(金) 21:53:05その情報だけだと、メモリかCPU?としか言えない。
0642デフォルトの名無しさん
2008/10/24(金) 21:55:54sub 裏表印刷()
印刷実行
Msgbox ゛用紙裏面をセットしてください゛
印刷実行
end sub
0643デフォルトの名無しさん
2008/10/24(金) 21:56:08メモリっぽいですね。ちょっと調べてみます。
ありがとうございました。
0644デフォルトの名無しさん
2008/10/24(金) 22:09:55DoEvents
http://homepage2.nifty.com/kasayan/vba/doevents.htm
0645デフォルトの名無しさん
2008/10/25(土) 00:45:40>>639
動作環境を書くのをすっかり失念してました
この手の質問には必須なのに…申し訳ありません
OSはXP日本語版でExcelは日本語版Office2000に含まれるものです。
現在VBA開発に使用しているxlsファイルは
Exciteの機械翻訳で出したものをコピペしてBOOKに張り付けてテストデータとして作成したものです
紹介していただいたリンク先を読むと、VBAではunicodeを標準ではサポートしていないようですね
(VBでは文字列関係の内部処理はUnicodeで処理されてるのに…変な気分…)
まあ、テストデータで使用している文章がUnicodeではなく単純に欧文ASCIIコードの文字列の可能性もあるので
Unicodeをサポートしていればうまく行くとは限らない気もしますが
でもちょっと手がかりをもらえたのでもう少し試行錯誤してみようかと思います。
0646デフォルトの名無しさん
2008/10/25(土) 07:04:270647デフォルトの名無しさん
2008/10/25(土) 11:29:010648デフォルトの名無しさん
2008/10/25(土) 14:59:26unionでいいんなら
Sub test()
Dim rg1 As Range, c As Integer
c = 8
Set rg1 = Intersect(Union(Selection, Selection).EntireRow, Columns(c))
Debug.Print WorksheetFunction.Subtotal(9, rg1)
End Sub
0649デフォルトの名無しさん
2008/10/25(土) 15:46:42マクロでたとえばですが
ActiveCell.Replace What:="*", Replacement:="x"
のように セル文字列の * の部分だけをxに変換したいのですが
アスタリスクはすべて変換してしまいますよね。
A1*A1 という文字列を上記マクロ実行するとA1xA1 という結果になって
ほしいのですが。実際は x 担ってしまいます
どのようにすればよいのでしょうか。
0650デフォルトの名無しさん
2008/10/25(土) 16:07:52ActiveCell.Replace What:="~*", Replacement:="x"
0651デフォルトの名無しさん
2008/10/25(土) 16:09:39すごいですね。どうもです
0652デフォルトの名無しさん
2008/10/25(土) 17:06:030653デフォルトの名無しさん
2008/10/25(土) 18:11:57参考になるかも
ttp://codezine.jp/article/detail/1718
0654デフォルトの名無しさん
2008/10/25(土) 19:10:310655デフォルトの名無しさん
2008/10/26(日) 03:08:58VBAで、明日が三週目の日曜日だった場合A1に○○と表示するってやりたいんでがどうやればいいですか?
0656デフォルトの名無しさん
2008/10/26(日) 03:24:14明日の日付はDate関数に+1すれば解る
特定の日付が日曜日か否かはWeekday関数で解る
3週目か否かは日を算術演算すれば解る
あとはそれらを条件に条件分岐してA1に値を代入すれば良い
この説明で解らなければ>>1★5なので、さようなら
0657デフォルトの名無しさん
2008/10/26(日) 03:44:51ありがとうございます。
算出演算ってのがよく解らないですががんばってみます。
0658デフォルトの名無しさん
2008/10/26(日) 06:05:510659デフォルトの名無しさん
2008/10/26(日) 13:35:270660デフォルトの名無しさん
2008/10/26(日) 13:40:58Excel2003を使っています。
コマンドボックスをクリックするたびに、セルA1の数に1ずつ足していくマクロを作りたいのですが
どなたか教えていただけませんでしょうか。
よろしくお願いします。
0661デフォルトの名無しさん
2008/10/26(日) 14:10:390662デフォルトの名無しさん
2008/10/26(日) 15:32:19コマンドボックスって何ぞや?
0663660
2008/10/26(日) 15:45:47コマンドボタンの間違いです。
色々調べてみたのですが、変数の定義の仕方そのものがよく理解できていなくて
わからないなりに考えたのが↓です
Sub test_Click()
Dim h As Long
h = Range("A1").Value
If h = 0 Then
h = 1
Else
h = h + 1
End If
End Sub
もうちょっと頑張ってみます
0664649
2008/10/26(日) 15:48:36'=A1 という文字列を =A1 という数式に変換するマクロありますか。
同かよろしくお願いします。
0665649
2008/10/26(日) 15:50:36あるセルに '=A1 という文字が書かれています。
マクロコマンド使って =A1 という数式に置換したいのですが。
どうかよろしくお願いします。
0666デフォルトの名無しさん
2008/10/26(日) 16:32:40cells(1,1).value = cells(1,1).value + 1
>>665
Cells(1, 1).Formula = Cells(1, 1).Value
0667デフォルトの名無しさん
2008/10/26(日) 16:33:34Range("A1").Value = Range("A1").Value + 1
0668デフォルトの名無しさん
2008/10/26(日) 16:43:510670デフォルトの名無しさん
2008/10/26(日) 17:06:11単純な代入式も書けないレベルの奴は入門書買え
いちいち他人の手を煩わすな
0671デフォルトの名無しさん
2008/10/26(日) 22:22:34初心者ではないですが、レベルは低いですσ^^;
セルを指定するときに、Range("A1")ではなく[A1]というふうにやってるんですが、
これだとなにか悪影響がありますか?
今のところ困るのは、説明書やhelpの類がすべてRange形式のものばかりなので、
書き方が分からない時がある、ってことくらいです。
単に字数が少なくて済むからという理由で[**]形式にしているんですが、
ちょっと気になってます。
というか、そもそも気にしたほうがいいのか気にしなくてもいいのか・・・
0672デフォルトの名無しさん
2008/10/26(日) 22:45:34少なくとも俺はわからん
0673デフォルトの名無しさん
2008/10/26(日) 23:19:11あとは使う場面やメンテナンス性などを考えて使えば良い
複数人で扱う物には使わない方がいいし、汎用モジュールも然り
個人専用の使い捨てマクロの類なら[A1]形式でも医員で内科医
連続しない複数セルもしくは範囲を扱う場合なんかは便利なので
俺も他人が弄る可能性のないものでは使うこともある
『 [A:A,C:C,E:F].ClearContents 』とか『 [A3,C3:F10,H3:H10] = 0 』とかね
因みにうちでは『r""』のキー打ちで『Range("")』が入力され、カーソルが""の間に移動するので
Range("A1")は、『 R " " A 1 』で済む為、[A1]でもRange("A1")でも入力字数は大差ない
俺の場合RangeよりCellsの方がよく使うが、Cellsも同じく入力省略出来るようにしてある
0674デフォルトの名無しさん
2008/10/26(日) 23:27:30本気で業務に使うプログラムやら、もっと高いゴールを目指すなら、
初心者のうちからcellsで指定する方が良いと思うよ。
rangeと言えば、あくまでrangeオブジェクトである訳で・・・。
何より変数絡めてセルの指定するようになると可読性が著しく下がる・・・。
タッチ数も増えるしで、良い事ない。
0675デフォルトの名無しさん
2008/10/26(日) 23:28:390676デフォルトの名無しさん
2008/10/26(日) 23:36:52■ このスレッドは過去ログ倉庫に格納されています