Excel VBA質問スレ Pa ..
[2ch|▼Menu]
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()で置き換えてお願いします.

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列の数字は同じものが入っています。
A C列に数値が入ります。
B 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         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:デフォルトの名無しさん
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
お前頭悪そうだな


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

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