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
マイッチングまちこ
てか、正規表現でも使うの?マッチングって事は。
555:デフォルトの名無しさん
08/10/17 02:37:01
ブレーク処理とかマッチング処理なんて言葉が出てくるのは業務系のコボラーに多いな。
COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。
556:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/17 11:44:28
>>557
ありがとう
家に帰ったらいろいろ試してみます
559:デフォルトの名無しさん
08/10/17 17:54:59
セルの値が1のときセルの色づけ赤,2のときセルの色づけ青
とするマクロをVBAで組んだのですが,一回実行した後,
セルの値を1から2を変更しても,実行ボタンをあらためて
押さないと色が青に変わりません。
2を入力すれば直ちにセルの色づけが青に変わるようにする
ためにはどのようなコードを入れればよいのでしょうか。
よろしくお願いします。
560:デフォルトの名無しさん
08/10/17 18:27:43
>>559
ボタン押したら色が変わるようにしたんだろ?
だったら当然だな
入力してすぐに変えたければ
1.ボタンはやめてワークシートのChangeイベントで動かす
2.VBAをやめて条件付書式にする
どちらかだな
ところでテンプレ>>1の★5読んだか?
561:デフォルトの名無しさん
08/10/17 19:06:41
>>560
ありがとうございます。
まったくの初心者です。場所を間違えたようです。
失礼しました。
562:547
08/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:デフォルトの名無しさん
08/10/17 21:38:26
>>562
ダメだった時はどうダメだったのかを書こうぜ
> 特定セルと特定セルの右隣を関数に入れて比較
そこは合ってる
で、右隣のセルに入ってるのは日数じゃなく年数でしょ?
後はもっぺんヘルプ読んで
564:デフォルトの名無しさん
08/10/18 01:46:12
>>559
条件付書式だかそんな感じの奴でマクロなしでできる
565:547
08/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:デフォルトの名無しさん
08/10/18 05:47:32
>>565
おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ
今日の日付に足したら、何足したって未来になるだろw
>>562のでほぼ合ってるんだよ
オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、
おまいのにはないのか?
567:565
08/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
08/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:デフォルトの名無しさん
08/10/18 08:23:40
>>567-568
> yyyy yyyy
ちょwマジでw
おちおち「ヘルプ読め」とも言えんじゃないか
まあそっちは解決したようで良かった
イベント変更の方だが、worksheet_activateは引数を取らないから、
そうなるのは当然だな
引数を消して、targetを自前で指定してやればOK
つか、workbook_openイベントもあるんだが
つか、今さらだけど、
色変えたいだけなら条件付き書式でもできるがw
570:デフォルトの名無しさん
08/10/19 02:32:28
VBAにEffective C++やEffective Javaみたいなガイドラインってある?
571:568
08/10/19 02:58:41
>>569
>色変えたいだけなら条件付き書式でもできるがw
こ、こんなのあったんですか・・。
春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。
わざわざVBAを使う必要無かったんだ・・・。
___________
||
|| ⊂⊃
|| ∧ ∧
|| ( ⌒ ヽ でも勉強にナターヨ・・・
∧||∧ ∪ ノ
( ⌒ ヽ 彡 V
∪ ノ フワーリ
∪∪
572:デフォルトの名無しさん
08/10/19 03:29:41
ほんとに色変えるだけなのかよwまいったw
>>559もそうだし、こういう奴、実は多いのか?
何という時間の無駄
573:デフォルトの名無しさん
08/10/19 07:09:25
悪いけど笑わせてもらう
ァ ∧_∧ ァ,、
,、'` 。゚( ゚^∀^゚)゚。,、'`
'` ( ⊃ ⊂) '`
574:デフォルトの名無しさん
08/10/19 07:12:51
関数でできることをマクロでやろうとしたり、案外よくあるよな
575:デフォルトの名無しさん
08/10/19 12:16:55
だんだんとワークシート関数がウザくなってくるんだよなw
576:デフォルトの名無しさん
08/10/19 17:15:03
暇だから何か問題だしやが……出して下さい
577:デフォルトの名無しさん
08/10/19 20:25:44
>576
Excel総合相談所74で質問が出てますよ。(レス番号325です)
578:デフォルトの名無しさん
08/10/19 20:49:32
プログラミング初心者かつエクセルにも詳しくない奴が、
この手ので延々悩むんよね
心理的ハードルを超えさせる書式の魔力おそるべし
579:デフォルトの名無しさん
08/10/19 21:31:47
>>576
4色問題お願いします。
580:デフォルトの名無しさん
08/10/19 22:29:21
>>577
ありがと
解決済みだった
>>579
全ての図形が4色で塗り分けられるとかなんとかだよね
図形の形とか定義あるのかな?
セルに色塗るなら二色で出来ちゃうし
581:デフォルトの名無しさん
08/10/19 22:33:43
二次元配列に書き出したセル範囲のデータををリストないしはコンボボックスに
格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?
582:デフォルトの名無しさん
08/10/19 22:43:16
>>581
あります
入力規則のリストなら、マクロの記録録ればわかります
コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます
但しフォームツールのコンボボックスなら多分セル書き出し必須
583:581
08/10/19 22:50:06
>>582
すみませんコントロールツールボックスの方です
シートに書き出せばRowSourceプロパティで簡単なのは存じてますが…
584:デフォルトの名無しさん
08/10/19 22:51:02
>>580
4色問題ってこんな感じのです。
URLリンク(yougo.ascii.jp)
585:デフォルトの名無しさん
08/10/19 22:59:02
>>584
ありがとう
1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす
2.領域ごとに、隣り合わせ同色にならないように色IDを付ける
3.色IDが1から4で収まっているか判定
っていうアプローチでよいかなあ
アルゴリズムの問題っぽいがw
586:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/19 23:51:40
ちらつき抑制でよいかな?
forの前に
Application.ScreenUpdating = False
を入れると、シートの描画しないから早くなる
少しずつ描画見たいなら、例えばNextの間に
Application.ScreenUpdating = Tlue
Application.ScreenUpdating = False
を追加すると、Iが一つ進むごとに描画される
例えばIが100ごとに実行したいなら
J Mod 100 使ったりできる
589:デフォルトの名無しさん
08/10/19 23:54:01
つーか、配列を0始まりではなく1始まりにしてそのまま書き出したらいいやん
590:デフォルトの名無しさん
08/10/20 00:20:55
>588
21秒から13秒に8秒も短縮できました。ありがとうございます。
>589
具体的に「そのまま書き出す」ってどうすればいいんですか?
よろしくお願いします。
591:デフォルトの名無しさん
08/10/20 00:29:07
>>590
>>589じゃないけど、
range(cells(1,1),(cells(10000,10)) = X
592:591
08/10/20 00:30:17
タイプミス
range(cells(1,1),cells(10000,10)) = X
593:デフォルトの名無しさん
08/10/20 00:36:38
base 1 にするのはお勧めできない。
変数に+1しる。
594:デフォルトの名無しさん
08/10/20 00:41:35
592>>
やってみました。1秒かからないんですね!ありがとうございました。
595:デフォルトの名無しさん
08/10/20 00:42:22
base 1 にするのはお勧めできないが
変数に+1するのもお勧めできない
X(1 To 10000,1 To 10)にしる
596:デフォルトの名無しさん
08/10/20 00:49:07
すみません
Range(Cells(1, 1), Cells(1000, 10)) = X(1 To 10000,1 To 10)
とするとコンパイルエラーがでるんですが・・・。
597:デフォルトの名無しさん
08/10/20 00:52:29
>>596
違う違うw
1 to 10000 とかを書くのは dim のとこ
598:デフォルトの名無しさん
08/10/20 00:56:26
Dim X(1 To 10000, 1 To 10) As Double
でしたね。失礼しました。
みなさんどうもありがとうございました。
599:デフォルトの名無しさん
08/10/20 02:02:50
EXCEL XP, 2000, 2003, 2007において、
VBAはクアッドコアに対応しているの?
コア4つのVBAはやはり処理が早いんだろうか・・。
600:デフォルトの名無しさん
08/10/20 04:35:01
>>582
余談だけどフォームの方もできる
601:デフォルトの名無しさん
08/10/20 06:43:22
すみません
文字列の入ったセルをselectした際に、単にselectにするだけではなく、
編集中の状態にまでもっていきたいのですが、
そのような方法を御存じないでしょうか。
select後、sendkeys"{F2}"で実現できるのですが、
Sendkeysを使用しない方法を探しています。どうか宜しくお願いします。
602:デフォルトの名無しさん
08/10/20 08:24:46
数式バーで編集じゃだめなの?
603:デフォルトの名無しさん
08/10/20 13:42:57
Excel2003でSheet1のセルA1に日付を入れる(08/10/01)とSheet2以降のセルA1に次の日付になるように反映させるにはどうしたらいいですか?
604:デフォルトの名無しさん
08/10/20 13:52:14
>>603
Sheet2以降のセルA1に、「=Sheet1!A1」と入力。
605:デフォルトの名無しさん
08/10/20 13:54:49
+1忘れた
606:デフォルトの名無しさん
08/10/20 14:05:48
>>604
㌧
607:デフォルトの名無しさん
08/10/20 16:56:04
どこがVBAやねん
608:デフォルトの名無しさん
08/10/20 18:13:53
春から悩んでたかも知れないじゃないか
609:デフォルトの名無しさん
08/10/20 20:11:15
>>599
まず、複数スレッドを作ることが実質的に無理だ。
Excel自体も、2007から再計算を複数スレッドで行えるようになったくらい。
610:デフォルトの名無しさん
08/10/20 20:17:31
依存関係ありまくりの計算だからなあ。
611:デフォルトの名無しさん
08/10/21 15:00:07
オートフィルターがオンになっているシートの選択行について、ソートと処理を
行った後、再度元の並びに戻す方法を模索中です。
1)選択行範囲の最後(列n)に式["=ROW()"]を設定
2)列nの式を値に変更(コピぺ)
*ソートと処理を行う
4)列nで昇順にソートした後、列nを削除
この方法だと選択範囲内に不可視のデータが存在すると、[2)]でコピーと貼付け
の領域が違うため貼付けエラーになります。
1行ずつ行番号をセットする方法は件数が多いと時間が掛かる為オートフィルター
情報を取得しておき、一旦オートフィルターオフにしてからコピペしています。
他にもっと良い方法をご存知でしたら御教授願います。
選択データを他ワークシートにコピーして処理する方法が一番良い気もしますが
データ量が三万件とかだとコピーにも多少時間が掛かるので...
612:デフォルトの名無しさん
08/10/21 17:29:28
>>611
仮に、"=row()" を入れた範囲を range("G5:G10") として、
G列を非表示にして、
range("G5:G10").value = range("G5:G10").value
ってのはダメ?
613:611
08/10/21 18:27:03
>>612
助かりました、有難うございます。orz
だけど、非表示だと何故上手くいくのでしょう?
614:デフォルトの名無しさん
08/10/21 18:33:32
どこがVBAの問題なのか春先まで悩みそうだ
615:デフォルトの名無しさん
08/10/21 19:41:59
>>613
わからん。なんかやってみたらできた
仕様なのかバグなのかも知らんw
616:デフォルトの名無しさん
08/10/21 21:01:59
非表示だと pastespecial もうまくいくな
どうやら仕様くさい
617:VBAの初心者
08/10/21 21:24:20
初めまして。自分は知り合いにVBAを教えて貰っているんですが、相手に人はPCが
無くよく分らなくてもし良かったら教えて下さい。
だだ走らせるだけの凄い簡単なプログラムらしいんですが私には走らせ方が分らな
くて困ってます。
10 for m=1 to12
20 print m
30 next m
40 stop
なんですが凄い初心者なのでエクセル開いた所から分らなくて教えて下さい。
618:デフォルトの名無しさん
08/10/21 21:27:30
それはVBAじゃない。VBでもない太古のBASICのプログラム。
619:VBAの初心者
08/10/21 21:30:01
らしいです。VBAを覚えたいなぁ~って言ったら色々言われて私が全然分からなく
なってしまったので、まず見れる簡単なの教えてと頼んだんですが、今のじゃ無理
なんでしょうか;
620:デフォルトの名無しさん
08/10/21 21:50:26
もしかしたら、その相手の人は(Excel) VBAを知らないという可能性も考えられる。
VBAも含めてナントカBasicってのは山ほどあるけど、どれも全く別物。
敢えて共通点をあげるとしたら名前にBasicが付いていることだけ、というのはさすがに言い過ぎだけど。
そして、お前は何をやりたいのか。Excel VBAで間違いないんだよな?
621:デフォルトの名無しさん
08/10/21 22:39:24
釣られすぎ
622:デフォルトの名無しさん
08/10/21 23:24:21
縦読みじゃないのね。
623:デフォルトの名無しさん
08/10/22 07:27:31
Interiorってクラス名としてはどうなんですか?
624:デフォルトの名無しさん
08/10/22 10:00:18
激しく紛らわしいからやめた方が良いかと
625:デフォルトの名無しさん
08/10/23 00:27:13
自作クラスのインスタンス380個ぐらい作ったらメモリ不足になった
626:デフォルトの名無しさん
08/10/23 19:16:21
そりゃクラスの内容に因るだろうな
個数や上限決めておらず、必要に応じて作る場合とか
1万や2万は当たり前に使ってることあるが
ちゃんと配慮してれば全然問題ない
627:デフォルトの名無しさん
08/10/24 11:20:18
選択アドレスから重複を削除する方法はありますでしょうか?
例えば、選択したアドレスが[$A$2:$A$5,$A$5:$A$10]の場合、そのアドレス
範囲で集計(Subtotal)するとA5が重複して集計されてしまいます。
Excelのステータスバー(右側)には重複を除いた合計値が表示されます。
これと同様の値(特定の1列のみ)をVBAで取得したいのです。
628:デフォルトの名無しさん
08/10/24 12:06:03
>>627
unionしちゃばOK
629:デフォルトの名無しさん
08/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
08/10/24 12:20:32
今テストしてたんだが離れたセルを選択した時に期待どおりの動きしないな・・・
631:デフォルトの名無しさん
08/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
08/10/24 12:29:12
RangeをUnionに書き換えたらいけたような気がするw
633:デフォルトの名無しさん
08/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
08/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:デフォルトの名無しさん
08/10/24 16:33:53
質問です。
エクセルで資料を作ったがMacroで両面コピーの方法が分からないので両面コピーの方法を教えて下さい。
636:デフォルトの名無しさん
08/10/24 19:46:01
質問です
訳あって欧文(ウムラウトを含むラテン文字の文章)の書き込まれたExcelシートから
内容を読み出してテキストファイルに起こしたいのですが、
Cells(?,?).valueやCells(?,?).TextからStringsの変数に読み出した時点でウムラウトが飛んで
近しい形状の通常のアルファベットに置き換えられてしまうようです。
結構ぐぐって見たのですが、読み出せなくて困った的な話はいくつか見つけたのですが
対処法について言及しているページが無かったので、皆さんのお知恵をお借りできないかと
思って書き込みさせていただきました。
なにかお知恵などありましたらよろしくお願いいたします<(__)>
637:デフォルトの名無しさん
08/10/24 20:14:02
>>635
何を何処へコピーするのか
638:デフォルトの名無しさん
08/10/24 20:26:20
両面コピーって両面印刷の事?プリンタの話になるんじゃないの?
639:デフォルトの名無しさん
08/10/24 20:33:08
>636
元となるExcelファイルは、Excelのどのバージョンで作られたものですか?
あるいは、どこの国用のExcelで作られたものでしょうか?
VBAを利用せず、直接シートの必要な範囲をコピーしてエディタへ(ウムラウトは消えずに)
ペーストすることはできたのでしょうか?
↓このサイトは見ましたか?
URLリンク(www.microsoft.com)
Office XP リソース キット / 国際環境での導入計画 / 国際環境でのメンテナンス
Unicode サポートの活用
「多国語テキストのコピー」の項と、「VBA で Unicode 値を使用する」の項が参考になるかも。
640:デフォルトの名無しさん
08/10/24 21:48:44
あるサブルーチンをForループで回すと100回くらいなら一瞬で終わるんですが、
500回とかそれ以上になるとなぜか無限ループにでも入ったみたいに計算が終わってくれません。
オーバーフローのエラーメッセージが出ることもないし、実際オーバーフローするほど大きな数を扱っているわけでもない。
原因としてはどんなことが考えられるでしょうか?
641:デフォルトの名無しさん
08/10/24 21:53:05
サブルーチンのforカウント変数をステータスバーにでも表示してデバッグのヒントにするのだ。
その情報だけだと、メモリかCPU?としか言えない。
642:デフォルトの名無しさん
08/10/24 21:55:54
>>635
sub 裏表印刷()
印刷実行
Msgbox ゛用紙裏面をセットしてください゛
印刷実行
end sub
643:デフォルトの名無しさん
08/10/24 21:56:08
>>641
メモリっぽいですね。ちょっと調べてみます。
ありがとうございました。
644:デフォルトの名無しさん
08/10/24 22:09:55
>>640
DoEvents
URLリンク(homepage2.nifty.com)
645:デフォルトの名無しさん
08/10/25 00:45:40
636です
>>639
動作環境を書くのをすっかり失念してました
この手の質問には必須なのに…申し訳ありません
OSはXP日本語版でExcelは日本語版Office2000に含まれるものです。
現在VBA開発に使用しているxlsファイルは
Exciteの機械翻訳で出したものをコピペしてBOOKに張り付けてテストデータとして作成したものです
紹介していただいたリンク先を読むと、VBAではunicodeを標準ではサポートしていないようですね
(VBでは文字列関係の内部処理はUnicodeで処理されてるのに…変な気分…)
まあ、テストデータで使用している文章がUnicodeではなく単純に欧文ASCIIコードの文字列の可能性もあるので
Unicodeをサポートしていればうまく行くとは限らない気もしますが
でもちょっと手がかりをもらえたのでもう少し試行錯誤してみようかと思います。
646:デフォルトの名無しさん
08/10/25 07:04:27
オーバーフローの意味もしらないのかVBA厨房は
647:デフォルトの名無しさん
08/10/25 11:29:01
アクセスならともかく、エクセルでプリンタ設定いじるって難しいくね
648:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/25 15:46:42
どなたかお教えください
マクロでたとえばですが
ActiveCell.Replace What:="*", Replacement:="x"
のように セル文字列の * の部分だけをxに変換したいのですが
アスタリスクはすべて変換してしまいますよね。
A1*A1 という文字列を上記マクロ実行するとA1xA1 という結果になって
ほしいのですが。実際は x 担ってしまいます
どのようにすればよいのでしょうか。
650:デフォルトの名無しさん
08/10/25 16:07:52
>>649
ActiveCell.Replace What:="~*", Replacement:="x"
651:デフォルトの名無しさん
08/10/25 16:09:39
>>650
すごいですね。どうもです
652:デフォルトの名無しさん
08/10/25 17:06:03
春先から悩んでた人多いな
653:デフォルトの名無しさん
08/10/25 18:11:57
>>645
参考になるかも
URLリンク(codezine.jp)
654:デフォルトの名無しさん
08/10/25 19:10:31
しかし、エスケープシーケンスはもっとわかりやすくしてほしいよな。
655:デフォルトの名無しさん
08/10/26 03:08:58
教えてください
VBAで、明日が三週目の日曜日だった場合A1に○○と表示するってやりたいんでがどうやればいいですか?
656:デフォルトの名無しさん
08/10/26 03:24:14
>>655
明日の日付はDate関数に+1すれば解る
特定の日付が日曜日か否かはWeekday関数で解る
3週目か否かは日を算術演算すれば解る
あとはそれらを条件に条件分岐してA1に値を代入すれば良い
この説明で解らなければ>>1★5なので、さようなら
657:デフォルトの名無しさん
08/10/26 03:44:51
>>656
ありがとうございます。
算出演算ってのがよく解らないですががんばってみます。
658:デフォルトの名無しさん
08/10/26 06:05:51
だからエクセルでやれよ
659:デフォルトの名無しさん
08/10/26 13:35:27
だよな。数式でできるレベル
660:デフォルトの名無しさん
08/10/26 13:40:58
質問です。
Excel2003を使っています。
コマンドボックスをクリックするたびに、セルA1の数に1ずつ足していくマクロを作りたいのですが
どなたか教えていただけませんでしょうか。
よろしくお願いします。
661:デフォルトの名無しさん
08/10/26 14:10:39
ちょっとは自分で調べる努力した?
662:デフォルトの名無しさん
08/10/26 15:32:19
>>660
コマンドボックスって何ぞや?
663:660
08/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
08/10/26 15:48:36
お教え願いますか
'=A1 という文字列を =A1 という数式に変換するマクロありますか。
同かよろしくお願いします。
665:649
08/10/26 15:50:36
舌足らずでした
あるセルに '=A1 という文字が書かれています。
マクロコマンド使って =A1 という数式に置換したいのですが。
どうかよろしくお願いします。
666:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/26 16:33:34
>>663
Range("A1").Value = Range("A1").Value + 1
668:デフォルトの名無しさん
08/10/26 16:43:51
こんなばかみたいな質問にいちいち答えるなよ
669:660
08/10/26 16:47:26
>>666
>>667
ありがとうございました。
一から勉強してきます。
670:デフォルトの名無しさん
08/10/26 17:06:11
変数の定義ができないとか、
単純な代入式も書けないレベルの奴は入門書買え
いちいち他人の手を煩わすな
671:デフォルトの名無しさん
08/10/26 22:22:34
初めて質問させていただきます。
初心者ではないですが、レベルは低いですσ^^;
セルを指定するときに、Range("A1")ではなく[A1]というふうにやってるんですが、
これだとなにか悪影響がありますか?
今のところ困るのは、説明書やhelpの類がすべてRange形式のものばかりなので、
書き方が分からない時がある、ってことくらいです。
単に字数が少なくて済むからという理由で[**]形式にしているんですが、
ちょっと気になってます。
というか、そもそも気にしたほうがいいのか気にしなくてもいいのか・・・
672:デフォルトの名無しさん
08/10/26 22:45:34
他の人が見たときに分かりにくいとか
少なくとも俺はわからん
673:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/26 23:27:30
簡単なマクロ程度をゴールにしてるならどんな形式でも良いけど、
本気で業務に使うプログラムやら、もっと高いゴールを目指すなら、
初心者のうちからcellsで指定する方が良いと思うよ。
rangeと言えば、あくまでrangeオブジェクトである訳で・・・。
何より変数絡めてセルの指定するようになると可読性が著しく下がる・・・。
タッチ数も増えるしで、良い事ない。
675:デフォルトの名無しさん
08/10/26 23:28:39
最後の3行が言いたかっただけちゃうかー
676:デフォルトの名無しさん
08/10/26 23:36:52
?
677:デフォルトの名無しさん
08/10/27 00:10:33
[A1]なんて書き方知らなかった……。もっと精進するわ。
678:デフォルトの名無しさん
08/10/27 02:51:46
>>671
結局は evaluate の省略記法だから、excel に渡して評価させる分、
多少処理の無駄があるんじゃないかと思う(たぶん)
[A1].value = 0
range("A1").value = 0
それぞれ10万回ループさせると数秒だが差が出る
evaluate("A1").value = 0
は、[A1]記法とほぼ同じになる
誤差レベルだけど、回数の多いループ内とか、速度が気になる場合は
避けた方がいいかもね
679:デフォルトの名無しさん
08/10/27 09:49:00
[A1]だと後ろにピリオド打っても入力候補が出てこねぇ。
Cells(1,1)も出てこねー。
Range("A1")だと出てくる。
どれもいったんRange型変数に入れりゃ同じだが。
680:デフォルトの名無しさん
08/10/27 10:57:11
スレリンク(gamedev板)
Syntax Error.しか知らないキチガイがあらわれました
681:デフォルトの名無しさん
08/10/27 11:57:01
URLリンク(detail.chiebukuro.yahoo.co.jp)
大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間続けているようです。
このようなケースではリニューアルを担当した業者はヨドバシカメラにどれほどの損害賠償を行うのでしょうか?
【ヨドバシカメラ】 ネットサイトをリニューアルしたら表示遅すぎでおわび [10/23]
スレリンク(owabiplus板)
ヤマダ.com/ビックカメラ.com/ヨドバシ.comを語ろう
スレリンク(kaden板)
【店員の質】ヨドバシカメラ総合17【落ちまくり】
スレリンク(kaden板)
補足
どうやら今回のヨドバシドットコムリニューアルはCMS導入が目的で、
キノトロープスリーイントという会社( URLリンク(www.k-3int.co.jp) )が請けたようです。
また、リニューアルの10/21から10/25現在までこの状況ですので、ヨドバシカメラの損失額は
億単位で発生していると言われています。
キノトロープってどうよ?PART4
スレリンク(venture板)
682:633
08/10/27 14:06:59
>>648
おぉー、素晴らしい限りです!
アクティブシート以外に対してIntersectは無理なのでしょうか?
683:682
08/10/27 14:21:18
失礼しました。orz
columns(c)を修飾したら出来ました。
684:デフォルトの名無しさん
08/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
08/10/27 16:34:34
>>684
究極のリファクタリング有難うございます。orz
こういうの教えられると、VBコードでゴリゴリ作るのが馬鹿らしくなってしまう...
686:671
08/10/27 22:41:20
みなさんいろいろご意見ありがとうございました。
RangeやCells形式も使いこなせるように、もっと勉強していきます^^
687:デフォルトの名無しさん
08/10/28 10:08:01
もう1つ教えて下さい。
選択エリアの全行数は
For each r in Selection.Areas
rcnt = rcnt + r.Rows.Count
Next
で求めていますが、一気に知る方法がありますでしょうか?
688:デフォルトの名無しさん
08/10/28 18:29:27
>>687
一気に知る方法は知らないがそのままだと重複している行もカウントされる
少し前で話題に出たIntersectを組み込んで
For Each r In Intersect(Selection.EntireRow, Selection.EntireRow).Areas
とかにしたほうがいいんじゃないか?
689:デフォルトの名無しさん
08/10/28 21:48:43
初心者って「一気に」とか「1行で」とか好きだよな
690:デフォルトの名無しさん
08/10/28 22:14:07
コードが長くなると理解できなくなるんだよw
691:デフォルトの名無しさん
08/10/28 23:47:58
関数型プログラミングなら、一気にやるという書き方でも割と珍しくない感じがする。
もちろん面倒なことをやるなら1文あたりが相応に長くなるんだけど。
692:デフォルトの名無しさん
08/10/29 01:54:25
学習が下手な奴ほど早く学習する事が1つだけある
それは「人に訊いた方がラクだ」という事だ
なんちてw
>>687
一般的なやり方じゃないかも知らんが一応これで行けそう
重複行込み
rcnt = selection.entirerow.cells.count / activesheet.columns.count
重複行抜き
rcnt = intersect(selection.entirerow,columns(1)).count
693:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/29 03:31:17
>>693
.formula に入れるのはセルにそのまま打ち込める式
範囲指定のところが "B2:B11" とかの形式になるように、
文字列を生成すればOK
695:デフォルトの名無しさん
08/10/29 09:46:54
>>694
どうもありがと。
できれば、具体的な変換方法もお願いします。
696:デフォルトの名無しさん
08/10/29 10:03:37
>>695
宿題か何か?
デカい誤り指摘してヒントも出したんだから、
そこからもっぺん自分で考えてみような
じゃなきゃこんな練習問題やってる意味ないだろ
697:687
08/10/29 10:09:55
>>688
>>692
有難うございます。
「聞くは一時の恥じ...」
なんちてw
セル情報はExcelの基本関数知ってればコード記述で殆ど解決しちゃう
けど速度やメンテを考えるとコードは単純な程良い。
698:デフォルトの名無しさん
08/10/29 10:36:40
>>696
これ以上は分からん。
699:デフォルトの名無しさん
08/10/29 10:37:47
>>697
あ、速度考えるなら intersect とか濫用しない方がいいよ
10万回ループさせると>>692より>>687の方が早いんで
700:デフォルトの名無しさん
08/10/29 12:16:46
>>697
>けど速度やメンテを考えるとコードは単純な程良い。
これは少し間違ってる気がする
速度を考えるなら処理するデータを単純にした上でコードも単純なものにする
例えばセルのプロパティを変数に入れるとか
さらにメモリの使い方にも気を配れればいい
書くと短くても動かすと重たい処理なんてたくさんあるし
701:デフォルトの名無しさん
08/10/29 16:48:37
コードの見た目(行数、文字数とか)が単純なのと、
実際の処理が単純なのは違うよね
あと>>699の自己フォローなんだけど、
selectionの状態に依存するわな、、、w
areasが2-3ぐらいなら>>687の方が早いってことで
702:デフォルトの名無しさん
08/10/29 21:27:30
置換に関しての質問なのですが、
検索した2つ右のセルの文字の最後に1をつけたい場合どうすればいいでしょうか?
703:デフォルトの名無しさん
08/10/29 21:39:33
hoge = "あくまで一例"
set piyo = cells.find(hoge).offset(0,2)
piyo.value = piyo.value & "1"
704:デフォルトの名無しさん
08/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列の数字は同じものが入っています。
② C列に数値が入ります。
③ C列に合わせて、A列、B列を挿入、削除したいです。
C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は
行の削除がされると言う具合です。
業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
705:デフォルトの名無しさん
08/10/29 22:01:22
丸投げはやめようぜ。
自分で作ってみたけど、分からない所が出てきた。とかなら全然かまわないんだけど。
作成依頼所じゃないんで。
706:デフォルトの名無しさん
08/10/29 22:03:28
すいません、数値がずれまくりました。
もう一度書き込ませてください。
【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列の数字は同じものが入っています。
② C列に数値が入ります。
③ C列に合わせて、A列、B列を挿入、削除したいです。
C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は
行の削除がされると言う具合です。
業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
707:デフォルトの名無しさん
08/10/29 22:05:26
>>706
>705
708:デフォルトの名無しさん
08/10/29 22:22:44
>>703さん
ありがとうございます!!
A列全部で検索かけたい場合どうすればいいでしょうか?
709:704 706
08/10/29 22:27:40
申し訳ございませんでした。
EXCEL総合相談所で聞いてきます。
マルチになってしまいますが、ご了承ください。
レベルが上がったらこのスレに来たいと思います。
710:デフォルトの名無しさん
08/10/30 12:42:39
>>708
2003だとFindのヘルプにちょうどいい例が載ってるんだが2007では載ってないのか?
711:デフォルトの名無しさん
08/10/30 12:45:03
他のレスと混同してた・・・
712:デフォルトの名無しさん
08/10/30 21:03:32
>>708
cells はセル全部
columns(1) は1列目
ヒントはここまで。
713:デフォルトの名無しさん
08/10/31 03:25:08
>>706
ズリネタとして結構面白かった
714:デフォルトの名無しさん
08/11/02 18:00:44
dim rg as range
rg=activecell
処理
この処理後に、元のアクティブセルに戻る文が書けません。
どんなだったか、教えて。
715:デフォルトの名無しさん
08/11/02 18:07:50
もう一個、よろしく。
処理の中で範囲を指定してコピー、貼付をしている。
application.screenupdating=false を直前に入れても
画面が動くのですが、画面が動かないようにできませんか?
716:y
08/11/02 18:36:29
>>714
rg.Parent.Activate
rg.Avtivate
ついでに言うと、>714の2行目は構文ミスでエラーになるので修正が必要です。
>>715
CopyメソッドのDestinationプロパティに貼り付け先範囲を指定して、
一度にコピー・貼り付けを行うと、動く枠線が出ないようになります。
717:デフォルトの名無しさん
08/11/02 19:37:54
>>716
久しぶりなので、マクロの記録で、終わってましたorz
おかげで、思い出すことが出来ました。
サンクス。
718:デフォルトの名無しさん
08/11/02 20:51:29
>>716
その2行目も・・・
719:デフォルトの名無しさん
08/11/02 20:57:01
プログラム用のVBAコードを記述した非表示ブックから、データ用の任意のブック
を開き、データブックのイベントに対する処理をしています。
Excel2007はウインドウのタイトル右端の×ボタンが「閉じる」に対応している様
です。
Excel2007でも以前のバージョンと同様に「Excelの終了」にする方法を模索中です。
方法をご教授頂けると有難いです。
720:y
08/11/02 22:45:44
>>718
うは ご指摘ありがとうございます。
>>719
×ボタンでBeforeCloseイベントが発生するので、
同イベントプロシージャ内に
Application.Quit
を記述します。
721:デフォルトの名無しさん
08/11/02 23:00:30
range型変数にsetしてないってのは突っ込んじゃいけない所?
最近、微妙な空気が読めなくなってきたよ・・・。
722:719
08/11/02 23:24:17
>>720
自分もそれでExcelが終了すると思っていたのですが、ブックが閉じるだけです。
SnendKeys(Alt+F4)を試したら終了できました。orz
723:719
08/11/03 00:23:33
訂正です。
SendKeys(Alt+F4)でもだめでした。
プログラムブック(A)からデータブック(B)を開いて、Bが変更された場合に
変更を保存するかどうかを確認するダイアログが表示されるので、Alt+F4
を送信するとダイアログが閉じられる事になるのでExcelを終了できません。
724:デフォルトの名無しさん
08/11/03 00:25:16
>>722
application.quit の前にワークブックの close やってる?
後にしてみたらどうなる?2007はわからんけど、、、
725:722
08/11/03 00:44:26
>>724
もう少し具体的に教えて下さいませんか。
2007以外は×ボタンでExcel終了が終了するようになっています。
同じブックを2007の互換モードで動かして×ボタンでExcelを終了
したいのです。
この方法が分からないのです。
726:デフォルトの名無しさん
08/11/03 01:21:12
>>725
あ、ごめん
URLリンク(www.asahi-net.or.jp)
この辺の問題のことだったの。
2007以外ではいけてるなら関係ないね。失礼した
727:y
08/11/03 07:57:50
>>725
2007で試さずに>720を答えてました。2007ではQuitだとうまくいかないんですね?
一応、Shift を押しながら×クリックすれば一発で終了するので、それで用が済むなら。
VBAでのやり方は、後で職場の2007で探してみます。
728:デフォルトの名無しさん
08/11/03 09:09:42
range型ってsetしなくても使えるの?
729:デフォルトの名無しさん
08/11/03 10:14:59
範囲指定をしてコピー等をした後、コピーモードををフォルスにした
後のことです。
範囲指定を解除する方法は、どこかのセルをactivateやselectするしか
方法はありませんか。画面のちらつきを少しでも防止したいので、セル指定を
したくないのですが、何か方法が無いでしょうか?
730:デフォルトの名無しさん
08/11/03 10:51:57
久々にExcelのVBA触って改めて思ったけど、本当にVBAっていうかVBって糞言語だな。
>>725
724は具体的に言ってるでしょ。
ダイアログが出るために終了できないのならダイアログが出ないようにすれば?
どうしてダイアログが出るの?
ブックが変更されてるのに保存されてないからでしょ?
だったら保存したら?
こんなのパソコン初めて一週間のオッサンでも最初に覚えることの一つじゃないか。
>>729
全体的に何がいいたいのかよくわからない気がする。
731:デフォルトの名無しさん
08/11/03 10:54:12
どうしてもわからないので
教えていただきたいのですが、
Book1を起動して
Book1のマクロで
Book2を開くことはできたのですが
Book2の内容をコピーして
Book1に貼り付けすることができません
よろしくお願いします。
732:デフォルトの名無しさん
08/11/03 10:59:28
>>729
ググってもすぐ見つかるし
マクロの記録でもすぐ解るようなことを何故聞く?
そのものズバリの解除法が簡単に見つかるのに
>>731
Bool2を開くと、戻り値としてBool2のオブジェクトが返る
あとは好きなようにコピーなりなんなりすれば良い
733:725
08/11/03 11:12:00
>>730
保存するかどうかはユーザーが決める事で、プログラム側で決められる
のは、×ボタンが押されたらWindows2007以外と同様な動作なんだけど。
説明不足?それとも...
734:725
08/11/03 11:17:49
>>730
719に記述した通りなんだけど...
735:デフォルトの名無しさん
08/11/03 11:25:31
>>734
だから?
ついでに言えば、お前さんの言っている現象はExcel2007に特有の現象でもなんでもないはずだ。
お前さんが検証もせずそう思い込んでいるだけにすぎない。
全く同じ条件であれば、2003以前のエクセルでも全く同じことが起こるはずだよ。
736:デフォルトの名無しさん
08/11/03 11:43:21
>>735
確かに、Excel2000と2007で同じブックを動作した検証で違いが出た
だけですが...
737:デフォルトの名無しさん
08/11/03 14:48:40
API
738:デフォルトの名無しさん
08/11/03 20:06:15
もしかして、.saved や displayalerts の値はいじらずに、
組み込みダイアログをそのまま使ってるのかな?>>733
組み込みダイアログ出た後の動作が 2007 とその他で異なる可能性あるし、
ユーザに選ばせるなら自前でやった方が確実かも
739:デフォルトの名無しさん
08/11/05 00:23:48
>665
たとえば、セル(4, 3)に '=A1+A2が記入してあり
その式をセル(5, 1)に書き込む場合
Cells(5, 1) = Mid$(Cells(4, 3), 1)
でどうでしょう?
740:デフォルトの名無しさん
08/11/05 01:33:08
いつの話だよ
741:デフォルトの名無しさん
08/11/05 10:16:29
? ActiveSheet.UsedRange.Rows.Count
これを実行後するとワークシート上のUndo(元に戻す)が無効になっていまいます。
これって、仕様ですか?
742:デフォルトの名無しさん
08/11/05 11:06:19
>>741
イミディエイトウィンドウでやるとVBA動かしたの時と同じでUndoできなくなる
?1+1とかでも同じ
でもウォッチ式として使えば問題ない
743:742
08/11/05 11:11:33
今試したらウォッチ式でもだめだった orz
744:741
08/11/05 15:12:16
セルの選択範囲が変更になったとき、最終行を調べたいのですが
? ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
だと、保護されたシートの時エラーになってしまう。
他にUndoを生かしたまま最終行を求める方法あります?
745:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/05 16:42:43
>>745
有難うございます。
? activesheet.cells(activesheet.cells.rows.count,1).end(xlup).row
で出来たのですが、列を特定しないと駄目なのですよね。
自分も気付いたのですが、
保護されているかどうかでUsedRangeとSpecialCellsを使い分けるという方法
もありますね。
747:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/06 02:13:25
>>747
set mySouce = の時は、データの入ってるワークシートが
アクティブになっててその書き方で行けるんだけど、
set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、
range("B21") がどこにあるのかわからんってさ
749:デフォルトの名無しさん
08/11/06 02:51:43
>>748
なるほど!!明快な説明ありがとうございます。
つまり、set mySouce2 = の前に、
データが格納されているシートをセレクトすればよかったのですね。
対処だけでなく原因が分かりためになりました!
750:デフォルトの名無しさん
08/11/06 10:11:14
>>749
そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、
最初にまとめて下準備しちゃえば効率がいいよね
selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい
751:デフォルトの名無しさん
08/11/06 18:01:30
ある値xをアクティブセルの持つ書式に変換した値を取得したいのですが
Dim rng as Range
Set rng = ActiveCell
rng.Value = x
この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。
もう少しましな方法を教えて頂けるとありがたいです。
752:デフォルトの名無しさん
08/11/06 18:14:58
>>751
Format(x, ActiveCell.NumberFormatLocal)
セルの書式によってはバグるかも試練がw
753:デフォルトの名無しさん
08/11/06 18:35:33
そうなんです
[G/標準]とかでエラーになる為、セル代入を考えたのですが...
754:デフォルトの名無しさん
08/11/06 18:50:58
「セルの書式に合わせた文字列に変換」でいいのね
? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal))
とかは?
755:デフォルトの名無しさん
08/11/06 19:12:31
TEXT関数か・・・ならば
worksheetfunction.text(x, activecell.numberformat)
これでどうかな?
756:デフォルトの名無しさん
08/11/06 19:20:37
>>755
書式に和暦や曜日が指定されてるとヘンになるよ
そういうの無視でいいならいいんだけど
757:デフォルトの名無しさん
08/11/06 19:35:05
しつこいようだけど、頼む。
セルについて指定無しの状態にするすることは可能ですか?
set rg = nothing とか試してみたけどだめだったorz
758:デフォルトの名無しさん
08/11/06 19:44:51
>>757
ほんとしつこいなぁ、、、って誰?w
というか、質問の意味がわからない
>>756
自己レス
曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる
759:デフォルトの名無しさん
08/11/06 19:50:15
>>757
以前やってみようとした事があったけど見つからなかった
本当に出来るのかどうかも不明
>>758
お前頭悪そうだな
760:デフォルトの名無しさん
08/11/06 19:56:56
>>759
質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ
761:デフォルトの名無しさん
08/11/06 20:01:11
質問スレで分かってて答えないのは只の無能だと思われてもしょうがない。
762:デフォルトの名無しさん
08/11/06 20:10:08
>>761
そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ
質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ
763:デフォルトの名無しさん
08/11/06 20:46:09
喧嘩は他所でスレ立ててやれよ
目障り
764:デフォルトの名無しさん
08/11/06 21:18:48
自己紹介乙
765:デフォルトの名無しさん
08/11/06 21:53:02
>>763
おまえは引っ込んでろ!
このカス。
766:デフォルトの名無しさん
08/11/07 04:10:27
俺も >>757 の質問がよくわからないし
つか、前に質問したなら名前欄にレス番とか入れてくれ
767:569
08/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:デフォルトの名無しさん
08/11/07 06:18:18
すんません。上のやつ>>569さんじゃないです・・・。名前に入っちゃいました。
769:デフォルトの名無しさん
08/11/07 08:44:46
>>767
>そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?
試した?
試してもいないのに質問しに来てない?
770:751
08/11/07 09:34:48
>>754
>>755
>>758
ありがとうございます.orz
754さんの方法でグーですね。
771:751
08/11/07 09:47:36
ついでにもう1つ教えてください。
xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別
するにはどうしたらよいのでしょうか?
? Application.WorksheetFunction.IsError(x)
だとエラーにならないのですが...
772:デフォルトの名無しさん
08/11/07 10:00:12
どういうエラーでそのxが何か分からないと答えられない
セル(Range)なのか数値や文字なのか
773:デフォルトの名無しさん
08/11/07 10:09:03
>>767
「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ
774:771
08/11/07 10:50:19
入力したテキストxでAutoFilterの設定・解除をしています。
(フィールドはアクティブセルの列)
この時、xの書式をアクティブセルの書式への変換は
>>751
さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に
Set rng = ActiveCell: rng.Value = x
if WorksheetFunction.Iserror(rng)
とすると、アクティブセルの保存が必要になってしまう為もう少しましな
方法を模索中なのです。
775:デフォルトの名無しさん
08/11/07 12:54:09
>>769
ちょっと試せない状態だったのでとりあえず聞きました。
>>773
ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。
お騒がせしました。
776:デフォルトの名無しさん
08/11/07 13:14:43
初歩的な質問なんですが、
intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。
二つ目の変数に別のアクティブセルを代入するとerror13が現れます。
どなたかご教授願えないでしょうか?
777:デフォルトの名無しさん
08/11/07 13:47:26
>>776
アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?
778:デフォルトの名無しさん
08/11/07 15:38:15
>>776
Error 13は「型が一致しません。」だから
単純にint型に文字列(スペース含む)を代入しようとしてるとか?
セルが空なら0が入るし
779:デフォルトの名無しさん
08/11/07 18:04:36
膨大な量じゃないならコード貼ってどこでエラーがでたか書いてくれよ
780:デフォルトの名無しさん
08/11/07 18:10:46
>>774
x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ?
いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな