[表示 : 全て 最新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)

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 もうまくいくな
どうやら仕様くさい

617 名前:VBAの初心者 mailto:sage [2008/10/21(火) 21:24:20 ]
初めまして。自分は知り合いにVBAを教えて貰っているんですが、相手に人はPCが
無くよく分らなくてもし良かったら教えて下さい。

だだ走らせるだけの凄い簡単なプログラムらしいんですが私には走らせ方が分らな
くて困ってます。

10 for m=1 to12
20 print m
30 next m
40 stop
なんですが凄い初心者なのでエクセル開いた所から分らなくて教えて下さい。




618 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:27:30 ]
それはVBAじゃない。VBでもない太古のBASICのプログラム。

619 名前:VBAの初心者 mailto:sage [2008/10/21(火) 21:30:01 ]
らしいです。VBAを覚えたいなぁ〜って言ったら色々言われて私が全然分からなく
なってしまったので、まず見れる簡単なの教えてと頼んだんですが、今のじゃ無理
なんでしょうか;

620 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:50:26 ]
もしかしたら、その相手の人は(Excel) VBAを知らないという可能性も考えられる。

VBAも含めてナントカBasicってのは山ほどあるけど、どれも全く別物。
敢えて共通点をあげるとしたら名前にBasicが付いていることだけ、というのはさすがに言い過ぎだけど。

そして、お前は何をやりたいのか。Excel VBAで間違いないんだよな?

621 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 22:39:24 ]
釣られすぎ

622 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 23:24:21 ]
縦読みじゃないのね。

623 名前:デフォルトの名無しさん [2008/10/22(水) 07:27:31 ]
Interiorってクラス名としてはどうなんですか?

624 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 10:00:18 ]
激しく紛らわしいからやめた方が良いかと

625 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 00:27:13 ]
自作クラスのインスタンス380個ぐらい作ったらメモリ不足になった

626 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:16:21 ]
そりゃクラスの内容に因るだろうな
個数や上限決めておらず、必要に応じて作る場合とか
1万や2万は当たり前に使ってることあるが
ちゃんと配慮してれば全然問題ない

627 名前:デフォルトの名無しさん [2008/10/24(金) 11:20:18 ]
選択アドレスから重複を削除する方法はありますでしょうか?

例えば、選択したアドレスが[$A$2:$A$5,$A$5:$A$10]の場合、そのアドレス
範囲で集計(Subtotal)するとA5が重複して集計されてしまいます。

Excelのステータスバー(右側)には重複を除いた合計値が表示されます。
これと同様の値(特定の1列のみ)をVBAで取得したいのです。




628 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:06:03 ]
>>627
unionしちゃばOK

629 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:09:11 ]
>>627
Sub 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は無理じゃない?

630 名前:629 mailto:sage [2008/10/24(金) 12:20:32 ]
今テストしてたんだが離れたセルを選択した時に期待どおりの動きしないな・・・

631 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:22:27 ]
>>629
? 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かなと

632 名前:629 mailto:sage [2008/10/24(金) 12:29:12 ]
RangeをUnionに書き換えたらいけたような気がするw

633 名前:デフォルトの名無しさん [2008/10/24(金) 14:52:48 ]
有難うございます。
Set 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))


634 名前:633 mailto:sage [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


635 名前:デフォルトの名無しさん [2008/10/24(金) 16:33:53 ]
質問です。
エクセルで資料を作ったがMacroで両面コピーの方法が分からないので両面コピーの方法を教えて下さい。

636 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 19:46:01 ]
質問です
訳あって欧文(ウムラウトを含むラテン文字の文章)の書き込まれたExcelシートから
内容を読み出してテキストファイルに起こしたいのですが、
Cells(?,?).valueやCells(?,?).TextからStringsの変数に読み出した時点でウムラウトが飛んで
近しい形状の通常のアルファベットに置き換えられてしまうようです。

結構ぐぐって見たのですが、読み出せなくて困った的な話はいくつか見つけたのですが
対処法について言及しているページが無かったので、皆さんのお知恵をお借りできないかと
思って書き込みさせていただきました。
なにかお知恵などありましたらよろしくお願いいたします<(__)>

637 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 20:14:02 ]
>>635
何を何処へコピーするのか



638 名前:デフォルトの名無しさん [2008/10/24(金) 20:26:20 ]
両面コピーって両面印刷の事?プリンタの話になるんじゃないの?

639 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 20:33:08 ]
>636
元となるExcelファイルは、Excelのどのバージョンで作られたものですか?
あるいは、どこの国用のExcelで作られたものでしょうか?
VBAを利用せず、直接シートの必要な範囲をコピーしてエディタへ(ウムラウトは消えずに)
ペーストすることはできたのでしょうか?

↓このサイトは見ましたか?
www.microsoft.com/japan/office/ork/three/intd02.mspx
Office XP リソース キット / 国際環境での導入計画 / 国際環境でのメンテナンス
Unicode サポートの活用
「多国語テキストのコピー」の項と、「VBA で Unicode 値を使用する」の項が参考になるかも。

640 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:48:44 ]
あるサブルーチンをForループで回すと100回くらいなら一瞬で終わるんですが、
500回とかそれ以上になるとなぜか無限ループにでも入ったみたいに計算が終わってくれません。
オーバーフローのエラーメッセージが出ることもないし、実際オーバーフローするほど大きな数を扱っているわけでもない。
原因としてはどんなことが考えられるでしょうか?

641 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:53:05 ]
サブルーチンのforカウント変数をステータスバーにでも表示してデバッグのヒントにするのだ。
その情報だけだと、メモリかCPU?としか言えない。

642 名前:デフォルトの名無しさん [2008/10/24(金) 21:55:54 ]
>>635

sub 裏表印刷()

印刷実行

Msgbox ゛用紙裏面をセットしてください゛

印刷実行

end sub

643 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:56:08 ]
>>641
メモリっぽいですね。ちょっと調べてみます。
ありがとうございました。

644 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 22:09:55 ]
>>640
DoEvents
homepage2.nifty.com/kasayan/vba/doevents.htm

645 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 00:45:40 ]
636です

>>639
動作環境を書くのをすっかり失念してました
この手の質問には必須なのに…申し訳ありません

OSはXP日本語版でExcelは日本語版Office2000に含まれるものです。
現在VBA開発に使用しているxlsファイルは
Exciteの機械翻訳で出したものをコピペしてBOOKに張り付けてテストデータとして作成したものです

紹介していただいたリンク先を読むと、VBAではunicodeを標準ではサポートしていないようですね
(VBでは文字列関係の内部処理はUnicodeで処理されてるのに…変な気分…)
まあ、テストデータで使用している文章がUnicodeではなく単純に欧文ASCIIコードの文字列の可能性もあるので
Unicodeをサポートしていればうまく行くとは限らない気もしますが

でもちょっと手がかりをもらえたのでもう少し試行錯誤してみようかと思います。

646 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 07:04:27 ]
オーバーフローの意味もしらないのかVBA厨房は

647 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 11:29:01 ]
アクセスならともかく、エクセルでプリンタ設定いじるって難しいくね



648 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 14:59:26 ]
>>633
unionでいいんなら

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

649 名前:デフォルトの名無しさん [2008/10/25(土) 15:46:42 ]
どなたかお教えください

マクロでたとえばですが

ActiveCell.Replace What:="*", Replacement:="x"

のように セル文字列の * の部分だけをxに変換したいのですが
アスタリスクはすべて変換してしまいますよね。

A1*A1 という文字列を上記マクロ実行するとA1xA1 という結果になって
ほしいのですが。実際は x 担ってしまいます

どのようにすればよいのでしょうか。


650 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 16:07:52 ]
>>649
ActiveCell.Replace What:="~*", Replacement:="x"

651 名前:デフォルトの名無しさん [2008/10/25(土) 16:09:39 ]
>>650

すごいですね。どうもです

652 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 17:06:03 ]
春先から悩んでた人多いな

653 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 18:11:57 ]
>>645
参考になるかも
ttp://codezine.jp/article/detail/1718



654 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 19:10:31 ]
しかし、エスケープシーケンスはもっとわかりやすくしてほしいよな。

655 名前:デフォルトの名無しさん [2008/10/26(日) 03:08:58 ]
教えてください
VBAで、明日が三週目の日曜日だった場合A1に○○と表示するってやりたいんでがどうやればいいですか?

656 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 03:24:14 ]
>>655
明日の日付はDate関数に+1すれば解る
特定の日付が日曜日か否かはWeekday関数で解る
3週目か否かは日を算術演算すれば解る
あとはそれらを条件に条件分岐してA1に値を代入すれば良い

この説明で解らなければ>>1★5なので、さようなら

657 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 03:44:51 ]
>>656
ありがとうございます。
算出演算ってのがよく解らないですががんばってみます。



658 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 06:05:51 ]
だからエクセルでやれよ

659 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 13:35:27 ]
だよな。数式でできるレベル

660 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 13:40:58 ]
 質問です。
 Excel2003を使っています。
 コマンドボックスをクリックするたびに、セルA1の数に1ずつ足していくマクロを作りたいのですが
どなたか教えていただけませんでしょうか。
 よろしくお願いします。


661 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 14:10:39 ]
ちょっとは自分で調べる努力した?

662 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 15:32:19 ]
>>660
コマンドボックスって何ぞや?

663 名前:660 mailto:sage [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

 もうちょっと頑張ってみます

664 名前:649 [2008/10/26(日) 15:48:36 ]
 お教え願いますか

 '=A1 という文字列を =A1 という数式に変換するマクロありますか。

同かよろしくお願いします。



665 名前:649 [2008/10/26(日) 15:50:36 ]
舌足らずでした

 あるセルに '=A1 という文字が書かれています。
マクロコマンド使って =A1 という数式に置換したいのですが。

どうかよろしくお願いします。




666 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:32:40 ]
>>663

cells(1,1).value = cells(1,1).value + 1

>>665

Cells(1, 1).Formula = Cells(1, 1).Value

667 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:33:34 ]
>>663
Range("A1").Value = Range("A1").Value + 1




668 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:43:51 ]
こんなばかみたいな質問にいちいち答えるなよ

669 名前:660 mailto:sage [2008/10/26(日) 16:47:26 ]
>>666
>>667

ありがとうございました。
一から勉強してきます。

670 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 17:06:11 ]
変数の定義ができないとか、
単純な代入式も書けないレベルの奴は入門書買え
いちいち他人の手を煩わすな

671 名前:デフォルトの名無しさん [2008/10/26(日) 22:22:34 ]
初めて質問させていただきます。
初心者ではないですが、レベルは低いですσ^^;

セルを指定するときに、Range("A1")ではなく[A1]というふうにやってるんですが、
これだとなにか悪影響がありますか?

今のところ困るのは、説明書やhelpの類がすべてRange形式のものばかりなので、
書き方が分からない時がある、ってことくらいです。

単に字数が少なくて済むからという理由で[**]形式にしているんですが、
ちょっと気になってます。
というか、そもそも気にしたほうがいいのか気にしなくてもいいのか・・・

672 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:45:34 ]
他の人が見たときに分かりにくいとか
少なくとも俺はわからん

673 名前:デフォルトの名無しさん mailto:sage [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も同じく入力省略出来るようにしてある

674 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:27:30 ]
簡単なマクロ程度をゴールにしてるならどんな形式でも良いけど、
本気で業務に使うプログラムやら、もっと高いゴールを目指すなら、
初心者のうちからcellsで指定する方が良いと思うよ。
rangeと言えば、あくまでrangeオブジェクトである訳で・・・。

何より変数絡めてセルの指定するようになると可読性が著しく下がる・・・。
タッチ数も増えるしで、良い事ない。

675 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:28:39 ]
最後の3行が言いたかっただけちゃうかー

676 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:36:52 ]


677 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 00:10:33 ]
[A1]なんて書き方知らなかった……。もっと精進するわ。



678 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 02:51:46 ]
>>671
結局は evaluate の省略記法だから、excel に渡して評価させる分、
多少処理の無駄があるんじゃないかと思う(たぶん)

[A1].value = 0
range("A1").value = 0
それぞれ10万回ループさせると数秒だが差が出る
evaluate("A1").value = 0
は、[A1]記法とほぼ同じになる

誤差レベルだけど、回数の多いループ内とか、速度が気になる場合は
避けた方がいいかもね

679 名前:デフォルトの名無しさん [2008/10/27(月) 09:49:00 ]
[A1]だと後ろにピリオド打っても入力候補が出てこねぇ。
Cells(1,1)も出てこねー。
Range("A1")だと出てくる。
どれもいったんRange型変数に入れりゃ同じだが。

680 名前:デフォルトの名無しさん [2008/10/27(月) 10:57:11 ]
pc11.2ch.net/test/read.cgi/gamedev/1217601153/
Syntax Error.しか知らないキチガイがあらわれました

681 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 11:57:01 ]
detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220150877

大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間続けているようです。
このようなケースではリニューアルを担当した業者はヨドバシカメラにどれほどの損害賠償を行うのでしょうか?

【ヨドバシカメラ】 ネットサイトをリニューアルしたら表示遅すぎでおわび [10/23]
gimpo.2ch.net/test/read.cgi/owabiplus/1224789237/

ヤマダ.com/ビックカメラ.com/ヨドバシ.comを語ろう
gimpo.2ch.net/test/read.cgi/kaden/1222787235/

【店員の質】ヨドバシカメラ総合17【落ちまくり】
gimpo.2ch.net/test/read.cgi/kaden/1215013408/

補足
どうやら今回のヨドバシドットコムリニューアルはCMS導入が目的で、
キノトロープスリーイントという会社( www.k-3int.co.jp/ )が請けたようです。

また、リニューアルの10/21から10/25現在までこの状況ですので、ヨドバシカメラの損失額は
億単位で発生していると言われています。

キノトロープってどうよ?PART4
namidame.2ch.net/test/read.cgi/venture/1224762171/

682 名前:633 [2008/10/27(月) 14:06:59 ]
>>648
おぉー、素晴らしい限りです!
アクティブシート以外に対してIntersectは無理なのでしょうか?

683 名前:682 [2008/10/27(月) 14:21:18 ]
失礼しました。orz
columns(c)を修飾したら出来ました。

684 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 16:04:05 ]
>>682
書いた後で気づいたんだが、それ union いらないっぽいw

? selection.address
$A$1:$A$5,$A$5:$A$10
? selection.entirerow.address
$1:$5,$5:$10
? intersect(selection.entirerow, columns(8)).address
$H$1:$H$10

intersect かけた時点で重複してる行はまとめられるから、
Set rg1 = Intersect(Selection.EntireRow, Columns(c))
だけでいいようだ

685 名前:682 mailto:sage [2008/10/27(月) 16:34:34 ]
>>684
究極のリファクタリング有難うございます。orz
こういうの教えられると、VBコードでゴリゴリ作るのが馬鹿らしくなってしまう...

686 名前:671 [2008/10/27(月) 22:41:20 ]
みなさんいろいろご意見ありがとうございました。
RangeやCells形式も使いこなせるように、もっと勉強していきます^^

687 名前:デフォルトの名無しさん [2008/10/28(火) 10:08:01 ]
もう1つ教えて下さい。

選択エリアの全行数は
For each r in Selection.Areas
rcnt = rcnt + r.Rows.Count
Next
で求めていますが、一気に知る方法がありますでしょうか?



688 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 18:29:27 ]
>>687
一気に知る方法は知らないがそのままだと重複している行もカウントされる
少し前で話題に出たIntersectを組み込んで
For Each r In Intersect(Selection.EntireRow, Selection.EntireRow).Areas
とかにしたほうがいいんじゃないか?

689 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:48:43 ]
初心者って「一気に」とか「1行で」とか好きだよな

690 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:14:07 ]
コードが長くなると理解できなくなるんだよw


691 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:47:58 ]
関数型プログラミングなら、一気にやるという書き方でも割と珍しくない感じがする。
もちろん面倒なことをやるなら1文あたりが相応に長くなるんだけど。

692 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 01:54:25 ]
学習が下手な奴ほど早く学習する事が1つだけある
それは「人に訊いた方がラクだ」という事だ
なんちてw

>>687
一般的なやり方じゃないかも知らんが一応これで行けそう

重複行込み
rcnt = selection.entirerow.cells.count / activesheet.columns.count
重複行抜き
rcnt = intersect(selection.entirerow,columns(1)).count

693 名前:デフォルトの名無しさん [2008/10/29(水) 02:45:55 ]
ループの中で =average() の引数を可変的に指定する方法を教えてください
具体例:
(1)乱数で10個のデータを生成し,列方向に保存
(2)保存したデータから平均を計算し, 2つ下のセルに出力
(3)上記(1)から(2) を n回繰り返す(とりあえずn=3).

上記(2)がうまく計算できません(下から3行目のコード).

---------------
Sub dice_siml01()
Cells.Clear

Dim i As Integer
Dim j As Integer
Dim n As Integer
Dim nobs As Integer

Cells(1, 1) = "試行回数"
n = 3
nobs = 10
For j = 1 To n
For i = 1 To nobs
Cells(i + 1, j + 1).Formula = "=randbetween(1,6)"
Next
Cells(nobs + 3, j + 1).Formula = "=Average(Range(Cells(2, j+1), Cells(2+nobs-1, j+1)))" Next
End Sub
---------------
【注】
randbetween(1,6) エラーの場合 rand()で置き換えてお願いします.

694 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 03:31:17 ]
>>693
.formula に入れるのはセルにそのまま打ち込める式
範囲指定のところが "B2:B11" とかの形式になるように、
文字列を生成すればOK

695 名前:デフォルトの名無しさん [2008/10/29(水) 09:46:54 ]
>>694
どうもありがと。
できれば、具体的な変換方法もお願いします。


696 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:03:37 ]
>>695
宿題か何か?
デカい誤り指摘してヒントも出したんだから、
そこからもっぺん自分で考えてみような
じゃなきゃこんな練習問題やってる意味ないだろ

697 名前:687 mailto:sage [2008/10/29(水) 10:09:55 ]
>>688
>>692
有難うございます。

「聞くは一時の恥じ...」
なんちてw

セル情報はExcelの基本関数知ってればコード記述で殆ど解決しちゃう
けど速度やメンテを考えるとコードは単純な程良い。




698 名前:デフォルトの名無しさん [2008/10/29(水) 10:36:40 ]
>>696
これ以上は分からん。

699 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:37:47 ]
>>697
あ、速度考えるなら intersect とか濫用しない方がいいよ
10万回ループさせると>>692より>>687の方が早いんで

700 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 12:16:46 ]
>>697
>けど速度やメンテを考えるとコードは単純な程良い。
これは少し間違ってる気がする
速度を考えるなら処理するデータを単純にした上でコードも単純なものにする
例えばセルのプロパティを変数に入れるとか
さらにメモリの使い方にも気を配れればいい
書くと短くても動かすと重たい処理なんてたくさんあるし

701 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 16:48:37 ]
コードの見た目(行数、文字数とか)が単純なのと、
実際の処理が単純なのは違うよね

あと>>699の自己フォローなんだけど、
selectionの状態に依存するわな、、、w
areasが2-3ぐらいなら>>687の方が早いってことで

702 名前:デフォルトの名無しさん [2008/10/29(水) 21:27:30 ]
置換に関しての質問なのですが、

検索した2つ右のセルの文字の最後に1をつけたい場合どうすればいいでしょうか?

703 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 21:39:33 ]
hoge = "あくまで一例"
set piyo = cells.find(hoge).offset(0,2)
piyo.value = piyo.value & "1"


704 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 21:57:52 ]
【1 OSの種類         .】 WindowsXP
【2 Excelのバージョン   】 Excel2007
【3 VBAが使えるか    .】 超初心者です
【4 VBAでの回答の可否】 VBAでお願いします。

行の挿入、削除を教えてください。

A B A B C A B C
1 1001 1001 1 1001 1001 1001 1 1001 1001 1001
2 1003 1003 2 1003 1003 1002 2 1002
3 1004 1004 3 1004 1004 1003 3 1003 1003 1003
4 1005 1005 → 4 1005 1005 1004 → 4 1004 1004 1004
5 1006 1006 5 1006 1006 1006 5 1006 1006 1006
6 1007 1007 6 1007 1007 1007 6 1007 1007 1007
7 1008 1008 7 1008 1008 1008 7 1008 1008 1008


@ AB列の数字は同じものが入っています。
A C列に数値が入ります。
B C列に合わせて、A列、B列を挿入、削除したいです。
  C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は
  行の削除がされると言う具合です。

業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。


705 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:01:22 ]
丸投げはやめようぜ。

自分で作ってみたけど、分からない所が出てきた。とかなら全然かまわないんだけど。
作成依頼所じゃないんで。

706 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:03:28 ]
すいません、数値がずれまくりました。
もう一度書き込ませてください。

【1 OSの種類         .】 WindowsXP
【2 Excelのバージョン   】 Excel2007
【3 VBAが使えるか    .】 超初心者です
【4 VBAでの回答の可否】 VBAでお願いします。

行の挿入、削除を教えてください。

@            A                 B    
    A    B         A    B    C        A    B    C
1  1001  1001     1  1001  1001  1001    1  1001  1001  1001
2  1003  1003     2  1003  1003  1002    2  1002
3  1004  1004     3  1004  1004  1003    3  1003  1003  1003
4  1005  1005  →  4  1005  1005  1004  → 4  1004  1004  1004
5  1006  1006     5  1006  1006  1006    5  1006  1006  1006
6  1007  1007     6  1007  1007  1007    6  1007  1007  1007
7  1008  1008     7  1008  1008  1008    7  1008  1008  1008


@ AB列の数字は同じものが入っています。
A C列に数値が入ります。
B C列に合わせて、A列、B列を挿入、削除したいです。
  C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は
  行の削除がされると言う具合です。

業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。


707 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:05:26 ]
>>706
>705



708 名前:デフォルトの名無しさん [2008/10/29(水) 22:22:44 ]
>>703さん

ありがとうございます!!

A列全部で検索かけたい場合どうすればいいでしょうか?

709 名前:704 706 mailto:sage [2008/10/29(水) 22:27:40 ]
申し訳ございませんでした。

EXCEL総合相談所で聞いてきます。
マルチになってしまいますが、ご了承ください。

レベルが上がったらこのスレに来たいと思います。


710 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 12:42:39 ]
>>708
2003だとFindのヘルプにちょうどいい例が載ってるんだが2007では載ってないのか?

711 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 12:45:03 ]
他のレスと混同してた・・・


712 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 21:03:32 ]
>>708
cells はセル全部
columns(1) は1列目

ヒントはここまで。

713 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 03:25:08 ]
>>706
ズリネタとして結構面白かった

714 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:00:44 ]
dim rg as range
rg=activecell
処理
この処理後に、元のアクティブセルに戻る文が書けません。
どんなだったか、教えて。


715 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:07:50 ]
もう一個、よろしく。
処理の中で範囲を指定してコピー、貼付をしている。
application.screenupdating=false を直前に入れても
画面が動くのですが、画面が動かないようにできませんか?


716 名前:y mailto:sage [2008/11/02(日) 18:36:29 ]
>>714
rg.Parent.Activate
rg.Avtivate
ついでに言うと、>714の2行目は構文ミスでエラーになるので修正が必要です。

>>715
CopyメソッドのDestinationプロパティに貼り付け先範囲を指定して、
一度にコピー・貼り付けを行うと、動く枠線が出ないようになります。



717 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:37:54 ]
>>716
久しぶりなので、マクロの記録で、終わってましたorz
おかげで、思い出すことが出来ました。
サンクス。



718 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:51:29 ]
>>716
その2行目も・・・

719 名前:デフォルトの名無しさん [2008/11/02(日) 20:57:01 ]
プログラム用のVBAコードを記述した非表示ブックから、データ用の任意のブック
を開き、データブックのイベントに対する処理をしています。
Excel2007はウインドウのタイトル右端の×ボタンが「閉じる」に対応している様
です。
Excel2007でも以前のバージョンと同様に「Excelの終了」にする方法を模索中です。
方法をご教授頂けると有難いです。

720 名前:y mailto:sage [2008/11/02(日) 22:45:44 ]
>>718
うは ご指摘ありがとうございます。

>>719
×ボタンでBeforeCloseイベントが発生するので、
同イベントプロシージャ内に
Application.Quit
を記述します。


721 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:00:30 ]
range型変数にsetしてないってのは突っ込んじゃいけない所?
最近、微妙な空気が読めなくなってきたよ・・・。

722 名前:719 [2008/11/02(日) 23:24:17 ]
>>720
自分もそれでExcelが終了すると思っていたのですが、ブックが閉じるだけです。

SnendKeys(Alt+F4)を試したら終了できました。orz

723 名前:719 [2008/11/03(月) 00:23:33 ]
訂正です。
SendKeys(Alt+F4)でもだめでした。

プログラムブック(A)からデータブック(B)を開いて、Bが変更された場合に
変更を保存するかどうかを確認するダイアログが表示されるので、Alt+F4
を送信するとダイアログが閉じられる事になるのでExcelを終了できません。

724 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:25:16 ]
>>722
application.quit の前にワークブックの close やってる?
後にしてみたらどうなる?2007はわからんけど、、、

725 名前:722 [2008/11/03(月) 00:44:26 ]
>>724
もう少し具体的に教えて下さいませんか。

2007以外は×ボタンでExcel終了が終了するようになっています。
同じブックを2007の互換モードで動かして×ボタンでExcelを終了
したいのです。
この方法が分からないのです。

726 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 01:21:12 ]
>>725
あ、ごめん
ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_060.html
この辺の問題のことだったの。
2007以外ではいけてるなら関係ないね。失礼した

727 名前:y mailto:sage [2008/11/03(月) 07:57:50 ]
>>725
2007で試さずに>720を答えてました。2007ではQuitだとうまくいかないんですね?
一応、Shift を押しながら×クリックすれば一発で終了するので、それで用が済むなら。
VBAでのやり方は、後で職場の2007で探してみます。




728 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 09:09:42 ]
range型ってsetしなくても使えるの?

729 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:14:59 ]
範囲指定をしてコピー等をした後、コピーモードををフォルスにした
後のことです。
範囲指定を解除する方法は、どこかのセルをactivateやselectするしか
方法はありませんか。画面のちらつきを少しでも防止したいので、セル指定を
したくないのですが、何か方法が無いでしょうか?



730 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:51:57 ]
久々にExcelのVBA触って改めて思ったけど、本当にVBAっていうかVBって糞言語だな。

>>725
724は具体的に言ってるでしょ。
ダイアログが出るために終了できないのならダイアログが出ないようにすれば?
どうしてダイアログが出るの?
ブックが変更されてるのに保存されてないからでしょ?
だったら保存したら?
こんなのパソコン初めて一週間のオッサンでも最初に覚えることの一つじゃないか。

>>729
全体的に何がいいたいのかよくわからない気がする。

731 名前:デフォルトの名無しさん [2008/11/03(月) 10:54:12 ]
どうしてもわからないので
教えていただきたいのですが、

Book1を起動して
Book1のマクロで
Book2を開くことはできたのですが

Book2の内容をコピーして
Book1に貼り付けすることができません

よろしくお願いします。



732 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:59:28 ]
>>729
ググってもすぐ見つかるし
マクロの記録でもすぐ解るようなことを何故聞く?
そのものズバリの解除法が簡単に見つかるのに

>>731
Bool2を開くと、戻り値としてBool2のオブジェクトが返る
あとは好きなようにコピーなりなんなりすれば良い

733 名前:725 [2008/11/03(月) 11:12:00 ]
>>730
保存するかどうかはユーザーが決める事で、プログラム側で決められる
のは、×ボタンが押されたらWindows2007以外と同様な動作なんだけど。
説明不足?それとも...

734 名前:725 [2008/11/03(月) 11:17:49 ]
>>730
719に記述した通りなんだけど...

735 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:25:31 ]
>>734
だから?
ついでに言えば、お前さんの言っている現象はExcel2007に特有の現象でもなんでもないはずだ。
お前さんが検証もせずそう思い込んでいるだけにすぎない。

全く同じ条件であれば、2003以前のエクセルでも全く同じことが起こるはずだよ。

736 名前:デフォルトの名無しさん [2008/11/03(月) 11:43:21 ]
>>735
確かに、Excel2000と2007で同じブックを動作した検証で違いが出た
だけですが...

737 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:48:40 ]
API



738 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:06:15 ]
もしかして、.saved や displayalerts の値はいじらずに、
組み込みダイアログをそのまま使ってるのかな?>>733
組み込みダイアログ出た後の動作が 2007 とその他で異なる可能性あるし、
ユーザに選ばせるなら自前でやった方が確実かも

739 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:23:48 ]
>665
たとえば、セル(4, 3)に '=A1+A2が記入してあり
その式をセル(5, 1)に書き込む場合
  Cells(5, 1) = Mid$(Cells(4, 3), 1)
でどうでしょう?

740 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:33:08 ]
いつの話だよ

741 名前:デフォルトの名無しさん [2008/11/05(水) 10:16:29 ]
? ActiveSheet.UsedRange.Rows.Count
これを実行後するとワークシート上のUndo(元に戻す)が無効になっていまいます。
これって、仕様ですか?

742 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:06:19 ]
>>741
イミディエイトウィンドウでやるとVBA動かしたの時と同じでUndoできなくなる
?1+1とかでも同じ
でもウォッチ式として使えば問題ない

743 名前:742 mailto:sage [2008/11/05(水) 11:11:33 ]
今試したらウォッチ式でもだめだった orz

744 名前:741 [2008/11/05(水) 15:12:16 ]
セルの選択範囲が変更になったとき、最終行を調べたいのですが
? ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
だと、保護されたシートの時エラーになってしまう。
他にUndoを生かしたまま最終行を求める方法あります?

745 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:17:36 ]
>>744
?WorksheetFunction.Max(ActiveSheet.Cells(65536, 1).End(xlUp).Row,ActiveSheet.Cells(65536, 2).End(xlUp).Row,ActiveSheet.Cells(65536, 3).End(xlUp).Row)
もしくは
Dim lg(2) As Long
lg(0) = ActiveSheet.Cells(65536, 1).End(xlUp).Row
lg(1) = ActiveSheet.Cells(65536, 2).End(xlUp).Row
lg(2) = ActiveSheet.Cells(65536, 3).End(xlUp).Row
Debug.Print WorksheetFunction.Max(lg())
でどう?

746 名前:デフォルトの名無しさん [2008/11/05(水) 16:42:43 ]
>>745
有難うございます。
? activesheet.cells(activesheet.cells.rows.count,1).end(xlup).row
で出来たのですが、列を特定しないと駄目なのですよね。

自分も気付いたのですが、
保護されているかどうかでUsedRangeとSpecialCellsを使い分けるという方法
もありますね。

747 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:26:47 ]
超初心者なのですが、グラフ作成のところで詰まってしまいました。
B2を起点とするデータ
B21を起点とするデータ
この二つのデータのグラフを作成しようと以下のマクロを作ったのですが、
Set muSouce2 = Range("B21").CurrentRegion
のところでエラーがでてしまいました。
この場合どうすればエラーが取れるのでしょうか?



Sub Graph1()
Dim mySouce As Range
Set mySouce = Range("B2").CurrentRegion
Charts.Add
ActiveChart.SetSourceData Source:=mySouce, PlotBy:=xlColumns
ActiveChart.ChartType = xlLine

Dim mySouce2 As Range
Set mySouce2 = Range("B21").CurrentRegion
Charts.Add
ActiveChart.SetSourceData Source:=mySouce2, PlotBy:=xlColumns
ActiveChart.ChartType = xlLine
End Sub



748 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 02:13:25 ]
>>747
set mySouce = の時は、データの入ってるワークシートが
アクティブになっててその書き方で行けるんだけど、
set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、
range("B21") がどこにあるのかわからんってさ

749 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 02:51:43 ]
>>748
なるほど!!明快な説明ありがとうございます。
つまり、set mySouce2 = の前に、
データが格納されているシートをセレクトすればよかったのですね。

対処だけでなく原因が分かりためになりました!

750 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:11:14 ]
>>749
そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、
最初にまとめて下準備しちゃえば効率がいいよね
selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい

751 名前:デフォルトの名無しさん [2008/11/06(木) 18:01:30 ]
ある値xをアクティブセルの持つ書式に変換した値を取得したいのですが
Dim rng as Range
Set rng = ActiveCell
rng.Value = x
この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。
もう少しましな方法を教えて頂けるとありがたいです。

752 名前:デフォルトの名無しさん [2008/11/06(木) 18:14:58 ]
>>751
Format(x, ActiveCell.NumberFormatLocal)
セルの書式によってはバグるかも試練がw


753 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:35:33 ]
そうなんです
[G/標準]とかでエラーになる為、セル代入を考えたのですが...

754 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:50:58 ]
「セルの書式に合わせた文字列に変換」でいいのね
? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal))
とかは?

755 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:12:31 ]
TEXT関数か・・・ならば
worksheetfunction.text(x, activecell.numberformat)
これでどうかな?

756 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:20:37 ]
>>755
書式に和暦や曜日が指定されてるとヘンになるよ
そういうの無視でいいならいいんだけど

757 名前:デフォルトの名無しさん [2008/11/06(木) 19:35:05 ]
しつこいようだけど、頼む。
セルについて指定無しの状態にするすることは可能ですか?
set rg = nothing とか試してみたけどだめだったorz



758 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:44:51 ]
>>757
ほんとしつこいなぁ、、、って誰?w
というか、質問の意味がわからない

>>756
自己レス
曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる

759 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:50:15 ]
>>757
以前やってみようとした事があったけど見つからなかった
本当に出来るのかどうかも不明

>>758
お前頭悪そうだな

760 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:56:56 ]
>>759
質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ

761 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:01:11 ]
質問スレで分かってて答えないのは只の無能だと思われてもしょうがない。

762 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:10:08 ]
>>761
そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ
質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ

763 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:46:09 ]
喧嘩は他所でスレ立ててやれよ
目障り

764 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:18:48 ]
自己紹介乙

765 名前:デフォルトの名無しさん [2008/11/06(木) 21:53:02 ]
>>763
おまえは引っ込んでろ!
このカス。

766 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 04:10:27 ]
俺も >>757 の質問がよくわからないし
つか、前に質問したなら名前欄にレス番とか入れてくれ


767 名前:569 mailto:sage [2008/11/07(金) 06:17:38 ]
フォルダの中を検索して特定のExcelファイル(○○.xls)を見つけたいのだが
フォルダを作る側が適当で(ここの部分は立場上どうしようもないです・・・)

Aフォルダ
Bフォルダ
○○.xls
というパターンもあれば
Aフォルダ/Cフォルダ/○○.xls
Bフォルダ/○○.xls
というパターンもあり、○○.xlsが無いことも2個あることも5個あることもある。ただ幸い○○.xlsの名前は固定です。
このフォルダ内から存在する全ての○○.xlsを開いて中身から数字を
取り出す機能を持ったVBAを作ろうとしています。

フォルダのパスはFOを使って配列に入れてそれを
全てのフォルダパターンを使って○○.xlsを探そうとしています。
そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?

階層固定のフォルダ抽出、Excelファイルは問題ないのですが
階層実固定のフォルダ抽出で詰まっています。

例えば手抜きですが↓みたいな流れでうまく出来そうですかね?
Private Sub AAA()
今のパスを配列に格納
  if フォルダが有る時 then
call AAA
end if
End AAA




768 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 06:18:18 ]
すんません。上のやつ>>569さんじゃないです・・・。名前に入っちゃいました。

769 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 08:44:46 ]
>>767
>そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?
試した?
試してもいないのに質問しに来てない?

770 名前:751 [2008/11/07(金) 09:34:48 ]
>>754
>>755
>>758
ありがとうございます.orz
754さんの方法でグーですね。

771 名前:751 [2008/11/07(金) 09:47:36 ]
ついでにもう1つ教えてください。
xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別
するにはどうしたらよいのでしょうか?
? Application.WorksheetFunction.IsError(x)
だとエラーにならないのですが...

772 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:00:12 ]
どういうエラーでそのxが何か分からないと答えられない
セル(Range)なのか数値や文字なのか

773 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:09:03 ]
>>767
「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ

774 名前:771 [2008/11/07(金) 10:50:19 ]
入力したテキストxでAutoFilterの設定・解除をしています。
(フィールドはアクティブセルの列)
この時、xの書式をアクティブセルの書式への変換は
>>751
さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に
Set rng = ActiveCell: rng.Value = x
if WorksheetFunction.Iserror(rng)
とすると、アクティブセルの保存が必要になってしまう為もう少しましな
方法を模索中なのです。


775 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:54:09 ]
>>769
ちょっと試せない状態だったのでとりあえず聞きました。

>>773
ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。
お騒がせしました。

776 名前:デフォルトの名無しさん [2008/11/07(金) 13:14:43 ]
初歩的な質問なんですが、
intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。
二つ目の変数に別のアクティブセルを代入するとerror13が現れます。
どなたかご教授願えないでしょうか?

777 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:47:26 ]
>>776
アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?



778 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 15:38:15 ]
>>776
Error 13は「型が一致しません。」だから
単純にint型に文字列(スペース含む)を代入しようとしてるとか?
セルが空なら0が入るし

779 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:04:36 ]
膨大な量じゃないならコード貼ってどこでエラーがでたか書いてくれよ

780 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:10:46 ]
>>774
x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ?
いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな

781 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:27:19 ]
説明が下手な奴大杉

782 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:31:54 ]
説明もまともに出来ない不出来な頭だから、問題も自分で解決できずにここに質問に来るんだよ

もちろん、本当に難易度の高いことをやっていて、行き詰まって来る奴も居ないわけではないが
殆どが能無しどころか脳無し(調べる考えるという知能的行為そのものが出来ない奴)なんだから
ここに居座る(質問者としてではなく)ならそのことは覚悟しなくちゃならない

783 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:45:31 ]
>>782
よく分からない論理だな。

784 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:12:21 ]
わからんではないが、そこまで言い放つことでもない
甘え放題も困るが委縮させ過ぎるのもよくない
意味不明な質問を差し戻したり、時々愚痴るぐらいで丁度いい

785 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 07:17:57 ]
ヒマだからスレ読み返してたらわかったw
>>757=>>729だね。たぶん>>715も同じ人っぽい

screenupdating = false をやっててもちらつくのは、おそらく on / off のタイミングが悪い
たびたび on / off すると、on になった一瞬のスキも見逃さずに画面更新するからちらつく
off にしたらしっぱなしになる位置でやらないと

範囲指定を解除(セルが select されていない状態に)する方法だけど、
高さ・幅 0のイメージを用意してそれを select すれば、
selection が range でない状態にすることはできる
activecell の参照は直前のまま保持されるけど、シート上の囲み枠は出ない

でもさ、解除ができても、指定/解除を繰り返せばどのみちチラチラするよ
ちらつき防止なら、screenupdating のタイミングを確認するのがいいと思う

786 名前:デフォルトの名無しさん [2008/11/08(土) 17:49:36 ]
>>785
ベリー、ベリー、サンクス
お見込みのとおり、その3つは折れです。
展望が開けました。
サンクス。


787 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 08:43:30 ]
Enumとして宣言さている列挙型のmember名をStringとして取得できますか?



788 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:32:30 ]
販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。

・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す


789 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:34:07 ]
だれのための、どういう報告なの?

790 名前:788 mailto:sage [2008/11/09(日) 11:36:43 ]
販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。

・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す

そんなマクロなんだけど、毎日販売管理ソフトから吐き出されたxlsファイルをBook1.xlsと同じ階層にコピーして、ファイル名を記述しないといけないのだけど、
xlsファイルをxlsファイルにドラッグアンドドロップとかでファイル名を取得して実行できるようにする方法ってありますかね?

791 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:53:23 ]
>>787
スレ違い
それはVBAではなくVB言語の質問だ

>>790
あるけど、それはWindowsの設定の問題だ

792 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:30:57 ]
windows弄ったら出来るのかー。

ほんと言うとVisualStudioでEXE形式にできたらいいんだけどね。

VisualStudioからEXCELのコントロールわからんしな;;

793 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:49:50 ]
できないだろ
無理にやると普通に開けなくなるだろ
バッチファイルかWSHにドロップして
引数を環境変数に設定して
xlsファイルを開き
環境変数を見る

794 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:43:56 ]
いつもそんなことやってるの?

795 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 19:34:55 ]
>>790
普通にアドインを作れば解決するケースに思えるけど。

796 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:03:05 ]
アドイン??

797 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:16:11 ]
>>795
教えてくれ



798 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:31:57 ]
「Excel アドイン」でググってトップのところに詳しい説明があるから
それを読んだ方がいいよ。

VBAのコードが普通に書ける人ならすぐに理解できると思う。

799 名前:788 mailto:sage [2008/11/09(日) 21:34:13 ]
>>795
>>798
まさにこれだ!!!
ありがとう!!!

800 名前:655 mailto:sage [2008/11/10(月) 00:15:33 ]
>>655
If Weekday(Date) = 7 And (Day(Date) + 7) \ 7 = 3 Then
Range("A1").Value = "明日は第三週の日曜日"
End If
正直な話、説明がさっぱり理解できてませんでしたが、がんばったらできました。

801 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 10:07:40 ]
>>786
書いて良かった。誰?とか言ってゴメンなw

>>790
処理対象ファイルが自動的に特定できれば一番ラクそうだけど、
人間が見ないと特定できないの?
あるフォルダ内でタイムスタンプが今日付けの .xls とかでも無理?
正直、アドインにする利点がピンと来ない、、、

802 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 11:51:04 ]
>>801
販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
たとえは今日なら20081110.xlsって手打ちで名前をつけてね。
それをこのマクロの入ったBook1.xlsから呼び出すんだ。

それを、アドインにしておけば、xlsを吐き出すことなく、読み込むcsvの名前をつけて保存すればよくなるだけだなと思ったら、これはいいアイディアだと思う。

803 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 12:55:12 ]
>>802
>販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
保存する前の段階でBook1.xls開いてマクロ動かせばいいだけじゃね?
一々保存してからマクロ動かさないといけない理由でもあるのか?

804 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 12:58:20 ]
>>802
なるほど理解した。けど単にツールバーにマクロ登録でいいような、、、

805 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 13:33:50 ]
今までが無駄過ぎただけだな。

806 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:03:48 ]
>>803
保存しないとファイル名がないから別のブックからコントロール奪えないと思ってたorz

807 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:05:19 ]
>>804

それがアドインかと思ってたorz orz



808 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:24:04 ]
>>804
そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。

809 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:26:46 ]
>>808
ツールバーにマクロ登録すると
その販売管理ソフトが吐き出したブックをExcelで開いたときにマクロを動かせます。

810 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:30:27 ]
うーんだからマクロっていうのはだなあ.....ってところから説明しないとダメ?

811 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:40:33 ]
マクロが記述してあるだけのブックを用意して
そのマクロをツールバーに登録するんだよ
ネットワーク越しでも大丈夫だし

812 名前:デフォルトの名無しさん [2008/11/10(月) 23:38:11 ]
初心者なので、丸投げでお願いします。

application on timeを使って、
開始したら、
a時に処理1をやって、その20秒後に処理2をやって、その8秒後に処理3を
やって、終わる。
というものです。
どうにも、最近、頭が回らなくなって困ってます (~.~)


813 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:48:19 ]
はい次の話題

814 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 00:02:20 ]
812の追記
処理1は、マクロ1。処理2はマクロ2。処理3はマクロ3と
いうことでお願いします。



815 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 01:31:29 ]
A1に「08/11/11」と入力されているのをB1に「20081111」と変換させるマクロを作りたいと考えています。

Cで書くと下記みたいな流れになるかなと思うんですが・・・(間違ってるかもしれませんが)

abc ="08/11/11";
sscanf(abc,"%d/%d/%d",&a,&,b,&c);
printf("20%02d%02d%02d",a,b,c);

VBAで書くにはどんな関数使えばいいのでしょう。

816 名前:812 mailto:sage [2008/11/11(火) 01:45:58 ]
自己解決できましたので、
>>812 814はスルーでよろっ。


817 名前:815 mailto:sage [2008/11/11(火) 02:02:40 ]
文字列操作でこうやってみた

                tmpdate_y = CStr(Left(Sheet1.Range("A" & i).Value, 2))
                tmpdate_m = CStr(Mid(Sheet1.Range("A" & i).Value, 4, 2))
                tmpdate_d = CStr(Right(Sheet1.Range("A" & i).Value, 2))
                tmpdate = "20" & tmpdate_y & tmpdate_m & tmpdate_d

スマートじゃねえよなーorz



818 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 02:09:50 ]
>>815
いったん日付型にしてから書式変換するとラクだと思う
文字列→日付型への変換は cdate()
日付型→書式付文字列変換は format()
詳しくはヘルプ読んでね

819 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:44:30 ]
すいません質問です
エクセルのマクロで
module1内にコード書くのと
sheet1内にコード書くのとでは
動作にどんな違いがありますか?
sheet1から他のシートを対象としたselectionメソッドが失敗するようなのですが・・・


820 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:50:39 ]
訂正)Selection→Select

821 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 20:51:01 ]
>>445で解決しましたすいません

822 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 21:15:30 ]
こんばんは
複数のセルの値を一度に比較することってできますか?
Sheet1のA1:B5とSheet2のA1:B5のValueが
同じであるかどうか、が分かるだけでokなのですが。

823 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 00:20:52 ]
各シートは配列のようにアクセスできるが

824 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 01:57:12 ]
>>822
配列数式でできるよ

825 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 05:52:03 ]
Excel2003を使っています。
羅線の太さを調節する方法ってありますか?
できるだけ細くしたいのです。


826 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 06:21:13 ]
>>825
マクロの記録使って保存すればおk

単純に細くするだけの質問ならスレチ


827 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:48:05 ]
Excel2000:WindowsXP/Pentium4(1.8GHz)/RAM512

セルA1とA2を結合したシートに対して
下記のコードの実行時間は
1回目:13秒
2回目以降:54秒 (Pasteに変更すると29秒)

1回目と2回目以降の違いの理由は何なのでしょうか?

rows(1).select
selection.copy
selection.offset(1).resize(20000).select
selection.insert shift:=xlDown
selection.mergecells = false
selection.delete shift:=xlUp
range("A1").Select

どうやったら速度アップできるか知りたいのですが...




828 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:52:09 ]
羅線ってなんだ?
らせん?

829 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 13:26:01 ]
螺旋
罫線
新羅
確かに間違える人は居るかも

830 名前:827 mailto:sage [2008/11/12(水) 14:59:51 ]
やりたい事は
シート・アクティブ時にコピー挿入し編集
シート・ディアクティブ時に挿入データを削除(元の状態に戻す)
なのです。

831 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:02:57 ]
> 1回目:13秒
> 2回目以降:54秒 (Pasteに変更すると29秒)

単位、「秒」じゃなくて「_秒」の間違いだよね?

832 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:15:35 ]
秒です。

833 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:17:38 ]
セルを結合していなければ1秒未満です。

834 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:20:33 ]
いや、結合していても_秒でしょ

835 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:34:39 ]
結合云々は関係なく1秒かからんな
データは何かあるのか?

とりあえず高速化のために
Application.ScreenUpdating=False
はやってるよな?

836 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:54:59 ]
新規ブックでセルをマージし、>>827のコードを走らせただけです。
ScreenUpdating, EnableEvent, Calculation等もやってみています。

マシン・スペック(5年前)の問題でしょうか?

837 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 16:15:36 ]
スペックは漏れのマシンのほうが悪いくらいのはずw
計測方法の問題じゃないか?



838 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 16:54:32 ]
すまん、Mobile Pentium4の間違いだったorz

839 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:23:09 ]
Mobile Celeron(1200MHz)512MB RAM
Mobile云々は置いといてこっちは1.2GHzなんだよw
OSが2kだからってここまで差は出ないよな?
体感でも1秒以上かかってるのか?

840 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:38:52 ]
excel2003:WindowsXP/Pentium4(2.8GHz)/RAM512
でセルA1とB1を結合して走らせてみたら
1回目:9秒
2回目:40秒

体感で1秒未満は、セル結合無しの場合だけ

841 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:53:33 ]
あぁA1とB1を結合かw
それなら確かに遅くなるな

842 名前:827 mailto:sage [2008/11/12(水) 18:00:26 ]
>>827のA1とA2はA1とB1の結合に訂正願います orz

843 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 18:03:34 ]
俺の古典的環境だと1回目20秒、2回目1分40秒w
遅過ぎワロタw

844 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:23:38 ]
>>830
どこまでが編集前でどこからが編集後?
編集は .mergecells = false の前?後?

845 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 09:30:46 ]
*)シート(A1とB1結合)アクティブ時の処理
rows(1).select
selection.copy
selection.offset(1).resize(20000).select
selection.insert shift:=xlDown
'コピー挿入した行に名前を付ける(後で削除の為)

*)コピー挿入したデータへの編集

*)シートディアクティブ時の処理(アクティブ時点の状態に戻す)
'実際にはSelectionでは無く名前で削除
selection.mergecells = false '<- これ無しだと遅くなる為
selection.delete shift:=xlUp
range("A1").Select


846 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 09:40:02 ]
メモリ1ギガとか積んでいる人だと1回目と2回目の差が無いなんて事ないですか?

847 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 12:31:54 ]
>>845
了解

多数の結合セルを含む範囲で挿入/削除を続けてやると、後でやる方の処理が遅くなる感じ
メモリ上のシート情報がややこしくなるのかな?1回目をやった後ブックを閉じて開き直すか、
シートコピーでリフレッシュすれば2回目が遅くならないけど、イベント拾うならキツイよね

オレなりに試してみた限りでは、

挿入時: .insert を使わず、2行目以降にデータがあった場合は 20000行ずらした位置へ
      コピーし、狭間へ 1行目を 20000行分コピー
削除時: 最初にシートコピーでバックアップを取っておいて、.cells.copy でコピーし戻す
      ( .mergecells = false もいらない)

ってなやり方が一番早かった。1回目は大差ないけど 2回目が 1回目より早くなる



848 名前:845 mailto:sage [2008/11/13(木) 13:26:06 ]
>>847
有難うございます

挿入処理は、
insertを使わない方法(Paste)は、定義されている名前がある場合面倒そうです

削除処理は、
ご指摘のシートコピーを戻す方式を実際の処理に組み込んでテストしてみます

849 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 17:21:48 ]
>>848
名前か。それは厄介だ
挿入に insert 使ってコピー書き戻すと名前付き範囲の内容書き変わるし
insert だけでも 2回目は遅くなるし

後は、編集時にシートコピーしたシートを使っといて、deactivate されたら
シートごと削除とかかなあ。イベントあるからいろいろめんどくなるんだよな、、、

850 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 17:26:26 ]
シートのコピーから戻す方式を試したら更に時間が掛かる様になってしまった

851 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 18:16:20 ]
>>850
データ量や数式、書式設定その他によってかなり違うだろうね
オレのはあくまで>>827の条件で試しただけだし

852 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:52:40 ]
>>847の処理における名前付き範囲は、挿入時に
range("namedarea").offset(20000).name = "namedarea"
コピーバックの後に .offset(-20000) で、わりと簡単に対応できた
画期的なやり方は見つからんね。構成とか見直すしかないかも、、、

853 名前:851 mailto:sage [2008/11/14(金) 00:13:24 ]
とりあえず、A2:Z3000 をテキトーな数式で埋めて試して見たけど、
やっぱ>>847のが早かった。calculation 切れば数式なしの時とあんま変わんない
とにかく insert (特に 2回目)が遅いんで、insert とコピーバックの組み合わせでは
効果ないかも

854 名前:デフォルトの名無しさん [2008/11/14(金) 21:41:28 ]
はじめまして、こんばんは。
今日はじめて本屋にて VBA の存在を知りました。
初心者質問ですみません、例えば、、、これができるようになるとなにができるようになるのですか?
詳しいかた教えてください。


855 名前:デフォルトの名無しさん [2008/11/14(金) 22:05:58 ]
>>854
例えば野球データベース
選手名を入力すればその選手のプロでの全成績が一覧表示されるとか

インベーダーゲーム作ってる人もいるよ

とにかくExcelをVBAプログラムで自在に操れるって事

856 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 19:22:40 ]
>>854
業務で言うと、データベースをexcelに展開して、
色んなチェックプログラムを掛けて品質保証したりとか。
ワークシートで使える関数を作って会社内に配布したり。

excel上に検索エンジン作ってる人もいるし、まぁ、何でもあり。


857 名前:無職カス [2008/11/16(日) 02:50:07 ]
みなさん、こんばんは、 >>854 です。
>>855
>>856  さん      返答ありがとうございます。かなり使える機能ですね。
 最近アルバイトをやめました。時間はたっぷりありますのでそこそこ使えるレベルまでもっていきます。
これからVBAを勉強していきます。

多々質問すると思いますが、みなさんよろしくおねがいします。



858 名前:デフォルトの名無しさん [2008/11/16(日) 03:45:10 ]
下に全員の成績表があって、
そこから各部門のトップ5を上の小さい表に抽出したいんだけど、
ランクとは違う気がするし行き詰っています。
どなたかご教授願えますでしょうか?

859 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 05:08:38 ]
officexpのマクロと関数の処理順(と思われる事項)で知恵を貸していただきたく書き込みいたします。

セルAの値によってセルBの値が変わるよう関数を設定しているの状況で、
セルBの書式が自身の値によって変わるようにマクロを組もうとしています。
(書式は4種類以上なので条件付き書式は使えません)

worksheet_changeで書式変更を自動実行するようにしたのですが、
マクロを実行してみるとAの値を変えてもBの書式が変わりません(Bの値は通常通り変わります)
その状況で、まったく関係ないセルCの値を変更するとBの書式が変わったので、
マクロ自体には問題はないようです。

おそらく、A変更→マクロ自動実行→関数でBの値変更、という内部処理があるために
マクロによる変化が見られない状況であると思っています。
(違っているなら根本から考え直さないといけないかもしれませんが)
このような構成の場合、関数による値の変更が反映された後で
書式変更などのマクロが実行されるようにすることはできないのでしょうか?

ご教示お願い申し上げます。

860 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 10:11:55 ]
Calculate

861 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 10:51:08 ]
>>860
ご回答ありがとうございます。
5分前にcalculate使えばいいと気づいて、自己解決した旨書きにきたら
既にお答えくださっていたのですね。

初歩的な事でお手を煩わせてしまい、申し訳ございませんでした。

862 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 19:13:30 ]
>>857
基礎を勉強するには独学でも全然問題ないけど、
プログラム未経験で、かつ仕事に就いてないとなると、
プログラムの基本的な事を理解するまでに半年か1年かはかかると思う。

んで、そこから先は明確な目標が無いと無理。
やれる事が多いんだけど、ぶっちゃけた話、特化したプログラムには敵わない。
例えば>>855でゲームの話が出てたけど、確かに作る事は出来る。

けど、VBAからAPI呼び出してるに過ぎないし、更に言えば
タイムラインって概念がある&ドローツールのFlashなんかには到底及ばない。

ExcelVBAはあくまでExcelの処理系統のプログラムだと俺は考えてる。
Excel上での処理に関してはVBAがぶっちぎり。当然だけどね。

何か目標持った方が良いよ。

863 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 19:15:00 ]
>>859
calculate使う理由が分からん・・・。
VBAで処理してるなら、VBAでBの値も弾き出せば良いんじゃないか?


864 名前:独り言(ちら裏) mailto:sage [2008/11/17(月) 01:24:05 ]
というか、条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に
問題ありかと...
それがExcelのポリシーというのであれば、そういうアプリめいたものを
Excelで作ることが間違いだったということになるか...

865 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 10:16:53 ]
> 条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に
> 問題ありかと...
という意見が多いので、2007で設定数が 3 から 無制限 に、
優先順位も設定を書き直さずに変更できるようになった。

866 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 14:02:59 ]
ということで、Excel2007以降の購入をお勧め

867 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:07:26 ]
てゆーか、条件によって変化するセルの書式の種類は3つに留めておく
というのが無難かと



868 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:50:10 ]
>>864
selection changeイベントで好きなだけ設定しろ。
おまいのVBAは飾りもんか?

869 名前:デフォルトの名無しさん [2008/11/18(火) 17:07:45 ]
これのFSO(FileSystemObject)使ってテキストデータの読み込みすると文字化けします。
ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110.html
strRECをUTF-8→SJISにエンコードするには、どう記述したらいいですか?







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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