Excel VBA質問スレ Pa ..
[2ch|▼Menu]
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
d

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()で置き換えてお願いします.


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4847日前に更新/261 KB
担当:undef