[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 08/01 06:58 / Filesize : 189 KB / Number-of Response : 699
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part15



1 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 01:07:19 ]
過去スレ
01 pc11.2ch.net/test/read.cgi/tech/1054356121/
02 pc11.2ch.net/test/read.cgi/tech/1168308855/
03 pc11.2ch.net/test/read.cgi/tech/1180192018/
04 pc11.2ch.net/test/read.cgi/tech/1189814602/
05 pc11.2ch.net/test/read.cgi/tech/1197448064/
06 pc11.2ch.net/test/read.cgi/tech/1205231499/
07 pc11.2ch.net/test/read.cgi/tech/1212587819/
08 pc11.2ch.net/test/read.cgi/tech/1219673793/
09 pc11.2ch.net/test/read.cgi/tech/1228372971/
10 pc12.2ch.net/test/read.cgi/tech/1235332603/
11 pc12.2ch.net/test/read.cgi/tech/1241885130/
12 pc12.2ch.net/test/read.cgi/tech/1247566074/
13 pc12.2ch.net/test/read.cgi/tech/1254281104/
14 pc12.2ch.net/test/read.cgi/tech/1262748898/ ←New!

関連スレ
Excel総合相談所 91
pc11.2ch.net/test/read.cgi/bsoft/1270542226/
Word総合相談所
pc11.2ch.net/test/read.cgi/bsoft/1263719084/
【質問不可】Excel総合相談所スレの雑談・議論スレ2
pc11.2ch.net/test/read.cgi/bsoft/1151651536/

482 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 23:35:58 ]
VBAの本でいい本ってある?
なんか、サンプル載せましたよ
みたいな本ばっかりで、このスレに書いてあるようなことが載ってる本
見たこと無いんだけど

例えば、>>481に書いてあるようなこととか、つい最近話題になった
文字列連結のことだとか、そういうことすら、書いてある本を
ほとんど見たことがない

483 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 23:41:14 ]
フェイタンと師団長だったら、別に師団長が強烈な発を持っていなくても
勝負はわからんよなw

484 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:11:27 ]
最近かってためになったのは
ExcelVBAスキルアップテクニック
Excelプロフェッショナルエンジニアテクニック
かな

485 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:26:31 ]
>>482
VBAはVB6と言語としては全く等価だから
VB6で探したほうがいいね。

486 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 05:20:36 ]
>>480-481
なるほど。Endで消えてしまうとは、知らなかった。
ありがとう。


487 名前:デフォルトの名無しさん mailto:sage [2010/05/29(土) 20:28:43 ]
これ出来ないのかな、と前から何度も思ってた事なのですが、

テキストボックスとテキストボックスなら、図形の矢印で結ぶことができて、
片方のテキストボックスを動かしたら、矢印の線も一緒に動くじゃないですか。

これを、
セルとテキストボックスでやることは出来ないのでしょうか?

つまり、テキストボックスから、矢印を延ばして、あるセルにくっつけます。
そして、どっちを動かしても、矢印で繋がったままにしたいのです。

488 名前:デフォルトの名無しさん mailto:sage [2010/05/30(日) 10:02:24 ]
ttp://www.youtube.com/watch?v=ZYuIQIComPo

489 名前:デフォルトの名無しさん [2010/05/30(日) 12:41:07 ]
質問です。。
ユーザーフォームのラベルでバック半透明で文字だけをくっきり表示させたいです。
どうすればよろしいでしょうか?

490 名前:デフォルトの名無しさん mailto:sage [2010/05/30(日) 22:55:02 ]
VBAでマウスカーソルをピクセルで指定してクリックさせるにはどうするのが良いのですか?
今はShellを使って別プログラムから呼び出してますが、処理が遅くなるので
もっとスマートなやり方があれば教えて下さい。



491 名前:デフォルトの名無しさん [2010/05/31(月) 05:10:33 ]
うんこ

492 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 08:39:22 ]
>>488
VBAで作るとすると
1.矢印の起点・終点(高さ)を取得
セルなら(i-1)までの.RowHeightの合計プラス(iの.RowHeight)/2
テキストなら位置プラス(高さ)/2
2.横位置を取得
同様に

3.左右のオブジェクト判定
セル、テキストボックスの右端位置を比較

4.1と2を元に矢印の位置設定


>>499
ラベルのプロパティ→項目別→表示
で好きなの選ぶ

493 名前:デフォルトの名無しさん [2010/06/01(火) 01:02:31 ]
>>489の質問は492で解決になっているのか??
表示の中に半透明の設定なくない?

494 名前:デフォルトの名無しさん [2010/06/01(火) 07:19:17 ]
EXCEL2003、XPsp2です。

EXCELのVBAだけを使って、インターネット(TCP/IP)通信をする
プログラムは作れるのでしょうか?
難易度は問いません。

よろしくお願いします。

495 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 08:21:24 ]
ぐぐったらフォームの半透明化が見つかった
窓側のコントロールのカスタム描画を使うAPIだな

半透明ってのがイメージ湧かないが

496 名前:487 mailto:sage [2010/06/01(火) 12:52:30 ]
ありがとうございました

497 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 17:06:19 ]
Docmd.RunSQLってマルチプルINSERT対応していますか?
DBはMySQLです。

498 名前:497 mailto:sage [2010/06/01(火) 17:19:55 ]
あ、ここAccessじゃなくてExcelでした。
すみません。


499 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 22:20:26 ]
Formulaで数式埋め込もうとすると短い式なら問題ないんだが、
複雑な(長い)式になるとTRUEを返される。
何だこれ?

500 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 22:24:10 ]
もっと色んなパターン試せばどうだろう
別の長い式作って




501 名前:デフォルトの名無しさん [2010/06/01(火) 22:46:14 ]
EasyCommっていうフリーウェアをインポートして
装置からデータをRS-232C経由で取り込むプログラムを書いたんですが、
プログラム動作中はストップキーも聞かず、入力を受け付けてくれない
ようです。これってそういう仕様とあきらめるしかないのでしょうか。


502 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 22:51:58 ]
DoEventsじゃなくて?

503 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 07:37:52 ]
真偽返すのはどっか引数が抜けてるんじゃね

504 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 11:32:10 ]
>501

んなこたぁない。

505 名前:デフォルトの名無しさん [2010/06/02(水) 20:39:09 ]
エクセル2000では動く、エクセル2007では
動かないマクロがあるんだけど。
考えられる原因ってどんなのがあるの?

506 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 21:40:52 ]
大抵は、変更とか削除された機能を使っていたとかじゃないか?
2007で旧時代の機能は大分整理されたみたいだからな。

507 名前:499 mailto:sage [2010/06/02(水) 21:57:24 ]
解決した。

結局TRUEが返される理由はわからんが、
思い通りの結果が出たのでまぁ良しとする。

508 名前:デフォルトの名無しさん [2010/06/02(水) 22:08:20 ]
>>506
そうなん?ってことは2007で動くように
作りなおさなきゃってこと?
そのまま使える方法ってないのかなぁ?

509 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:30:03 ]
ない
2003と2007はまったく別のソフトだと思った方がいい

何も全部作り直さなくても、たいていのマクロは少し修正するだけで使えるようになるはず

510 名前:デフォルトの名無しさん [2010/06/03(木) 19:45:17 ]
両方で動くようにはできないってこと?



511 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 20:22:43 ]
それは内容による
速度やExcelそのものの制限に関係なく、
両方で結果が同じになる関数ばかり使ってればいい

512 名前:デフォルトの名無しさん [2010/06/04(金) 06:30:29 ]
両方で結果が違う関数なんてあるんだぁ
たとえばどんな関数?

513 名前:デフォルトの名無しさん mailto:sage [2010/06/04(金) 08:14:47 ]
version

514 名前:デフォルトの名無しさん mailto:sage [2010/06/04(金) 11:34:28 ]
おおっと

515 名前:デフォルトの名無しさん mailto:sage [2010/06/04(金) 12:06:55 ]
Versionはプロパティ

516 名前:デフォルトの名無しさん mailto:sage [2010/06/04(金) 23:56:59 ]
WorksheetFunction

517 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 00:07:43 ]
エクセルver2002を使っています。
印刷設定について教えていただきたいのですが、

一枚77行で縦に任意の枚数(2枚なら77*2行)にあわせて行を77行ごと追加する
マクロがあるのですが、この作成された任意の枚数の表の印刷範囲についてなのですが、、、

表作成後に表全体を選択して印刷範囲設定しているのですが

With ActiveSheet
.PageSetup.PrintArea = Range(."表全体").Address
End With
※縮尺73%、A3、品質300dpi
プリンターの種類、印刷品質、余白の設定で印刷行数が77からずれることがあります。

【質問】
1.マクロで、縮尺はきにしないで常に77行目に印刷境界線をもってくることはできますでしょうか?
2.また、縮尺50%にしても77行ごとに印刷境界線をもってくることはできますでしょうか?

よろしくお願いいたします。

518 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 03:54:52 ]
ipadでExcelVBA動くようにならんかね

519 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 04:01:07 ]
>>517
77行毎に一旦別のシートにコピーして
印刷
その後そのシートは削除するとか

520 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 07:11:07 ]
>>518
つ Citrix Receiver for iPad



521 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 20:49:36 ]
>>517
印刷境界線ってのは何をさしてるんだ?

印刷範囲を77行までにするなら
ActiveSheet.PageSetup.PrintArea = "$1:$77"

78行の前に改ページ入れたいなら
Rows("78:78").Select
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell

とりあえずマクロの記録でこうなった


522 名前:517 mailto:sage [2010/06/06(日) 14:03:42 ]
>>517です。
分かりにくい説明ですみません。

縦に1〜77と数字を入れたとして、次ページでまた1〜77といれる。

【縮尺100%】
1
2
3


76
77
--------改ページのライン
1
2
3


76
77
-------改ページのライン

523 名前:517 mailto:sage [2010/06/06(日) 14:05:33 ]
【縮尺90%】
1
2
3


76
77
1
2
--------改ページのライン
3


76
77
1
2
3
4
--------改ページのライン

縮尺が100→90%になったときに改ページラインがずれてしまいます。(列側のラインも同様にずれます)
また印刷の余白を変更したり、解像度を変更したりしてもずれます。
複数シートに同じような表があり、マクロで一括で体裁を整えたいのですが、

上記のようなとき、手動で改ページラインを77と1の間にもっていけば
自動的に100%になり綺麗に印刷することができます。
この時手動であれば90%のままで77行ごとにもできます。
これをマクロで印刷範囲を77行ごとにしたいのです。
※縮尺は問いません。(縮尺指定できるのであればやり方だけでも教えていただけたらと思いますが・・・)

524 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 14:52:35 ]
だから、77行目ごとに改ページ入れたいんだろ
>>521の後半でわからない?まったくの初心者か?
その77行ごとにデータ入れるマクロで、改ページも入れるようにすればいいだけなんだが

わからんようなら、A列から1を探してその手前に改ページ入れるマクロ書いといてやる
    Dim row
    ActiveSheet.ResetAllPageBreaks
    row = 1
    Do
        row = row + 1
        If Cells(row, 1).Value = 1 Then
            ActiveWindow.SelectedSheets.HPageBreaks.Add (Cells(row, 1))
        End If
    Loop Until Cells(row, 1).Value = ""

2007で作ってるけど、たぶん2002でも動くと思う

暗黙の型変換気持ち悪いとかいう突っ込み禁止

525 名前:517 [2010/06/06(日) 17:26:45 ]
>>524さん
ご指摘ありがとうございます。
マクロはネットで調べながら覚えたもので、勉強不足ですみません。

そして、謎が解けました!
ActiveSheet.ResetAllPageBreaks
の時点で自動で縮尺が100%になるんですね。
この後に縮尺を90%にしてから
HPageBreaks.Add
で改ページをいれてあげたらうまくいきました。

ありがとうございました。

526 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 20:12:11 ]
下記のデータが仮にあったとします。
ユーザーフォーマットを使用してコンボボックスにユーザーID(A列)を
配置し、指定されたA列のB列、C列データを呼び出し変更を加えれるようにしたいのですが、
コンボボックスとテキストボックスをどのように紐つければよいのでしょうか?

A B C 
1 犬 雄 
2 猫 雄 
3 鳥 雌   



527 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 20:35:57 ]
更新後処理

528 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 21:23:42 ]
アドインを2つ作りました。

中のプログラムはモジュール名から何まで全く同じで、
途中で参照するファイル(テキスト)だけが異なります。

別の業務をしている人向けに、それぞれに作ったのですが、
兼業する人が両方のアドインを追加すると、うまく動きません。

具体的には、最初に動かした方のテキストをずっと読んでしまうようです。

どこを変えれば動くようになるでしょうか。

529 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 21:58:41 ]
空が青いなぁ。

530 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 22:01:43 ]
全部同じなら中の人も見分けつかないだろうな
処理なり使ってるシステムから切り替え出来ないの?



531 名前:デフォルトの名無しさん [2010/06/07(月) 21:22:06 ]
既にシート中にある、表の中身(文字列)を二次元配列として変数に代入して
他のシートのセルに場合わけして入れる場合、どのように書いたらよいのでしょうか?


532 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 21:46:32 ]
Hairetu = range( , )

ループ処理
Hairetu(i,n)の条件分岐でHairetuBにでも格納

sheets( ).rante(,) = HairetuB

533 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 22:08:28 ]
>>532さん、ありがとうございます。
最初の変数の代入は、どのように記述すればよいのですか?
二次元配列を宣言してx(i,n)でstring型で宣言したのですが、
データ数が多いのでfor文で回して代入したいのです。、
range("A1")を代入するとしたら、for文はどうなるのですかね??

For i = 1 To 18000
For j = 1 To 18
x(i,j) = Range(i, j)
Next j
Next i
こうじゃないですよね。。

534 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 22:14:31 ]
Hairetu = range("A1:Z99")

535 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 22:47:54 ]
ありがとうございます。
すみません、最後の別シートの格納の仕方についてなのですが…
例えば、x(2,3)の内容をRange("C2")に入れるなど、所定の場所に格納
する際に、for文で回して入れる方法はあるのでしょうか?

536 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 23:12:48 ]
>>533
ワークシートの内容を配列に入れるには、配列を二次元のVariant型にしておけば、セルがいくつあっても一気に代入できる。
Forを使うより何倍も速いしプログラムも簡単。
String型にしてしまうとFor〜Nextを使うような遅い方法しか使えなくなる。

537 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 23:14:50 ]
>>535
そりゃ
Range("C2") = x(2, 3)
だろう。
ほかのデータはどこに入れるの?規則的に並んでなければForを使うのは面倒だよ。

538 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 18:05:08 ]
別の配列に入れ替えればいいだろに

539 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 23:49:19 ]
質問なのですが、
セル範囲を一括で配列に格納した場合の添え字を
0からスタートさせることは出来ますか?

普通に格納するとx(1,1)から数値が入ってしまうところを
x(0,0)から数値が入るようにしたいのです。
今は別の配列に入れ替えてるのですが、ちょっと不便で・・・

よろしくお願いします。



540 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 23:59:25 ]
Excel2007

テキストボックスのScroolBarsプロパティをfmScrollBarBothに設定しているんですけど、
ホイールマウスの真ん中のホイール部分を回転させても有効になりません。

有効にする方法ってありますか?





541 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 02:26:41 ]
>>539
無理。
VBAでは、0オリジンに拘るよりも、1オリジンを素直に受け入れた方が何かと楽だよ。

542 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 04:03:16 ]
まだ勉強しだして一週間なんですが教えてください

AとBにそれぞれ1〜50の数字を代入し
AとBを掛け合わせた数を縦方向にペペペと貼り付けを繰り返したいんですが
1×2と2×1は答え同じなんで重複を無くすために
代入する数値を【A>B】と定義するのってどうしたらいいんですか
↓こんな感じでやってます
Dim A
Dim B
for A 1 to 50
for B 1 to 50
(右クリックコピーでペペペと貼り付けるマクロ省略)
Next B
Nezt A


543 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 04:56:01 ]
やりたいこと(出来上がりイメージ)がよくわからん上に
大事なとこが省略されてる気がする

とりあえずA>Bのときだけなんかの処理をしたいのなら

Dim A
Dim B
for A=1 to 50
for B=1 to 50
If A>B Then
(右クリックコピーでペペペと貼り付けるマクロ省略)
End If
Next B
Next A

こんな回答しかできません
出来上がりのイメージとかあればもうちょいマシな回答できるかも

544 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 05:03:23 ]
>>542
とりあえず質問そのままの解答だと
If A > B Then ぺぺぺ
だけど、条件がA>Bだけだと6*1と3*2が同じ答えで重複するし
50*50は1回しか出てこないのに条件から外れちゃうよ?

いちいち調べなくても必ずA>Bになってるプログラム
For B = 1 To 49
For A = B + 1 To 50
ぺぺぺ
Next A
Next B

それから右クリックコピーってなんだ?
セルに数値を入れるだけなら右クリックも貼り付けも必要ないんだが。

545 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 09:39:29 ]
Dim A&, B&, rowCnt&, colCnt&
rowCnt = WorksheetFunction.Max(A,B)
colCnt = WorksheetFunction.Min(A,B)

もしくは
If A < B Then
 Dim swap&
 swap = A
 A = B
 B = A
End If

ってやりたいだけか?

546 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 16:12:47 ]
Sub Hoge(inRange as Range, outRange as Range)
上記のようなインターフェースのサブルーチンがあるとします
inRangeのデータに何らかの演算をしてoutRangeにコピーします
このサブルーチンをワークシートの上のほうにある関数入力部分に
=Hoge(A1:B2, C1:D2)
のように入力したのですがうまく動いてくれません
引数付きのサブルーチンをワークシート上で手動呼び出しするにはどうすればいいんでしょうか?

547 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 17:02:14 ]
インターフェースのサブルーチン だぜ

548 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 18:59:39 ]
シート1からシート7までのb242:u242のセルをコピーして
シート11のb2からb8まで順番に貼り付けるにはどうすればよろしいのでしょうか?

549 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 19:00:27 ]
シート上に CommandButton を 2 つ配置し、
それぞれ CommandButton1, CommandButton2 とします。

CommandButton1 をダブルクリックして、次のコードを書きました。

 Private Sub CommandButton1_Click()

  CommandButton1.Enabled = False
  CommandButton2.Enabled = False

  MsgBox "now processing..."

  CommandButton1.Enabled = True
  CommandButton2.Enabled = True
 
 End Sub

ここで CommandButton1 をクリックしてダイアログボックスが出ているとき、
CommandButton2 の文字が黒のままで False になっていないように見える
のは、なぜですか?

MsgBox の行にブレークポイントを仕掛けて CommandButton1 をクリック
したときは、きちんと CommandButton2 の文字も灰色になります。

(WinXPSP3/Excel 2003)

550 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 20:25:57 ]
>>546
SubをPublic Functionにしろ。
あとワークシートにVBA記述すんな。モジュールに書け。
関数の入力のダイアログでユーザ定義関数の一覧部分に
自分の定義したFunctionが出てるか確認しろ。

以上。



551 名前:デフォルトの名無しさん [2010/06/10(木) 07:04:06 ]
RS485を入出力したいのですが、RS232Cとかでよく使われるMScommを利用しようと思っています。
ところが、「ActiveXはオブジェクトを作成できません。」とエラーが出てしまいます。
RS232Cの入出力でも同様に出てしまいました。
VB6.0ランタイムはインストール済です。参照設定もしています。

どうしてでしょうか?解決策は?

552 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 07:26:00 ]
>>551
oshiete.goo.ne.jp/qa/5065179.html

553 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 14:36:54 ]
ワークブックXには、2つのワークシート(以下WS)があります。
・ワークシートA(以下WSA)は日次報告の原紙が作成済み
・ワークシートB(以下WSB)の列Cには日次報告の対象となる日付(MMDD形式)が入力済み

上記の2つのシートを使い、
1.「WSA」を「WSB:C列に入っている日付の個数分作成」し、
2.1.で作成されたWSのシート名を「WSBの日次報告の対象となる日付」に変更
するというマクロはどのように組めばよいのでしょうか?

554 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 15:14:06 ]
>>553
実際に操作してマクロの記録しろよ

555 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 17:21:40 ]
>>553
    Dim r
    r = 1
    Do Until Sheets(2).Cells(r, 3) = ""
        Sheets(1).Copy After:=Sheets(2)
        Sheets(3).Name = Sheets(2).Cells(r, 3).Text
        r = r + 1
    Loop

シートの1枚目が原紙、2枚目が日付の入ったシートって前提な

556 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 20:11:03 ]
C++とかでDLLを作ってそのDLLの関数からRangeを操作したりって出来ますか?

557 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 20:54:18 ]
IDispatch::Invokeとか直接呼ぶ羽目になりそうな気もするけど、
一応可能じゃないかと。

558 名前:553 mailto:sage [2010/06/10(木) 23:26:31 ]
>>552
すみません…
駆け出しなもので、余計なコードが入ってしまうと理解に時間がかかるため
エディターで編集しています



>>555
ありがとうございます!
少し参照するシートや列を変更してみたら、自分の環境でも動くようになりました
ちなみに、こんな感じです↓

Sub ワークシートコピー()
Dim r
r = 1
Do Until Worksheets("日付データ").Cells(r, 9) = ""
Worksheets("原紙").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Worksheets("日付データ").Cells(r, 9).Text
r = r + 1
Loop
Application.DisplayAlerts = False
Worksheets("原紙").Delete
Dim p As String
p = Worksheets("日付データ").Range("A6").Text
Dim n As String
n = Worksheets("日付データ").Range("A7").Text
ActiveWorkbook.SaveAs Filename:=p & "\" & n & ".xls"
Application.Quit
End Sub

559 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 01:40:47 ]
>>542
書いてみた

Sub main()

Dim C As Range
Dim strC(2500, 0) As String

For Each C In Range("A1:AX50")
strC(C.Row * C.Column, 0) = C.Row * C.Column
Next C

With Range("A1:A2501")
.Value = strC
.RemoveDuplicates Columns:=1
End With

Rows(1).Delete

End Sub


560 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 07:44:47 ]
書き直した

Sub main()
Dim C As Range
For Each C In Range("A1:AX50")
Cells(C.Row * C.Column, 1) = C.Row * C.Column
Next C
Range("A1:A2500").RemoveDuplicates Columns:=1
End Sub




561 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 07:57:31 ]
バグがあった・・・Orz

Sub main()
Dim C As Range
For Each C In Range("A1:AX50")
Cells(C.Row * C.Column, 1) = C.Row * C.Column
Next C
Range("A1:A2500").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub


562 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 09:57:55 ]
Excelで勤怠表を作成する時、必ず問題になるのが、
深夜割増、早朝割増、深夜休憩、早朝休憩の計算方法だと思うんだけど、
これってVBA使わずに完全に解決してる例がみつからない。

ここまできっちりやるならVBAもしくはシステム化が普通なのかな?

タイムカードは基本的には休憩時間を考慮しないし、そのへんなかなか難しいね。

563 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 11:31:45 ]
>VBA使わずに完全に解決してる例がみつからない。

君の能力の問題じゃね?

564 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 12:14:02 ]
> 君の能力の問題じゃね?

俺のググる能力が足りなかったのか!!

565 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 13:07:52 ]
>>562
そういうの作った人が、やめちゃってわかんないから、バグとってくれって頼まれたことがある
まあ、ものすごく長い式が詰め込まれとったわ
VBA使わずにできなくは無いのは確かだけど
VBA使えるならそのほうが圧倒的に楽


566 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 13:25:52 ]
>>565
読む方からしても、関数よりVBAの方がわかりやすいってことあるよね。
うちにもExcel2003の列数の制限いっぱいまで式が詰め込んであるワークシートが
複数枚、さらに記録機能で作っただけのマクロも大量の悲惨なやつがあるんだが、
とてもじゃないが解析する気にならない。当然作った人は辞めてる。
しかも経理用のだからよくわからん。

ただ、VBAとかマクロを使わずにワークシート関数のみを駆使したシートを
作ると自己満足度が高いので、気持ち的にはわかることはわかる。

567 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 15:24:34 ]
どんな就業規則なのかしらんけど、区切り時間とか計算式が変わる境界値を設定して、
一列に一個**時間を計算して、そのsum()なんかを設定値と比較して条件式なんかを
設定した方が、VBAでごちゃごちゃやるよりシンプルだと思うのは俺だけか。

568 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 15:29:44 ]
おまえだけ(´ω`)

569 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 15:55:02 ]
>>567
まあ、そう思うなら

区切り時間15分、夜間割り増し、深夜割り増し、早朝割り増し、休日割り増し、休憩(外出)時間分減算


こんくらいでいいから、どんだけすっきり書けるか、挑戦してみw
(余力があるなら、さらに休日の夜間深夜早朝とかも入れてね)

入力はタイムカードの時間記録4個ね(出社、退社、時間内出、入)



570 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 16:15:40 ]
>>567
平日の深夜早朝の手当は就業規則関係ないだろ。

>>569
休日の深夜早朝は法律には無いと思うので、
そういう就業規則があるところは羨ましいな。

やってみるとめんどくさいのがまともな勤怠表。



571 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 17:40:30 ]
Excelの自動計算機能を使ってもめんどくさいのに、VBAだと簡単にできると主張する不思議

572 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 17:43:26 ]
「完全に解決してる例」が見つからないのは、その手の奴は会社ごとに異なるから
汎用性のあるものを作るのはむずかしいし、自分の会社用の奴をごりごり作ったとしても
公開しないからじゃないの?

573 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 17:47:52 ]
>>562
逆にVBAじゃないと完全に解決できないと思う理由は何なの?

574 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 18:29:45 ]
そりゃVBAはなくてもできるだろうけど使った方がずっと簡単
俺なら迷わずVBAを使う

575 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 19:56:22 ]
>>571

エクセルの式は基本的に1行にまとめないといけないから複雑なことをするには向いてない
無理にやろうとすると大変な思いをする
大量の計算を1行に詰め込むのはプログラミング的にはクソの代表だしさw


VBAならそんな制約は無いし元々そういうややこしいことをするための物だから楽にできる
使える人にとってはね


使えない人がこれから覚えてでも楽かと問われれば微妙w
使えるようになるまでが大変だから(その人のセンスしだいってとこもあるけど)



576 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 20:31:13 ]
ワークシート関数では手間のかかることってのが

計算の途中経過を保存したり再利用すること
場合分けすること

だから、これらの処理が必要ならVBAを使った方がいい
計算式が独立してて一つ結果が出たらそれで終わりって場合はワークシート関数でやる

577 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 20:32:34 ]
ワークシート関数を激しく多重ネストして可読性を下げるくらいなら、
ユーザー定義関数をワークシートに張った方がずっと良いと思う。

マクロ有効にしたくない?知らんがな。

578 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 01:40:11 ]
>>573
それを俺に聞かれても困るがな。


579 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 01:44:46 ]
俺は勤務表のカレンダーをExcel関数で作ってきたけど、カレンダー作成マクロでも組んだ方が楽だよな。
Excel関数だと無駄な同じ式を30日分入れとかにゃならんし、休日判定なんかもめんどくさい。

580 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 02:49:29 ]
VBAでカレンダーを作る一番簡単な方法
ネットにアクセスしてYahooカレンダーからデータを抜き出す
祝日法が改正されてもYahooが潰れない限り全自動で対応できる



581 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 03:14:36 ]
休日は算出できんものな。
法律が出来ても変わるし、天ちゃんが死んでも変わる。

582 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 03:51:21 ]
VBAってなんて文書性の高い言語なんだといまさらながら感動
ワークシートコピー() とは
rは変数だよん
r に1を設定
ワークシート("日付データ")のセル(r,9)が""でない限り
ワークシート("原資")をワークシートコレクションの現在の個数番目の
ワークシートの後に複写,
現在のシートの名前をワークシート("日付データ")のセル(r,9)に書かれている
文字列に設定,
rにr+1を設定
以上繰り返し

エクセルの警告表示をオフに
ワークシート("原紙")を削除
pは文字列変数だよん
pにワークシート("日付データ")の範囲("A6:A6")の文字列を設定
nは文字列変数だよん
nにワークシート("日付データ")の範囲("A7:A7")の文字列を設定
現在のブックをp&"¥"&n&".xls"という名前で保存
エクセルを終了
わかった?

583 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 06:20:35 ]
エスパーに質問。
ほとんどのPCで1分程度で終わるマクロが、あるPCだけエラーは吐かないものの数時間待ってても返ってきません。
デバッグモードに入りどこで止まっているかを見ても無限ループに入っているわけではなさそうです。
PCのスペックは同等、エクセルとVBのバージョンも一緒です。
考えられる原因はなんでしょうか?



584 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 08:14:52 ]
>>580
WebAPIは基本ですよね。

585 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 08:19:08 ]
>>583
on error resume next でエラーループさせてるとか。
レジストリ書き換えが上手く行って無いとか。
iniの読み込みがいつまでもtrueにならないとか。

エラー吐かない、と書いてるならば on error resume next は入れて無いよね?
デバッグで止まっているなら、そこが問題なんじゃないか?
do loop 使ってる?

いかんせん情報が少なすぎる。

586 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 09:15:00 ]
Debug.Printまみれにしてやれ。

587 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 09:51:46 ]
当然ウイルス対策ソフト切って試してるんだろうな

588 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 10:09:55 ]
yahooのカレンダー取得せんでもアクセスカレンダーって使えなかったっけ
あれは祝日がないのか?

589 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 13:40:59 ]
>>584
Windowsのバージョンが変わった場合とか、そもそもMacが共通だとか、
環境によってはライブラリが無いとか、そういう制限て無いの?

590 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 13:42:58 ]
>>588
もう祝日は数年分の祝日リストをワークシートに書いといてそれを見るようにすればいいんじゃね?
配布が簡単なところがExcel開発の良いところだし。



591 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 15:39:04 ]
>>585
もうすこし詳細調べてみます
>>586
おk

592 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 17:32:51 ]
祝日法はアルゴリズムそのものだからなあ
多分フリーで最新の祝日反映されたカレンダー一覧がごろごろ堕ちてるだろ

593 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 18:17:50 ]
>>589
ほとんどがXML(or SGML)ファイルなので大丈夫と思うよ。
欠点はスキーマが統一化されてない事かな。

594 名前:デフォルトの名無しさん [2010/06/13(日) 11:10:35 ]
事務職レベルなのですごく初歩的な質問します。

EXCELでもACCESSでもいいんですがVBAを書くとき、
ネットとか既存のシステム?からVBAを借用してきて、自分用に編集することってあります?
それとも、全部一から書きますか?

595 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 11:59:23 ]
>>594
ネットにあるサンプルを利用するのは凄く勉強になるけど、
必ず自分で手打ちする事が大切かな。

面倒かもしれないけど、コードを印刷して自分で手打ちするのと、
ただコピペして終わりにするのでは、大きな差があると思う。

自分の物にしたいなら、コード手打ちが良いよ。
もちろん1から組めるに越した事はないけどね。


596 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 12:02:29 ]
ライブラリならともかくコピーして編集って怖くね?
なんかものすごいバグが紛れ込みそうで不安

597 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 12:06:22 ]
>>596
VBAのライブラリ結局生ソースだろw


598 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 12:09:38 ]
メソッドの用法を調べて、後は自分で組めるレベルまで頑張るしかない。


599 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 12:11:40 ]
>>597
ライブラリとしてまとまってるクラスや関数を使うのと
実装をいじるのでは全然違うでしょ

600 名前:デフォルトの名無しさん [2010/06/13(日) 12:20:17 ]
自分で作ったものだったら何をやってるか判ってるからそのまま流用っつーのはよくある。

ネットで拾った物は自分で、その部分のみをテストして納得したら
編集し直して使うのはある。
(変数名を自分がわかり易い名前にするとか




601 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 12:24:10 ]
プログラム書く癖ってあるじゃん。
定数化のルールとか、インデントの入れ方とか。
range("A1") で書く人もいれば、cells(1,1) で書く人もいる訳で。

そう考えると、やっぱり自分で書きなおした方が良いな。

602 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 12:37:19 ]
>>599
たいしてかわらん
そのまま使えるものをコピペしてくるなら
ライブラリだろうが、実装だろうが変わりないじゃん

アレンジがひつようなら、やっぱりかわらんじゃん

603 名前:デフォルトの名無しさん [2010/06/13(日) 12:41:12 ]
レスありがとうございます。
今まで、会社で既存のものを流用したり、ネットから一部コピーや
本に書いてるのを打ち込んだりしてました。
知識不足のため、全部自分で考えてやると時間がかかり過ぎて・・・

でも、ちゃんと覚えていくしかないですね。

604 名前:デフォルトの名無しさん [2010/06/13(日) 12:42:46 ]
あ、
>>603は594です。

605 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 12:45:25 ]
>>602
そのまま使えて、副作用もないコードならコピペでもいいかもね
でもまずは副作用がないことを確認して、アレンジするなら新しい副作用が出ないように書かないといけない
規模が小さければどうって事ないが、普通これは結構な手間になり、見逃せばバグにもなる
ライブラリはそういうことも実装する側が考えている(というか考えるべき)からその手間もリスクも少ない

606 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 21:43:36 ]
特殊なアドインを自動操作する方法を検討してます。
手動でやるときは、メニューバーから選択して、一連のキー入力をするだけなんですが、
vbaでこのような処理を自動化するにはどうすればよいでしょうか?

もちろん、本来はアドインのインタフェースを調べてそれを呼ぶべきなんでしょうが、
仕様がまったく不明なので、手動処理をなぞれないかと思っています。

607 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 22:10:43 ]
addinで定義されてるルーチンなり関数なりを呼び出せば良いだけでは?

608 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 13:35:56 ]
>>606
VBAじゃなくて、なんかの自動化ソフトを使ったら?

609 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 14:31:38 ]
なんで「調べてます」って書かないで「検討してます」とか書くんだろう

610 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 14:47:14 ]
>>606
決まった順番でキーを押すだけならSendKeysという命令があるけど
副作用も多いので使えるかどうかはよく検討する必要がある。



611 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 16:20:40 ]
アドイン自体を操作するのに使える?

612 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 16:46:00 ]
参照はAddFromFile
アドインもなんかなかったっけ

613 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 16:53:05 ]
あ、いやそういう意味じゃなくって、メニュー操作してアドインに制御がわたった後でも、
そのアドイン自体の操作をSendKeysでできるのかなってこと

614 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 17:03:08 ]
そのアドインが階層メニュー使ったり、ダイアログ表示したりする奴だったら、多分SnedKeysじゃ信頼性なくて
駄目だと思う。

615 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 18:09:29 ]
今このVBAをそのまま流用して改造してるんですが、
www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html

選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したいのですが、うまくいきません。

いじったのは以下のところだけですが、ファイルがある場所のみしか抽出されないのと、フルパスをうまく吐いてくれません。
(ファイルのあったディレクトリィだけ出る)

どこがまずいでしょうか。

' 現在フォルダをシート上に表示
g_cntPATH = g_cntPATH + 1 ' 参照フォルダ数を加算

FilePaths = "wwww.test.com" & FilePaths & "/" & objPATH.Name & "/"
' ■先ずサブフォルダを探索するループ処理
For Each objPATH2 In objPATH.SubFolders
' フォルダ単位のサブ処理(再帰呼び出し)
Call SEARCH_SUB_FOLDER(objPATH2, GYO, COL)
Next objPATH2
' ■本フォルダの各ファイルをシート上に表示するループ処理
COL = COL + 1 ' カラムを加算
For Each objFILE In objPATH.Files
g_cntFILE = g_cntFILE + 1 ' 参照ファイル数
GYO = GYO + 1 ' 行を加算
With objFILE
' ファイル名+(最終更新日時+ファイルサイズ)
Cells(GYO, COL).Font.ColorIndex = 1
Cells(GYO, COL).Value = FilePaths & .Name
If 25000 <= .Size Then
Cells(GYO, COL).Font.ColorIndex = 3
End If

616 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 10:05:49 ]
壊滅的に説明が下手なので、コード読む気にすらならない

617 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 11:18:58 ]
説明は普通に読めるぞ
ほるだのなかに
インデックス.html
ページ1.HTML
とかを見つけたら、
www.ほにゃらら/インデックス.HTML
って合成したいんだろう

コードは見てない

618 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 12:22:10 ]
>>615
本当にそこしかいじってないんなら、変数FilePathsが宣言も初期化もされていないから
フルパスが出るわけない

619 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 14:50:43 ]
> 選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したい
「抽出」の意味が不明。(コード見ればわかるかもしれんが)

> ファイルがある場所のみしか抽出されない
「ファイルがある場所」以外は、一体どこの何を抽出したいのか?
「選んだ階層以下すべてのファイル」が対象ではないのか。

620 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 14:57:39 ]
>>618
宣言はしてあります。
ただ、全部コピペすると書き込めなかったので・・・。

>>619
そうです。その通りです。
選んだフォルダの階層以下すべてのファイルのフルパスを、
エクセル上に書き出したいんです。
今のままだと、ファイルのあるフォルダしか書き出されない上に、
そのファイルのあるフォルダよりもっと上の階層がなぜか消えてしまってるんです。



621 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 16:04:38 ]
>>620
byval と byref を間違えてるに一票


622 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 16:06:27 ]
>>615
リンク踏んだけど、そもそもそのページが読む気失せる作りだわ

623 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:23:07 ]
>>615
暇だったのでやてみた

FilePaths をグローバルに宣言して

全体処理のほうにこれを書いて
FilePaths = "wwww.test.com/"

再帰のほうのこれを修正
FilePaths = "wwww.test.com" & FilePaths & "/" & objPATH.Name & "/"

FilePaths = FilePaths & objPATH.Name & "/"

で、カラム位置は別として、希望の文字列が得られてると思うが?
だめなら、元のソースが壊れてると思われ、コピペからヤリナオスベシ

624 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:26:37 ]
>>622
ページの作りはどうでも、書いてるコードの内容が全体的にヘタクソ杉。
よくあんなの公開できるもんだと感心する。

625 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:29:22 ]
参照を受け取るときにC++でいうconstみたいな指定子ってある?

626 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:35:14 ]
>>623
>>623
おっと、バグッテた

再帰のプロシージャの中で
dim tmp しといて

FilePaths = FilePaths & objPATH.Name & "/"
 ↓
tmp = FilePaths
FilePaths = FilePaths & objPATH.Name & "/"

出口で
FilePaths=tmp

これでいけるわ

627 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:36:08 ]
>>624
悪口しかいえないやつより100万倍まし

628 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:45:15 ]
>>625
c++を知らないvb使いとしては、参照を受け取るときのconstの意味がわからん
どういう動作なのか説明してくれたら、VBではこうだと言えるカモ


629 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:53:47 ]
>>628
例えば配列やクラスをディープコピーして渡すのはコストがかかるので参照で渡す
けど参照で渡したときに間違って書き込みをしたくない場合につけるセーフティみたいなもんです
ようするに読み取りだけできて書き込みはできない引数のことです

630 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:58:39 ]
>>626
あ〜そだ、グローバルで宣言したFailePathsを引きずり回してダサダサなので
ソースをかっこよくしたいなら、引数のほうに入れたほうがいいね
自分でやってね





631 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:59:00 ]
>>629
VBAにはそういう機能はない

632 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 18:02:08 ]
>>631
しょぼん・・・どうもでした

633 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 15:48:05 ]
>>626
ありがとうございました!
グローバル変数の存在を思いっきり忘れてました・・・。

634 名前:デフォルトの名無しさん [2010/06/18(金) 00:58:58 ]
初心者で申し訳ありません

今A1からD10まで数字が埋まった表があります
このうちB1〜B10を選択し、コピー、F1〜F10に貼り付けするとします
このB1〜B10を選択するときに、直接"B1:B10""指定でなく、「表上の左から2列目、一番上から一番下までの範囲を選択」、
としたいのですが、どのように書けばよろしいのでしょうか?
表はいくつかあり、それぞれ縦のデータ数が10だったり15だったりまちまちなため、セル指定だと対応できないので困っています・・・


635 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 01:31:16 ]
>>634
「表上の左から2列目、一番上から一番下までの範囲を選択」
だと

途中に空白セルがないなら
Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Select
とかする

個人的には好きではないけど
途中に空白セルがあった場合なんかは
Range(Cells(1, 2), Cells(65536, 2).End(xlUp)).Select
の方がいいかも

636 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 01:45:50 ]
>>634
B1からデータの入っているセル範囲を自動的に求めてコピー
Intersect(Range("B1").CurrentRegion, Range("B:B")).Copy

637 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 02:55:16 ]
もっと単純に、
Columns("B:B").Select とか
Columns(2).Select とかで良いんじゃ?

んで
Selection.Copy でコピーして
Columns("F:F").Select でF列選択
ActiveSheet.Paste ではりつけ

つかまずはマクロの記録

638 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 15:23:29 ]
>>636
こんなやり方初めて知った。
でも、空白セルがあるとそこで途切れてしまうから、結局>>635のほうがいいのかな。
65536って入力するより、rows.countのほうがいいだろうけど。


639 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 16:22:57 ]
B列全体をコピーしてもいいのかどうか。空白セルをコピーすると何かまずいことがあるのか。
途中に空白が入ってデータが飛び飛びになることはあるのか。

このあたりが条件として欲しいところだな。
それによって手間や方法が変わってくる。

640 名前:634 [2010/06/18(金) 20:50:20 ]
みなさんさまざまなアイディア、ありがとうございました

以下のように組むことで、一応目的達成することができました
ActiveCell.CurrentRegion.Select
Selection.Offset(0, 0).Columns(2).Copy
ActiveCell.Offset(0, 5).Select
ActiveSheet.Paste



641 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:11:18 ]
>>640
それでいいんなら1行にまとまるよ

ActiveCell.CurrentRegion.Columns(2).Copy Destination:=ActiveCell.Offset(0, 5)

642 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:12:41 ]
>>634
セレクトしてる意味がない

これで充分
Columns(2).Copy
Columns(2).Offset(0, 5).PasteSpecial


643 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 23:28:29 ]
zip 内のファイル一覧を取得したいのですが、
サンプルが見つからなくて何とか以下のようなものはできました。
どこか問題はないでしょうか?とくに item.GetFolder が正規のメソッドとして
存在するのかが気になっています。
また、Folder3、FolderItem2のリファレンスはありますでしょうか?

Option Explicit
Dim m_fso
Dim m_shell
Sub main()
  Set m_fso = CreateObject("Scripting.FileSystemObject")
  Set m_shell = CreateObject("Shell.Application")
  ZipList "c:\test.zip"
End Sub
Function ZipList(FileName As String)
  Dim folder
  Set folder = m_shell.Namespace("c:\test.zip")
  ZipListSub folder
End Function
Function ZipListSub(folder As Variant, Optional path As String = "")
  Dim item
  For Each item In folder.Items
    If item.IsFolder Then
      ZipListSub item.GetFolder, item.path & "/"
    Else
      Debug.Print path & item
    End If
  Next
End Function


644 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 00:37:34 ]
>>643
とりあえず、Shell.Application絡みのドキュメントはここ。
msdn.microsoft.com/en-us/library/bb773938(v=VS.85).aspx
FolderItem2はShellFolderItemとしてエイリアスされている。
Folder3のヘルプは見つからないな。
更に詳細が知りたければ、参照設定で「Microsoft Shell Controls And Automation」を足すと、
大本のタイプライブラリの内容が確認できる。Folder3は一応ここに出てくる。
WindowsSDK等に付属している「OLE/COM Object Viewer」で
「Type Libraries」-「Microsoft Shell Controls And Automation (Ver 1.0)」を表示させれば、
FolderItem2のエイリアスとかまで確認できるな。

645 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 13:06:43 ]
>>643
それ以前に.ZIPがShellで処理される保障はないと思うがそれはいいのか?

つかエクセル関係ないからスレ違い
テンプレなくなってるんだな

646 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 16:48:15 ]
zipがshellで処理されないOSって何?

647 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 16:57:59 ]
2000とか98,98SEとか

648 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 18:29:27 ]
>> 647
Windows 3.1+Excel 5.0の考慮も必要だね!

649 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 20:57:02 ]
Windows8とか

650 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 21:38:02 ]
>>643
× Set folder = m_shell.Namespace("c:\test.zip")
○ Set folder = m_shell.Namespace(FileName)



651 名前:643 mailto:sage [2010/06/21(月) 23:37:34 ]
>644

ありがとうございます。
残念ながら英語版しかないようですね。

>645
zipfldr.dllが解除されている場合とかでしょうか?

>650
テストしたのをそのままあげてしまいました。
そこですが、fso.GetAbsolutePathName で取得したものを
渡さないと時々取得できないことがあるようです。
原因はさっぱりわかりません。



652 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 14:36:04 ]
>そこですが、fso.GetAbsolutePathName で取得したものを
>渡さないと時々取得できないことがあるようです。
>原因はさっぱりわかりません。
なぜだろうね

653 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 14:46:04 ]
AbsolutePathNameじゃないからだろ

654 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 17:02:02 ]
>>652
どっかいけ、アホ

655 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 22:46:43 ]
Stringで渡すとだめで、VariantならOKのようです。


656 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 23:17:45 ]
Set folder = m_shell.Namespace((FileName))

657 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 23:35:53 ]
それは意味ない

658 名前:デフォルトの名無しさん mailto:sage [2010/06/23(水) 19:22:11 ]
意味あったけど

659 名前:デフォルトの名無しさん [2010/06/24(木) 19:49:57 ]
初心者なんですが、皆さんの力を貸してください。
下記で困ってます。orz

【実現したいこと】
ワークシートにグラフを追加し
グラフのX軸の目盛位置(wkChart.Axes(xlCategory).Left)ピッタリに四角シェイプを配置したい。
配置先は、グラフ内ではなくワークシート上。

【多分必要だと思うこと】
グラフ内の座標から、ワークシートの座標に変換する必要がある?

【試したこと】
グラフ内の座標==ワークシート上の座標でシェイプを追加したにもかかわらず
見た目上ズレている。

【コード】
'チャート内に四角シェイプを追加して選択
wkChart.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select

'ワークシート上に四角シェイプを追加して選択
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select

660 名前:デフォルトの名無しさん mailto:sage [2010/06/25(金) 18:42:58 ]
APIで座標を調べるのがあったな。



661 名前:デフォルトの名無しさん mailto:sage [2010/06/25(金) 22:56:29 ]
>>659
グラフ内の座標ってChart自体の (0, 0) から始まるわけじゃなかったような気がするけど、ひょっとしてそのこと?

wkChart.Shapes.AddShape(msoShapeRectangle, 30-wkChart.ChartArea.Left, 100-wkChart.ChartAreaTop, 20, 30).Select
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select

662 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 23:30:08 ]
>>659
A1セルの大きさが基準になる。手順は以下。これで、(10,10)セルにグラフを移動とか出来る。
但し、全セルが同じ大きさであることが重要。
詳細は忘れたから調べてwww

@A1セルの大きさを変更 or 全セルの大きさを整える
AA1セルの縦横サイズを取得
B座標位置(左上位置になる)を指定する

663 名前:662 mailto:sage [2010/06/26(土) 23:33:24 ]
すまん。グラフの位置決めのことで、チャート内ではない。
まじすまそ

664 名前:デフォルトの名無しさん [2010/06/27(日) 01:30:22 ]
正規表現で置換するだけの処理なんですが上手くいきません
ご教授願います

Sub sample01()
Dim re As Object, n As Object
Dim Match As Object, Matches As Object

Dim Val As Variant '配列
Dim i As Integer 'カウンタ

Val = Worksheets("Sheet1").Range("A1:A5").Value

Set re = CreateObject("VBScript.RegExp")

For i = 1 To 5 Step 1
MsgBox "対象セルの文字列は" & "【" & Val(i, 1) & "】"

re.Pattern = "\d{1}" '検索する正規表現パターン
re.Global = True '検索範囲はグローバル
re.IgnoreCase = True '大文字・小文字を区別する
Set Matches = re.Execute(Val(i, 1))

'■HITしたらああああに置換↓ここが上手く動いてくれない■
Val(i, 1) = re.Replace(Val(i, 1), "ああああ" & i)

'Set re = Nothing
Next i

MsgBox i - 1 & "件マッチ!"
End Sub

665 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 02:03:45 ]
>>664
動いてますよ?

もしかして、ワークシートに書き込みたいのなら
Range("A1:A5") = Val
を最後に足しとけばOKかと

666 名前:664 [2010/06/27(日) 02:07:06 ]
>>664だけでは説明不足だったので付け加えます
ソースの置換処理内容だけ見るとわざわざVBAでやる必要ない感じですが
実際は複雑な正規表現処理を入れる予定です

上記ソースよりも簡単に指定したセルを正規表現で置換できる処理がありましたら、
合わせてご教授頂ければと思います

667 名前:デフォルトの名無しさん [2010/06/27(日) 02:24:08 ]
>>665
おっしゃる通りでした
Range("A1:A5").Value = Val
でワークシートに置換した値が入りました

ありがとうございました!

668 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 09:36:01 ]
所で、forのループ外で宣言している re をループ内で開放しちゃってるけど大丈夫?

669 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 10:12:08 ]
あ、コメントアウトされてたのね。

老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
end subのすぐ前でOK。

670 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 14:23:54 ]
>>老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
なんで? 不要だろ



671 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 14:25:52 ]
ここから先しばらく不毛な論争が続きますので質問者の方は無視してくださいな



672 名前:664 [2010/06/27(日) 15:51:40 ]
Set re = Nothingを入れる事でメモリ解放するって事ですかね?

個人的にはそんな事より"A1:A5"の範囲ならまだしも
セル範囲が増えた場合オーバーフローしないか心配です
何か良い方法ないですかねぇ
配列を使わずにセル範囲を一つ一つループで置換orスルーできるような処理があれば1番なんですが

673 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 15:55:12 ]
>>669
完全に不要。
あと、解放、な。

674 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 15:56:56 ]
>>672
何がどうオーバーフローするんだ?

675 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:06:12 ]
Nothing入れないと自動変数の領域がキャッシュされてるため
いつまでもオブジェクトが削除されないとかVB.netで聞いた事ある

676 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:12:26 ]
.NETからExcelを操作した時のアウトプロセス解放関連の話と
勘違いしている予感。

677 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:23:59 ]
COMのGCって参照カウンタでしょ。
それに反しなければわざわざリリースなんて要らん。

678 名前:672 [2010/06/27(日) 16:26:01 ]
>>674
ちょっとまだ試行中なのですが、例えば配列数を膨大な数にした場合や
各配列内のデータ(取得したセルの値)、文字数が多い場合等です

Variant型を超える事はないと思ってはいますが、
少し今のやり方だと心配なんですよね

679 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:41:37 ]
>>675
キャッシュ(笑)
VB.net(笑)
適当なこと言ってんなハゲ

680 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 17:51:36 ]
「行儀が悪い」

これならどうだ



681 名前:デフォルトの名無しさん [2010/06/27(日) 18:46:33 ]
煽りとかでは無くて純粋に教えてほしいんだけど、
setした物はnothingにして終わらせる、って教わったんだ。

当時聞いた話では、メモリを占有し続けるからって感じで納得してたんだけど、
これは嘘なのかな?

マナーとしてnothingを代入してやるのか、それとも技術的な理由があるのか、それが知りたい。
nothing入れてやる必要が無いなら、余計なコード書きたくないし、教えてください。

682 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:41:25 ]
>メモリを占有し続けるから

これは嘘ではない

683 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:49:31 ]
nothingを代入しなくて、その変数が生きていれば、メモリが開放されることはない
nothingを代入しても、そのメモリがいつ開放されるかは定かではない
nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される

原則はこういうこと
昔は使い終わったらすぐにnothing代入して、開放可能にしましょうってのが主流だった
今は特殊なオブジェクトでもない限り、あんまり気にしなくていいと思うぞ

684 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:57:09 ]
テンプレに書いてくれ
無駄なもの
最後にnothing
最後にerase
とか
他にもあるんだろうけど


685 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 20:09:26 ]
>>682-683
ありがとう。
俺、後輩にいつもnothingで終わらせろって言ってた・・・。
先輩の指導を鵜呑みにして、自分で調べなかったのが凄く恥ずかしい。
nothing忘れると、先輩が口を酸っぱくして指摘してたんで、そうと信じてた。

>nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
VBAの場合はend subを通った時点でdimが無効になるから、基本的にはset nothingいらないのかぁ・・・。

本当にありがとう。


686 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 20:53:29 ]
SQLServerのJOBにActiveXスクリプト書くときは
Nothingしないと警告でるよ

687 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 21:21:13 ]
そういや、fjのmalloc/free論争はどう決着したんだっけなあ

688 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 21:38:02 ]
>>685
俺は無駄なNothing代入はいらない派だが、またそうやって人の言うこと鵜呑みにするなよ?
VBAは参照カウント方式だから、参照がなくなった時点で自動的に解放されるが、
循環参照(オブジェクトAとBがお互いの参照を保持しちゃってるような場合)があるときは
明示的に解放してやらないとメモリリークする
とりあえずNothingで終わらせておけば問題は発生しないし思考停止できる、というのも一つの考え方ではある

689 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 23:43:38 ]
俺も無駄なNothing代入はいらない派だが
>>688
メモリリークといっても、エクセルの使用メモリが増えていくだけで
エクセルを終了させれば開放される

>Nothingで終わらせておけば問題は発生しないし思考停止できる
ちなみに変数をNothingにしてもメモリリークは防げないこともある

Sub test()
    Set x = CreateObject("Scripting.Dictionary")
    Set y = CreateObject("Scripting.Dictionary")
    Call x.Add("y", y)
    Call y.Add("x", x)
    Set x = Nothing
    Set y = Nothing
End Sub

このプロシジャ呼ぶとちょっとずつメモリ使用量が増加していくぞ

690 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 00:31:57 ]
だからさあ、いらないって言うやつは自分が作るときに使わなきゃいい
いるってやつは自分が作るときに使えばいい
わざわざ他人のコーディングを否定すんなよクズども
いい加減この無限ループやめろっての



ここまでテンプレ



691 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 01:10:01 ]
質問スレだから
質問されたら答えるだけ
間違いを教えていいわけない
結論はどっちでもいいと答えるのかもしれないけど

692 名前:デフォルトの名無しさん [2010/06/28(月) 09:06:38 ]
全角英数字を半角英数字にする関数ってありますか?
Case文で全文字毎に置換するしかないですかね?

693 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 09:34:12 ]
>>692
つ素寅昆布

694 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 09:34:31 ]
はいいえ

695 名前:デフォルトの名無しさん [2010/06/28(月) 11:02:28 ]
>>693
まんこの中見る器具!

696 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 11:40:42 ]
>>692
記号もカナも、半角に変換できる文字は全部変換してもいいんならStrconv
英数以外は変換したくないんなら1文字ずつやるしかない

697 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 15:54:16 ]
相互参照になった場合は?

698 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 17:29:18 ]
>>696
つ性器豹源







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

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<189KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef