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


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

Excel VBA質問スレ Part7



1 名前:デフォルトの名無しさん [2008/06/04(水) 22:56:59 ]
すまんが2の人テンプレやって

ExcelのVBAに関する質問スレです

質問前に 【 >>2-3 】 あたりを良く読むこと

前スレ pc11.2ch.net/test/read.cgi/tech/1205231499/l50


★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
   
 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。 
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

554 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 23:42:09 ]
選択範囲をset して
For Eachでまわそうとすると
余分にまわりませんか?
Selection.Countでみるとときどきなんか多い…わらし?

555 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 23:43:36 ]
コード晒せよ

556 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 04:35:09 ]
>>552
君、うざいよ。

557 名前:y mailto:sage [2008/07/23(水) 17:10:26 ]
>>552
なるほど、納得です。>>549の説明も意味が分かりました。
・再帰のコードは、普通のループ構造で表現できる。
・再帰のコードをいったん末尾再帰の形に直しておけば、ループ構造に直すのが容易。
・末尾再帰のコードは、『残りの操作』(戻り値を使った演算)が必要ないため、理屈としては呼出元の変数の状態を保存しておく必要がない。
・言語によっては(あるいは賢いコンパイラは)この性質を利用して、末尾再帰のコードを、同一関数のくり返しの形(ループ構造)に最適化してくれる。
 だから呼び出しのたびにスタックリソースの消費が増加することがない。
・でもVBAではそういう最適化はしてくれないから、最初から自分でループ構造に直して書く。

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

>>554 >>555

558 名前:デフォルトの名無しさん [2008/07/23(水) 17:15:16 ]
VBAで、GUID(グローバル一意識別子)を取得したいのですが、
なにか関数などはありますか?
GetGUID的な、都度ユニークなIDを返してくれるような。
C++の方法はわかるのですが、VBAでやる方法がわかりません。
よろしくお願いいたします。

559 名前:y mailto:sage [2008/07/23(水) 17:39:34 ]
>>558
手元にあるリファレンスブックをざっと見ましたが、
そういう関数は私には見つけられませんでした。

その識別子を何に使いたいのか教えてくれたら、
他の方もアドバイスしやすいと思います。

560 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:16:36 ]
>>557
だいたいその認識でOK。
誤解の無い様に言っておくが、(勘違いしていたらすまんこ)
全ての再帰がループに直せるわけじゃなくて、末尾再帰だけね。

561 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:34:49 ]
>>558
VB GUID 生成

562 名前:デフォルトの名無しさん [2008/07/25(金) 11:11:35 ]
>>559 >>561

ありがとうございます。
できました。
support.microsoft.com/kb/176790/ja



563 名前:デフォルトの名無しさん [2008/07/26(土) 04:38:05 ]
文字列の置換に関しての質問です。
以下のような記述をしているのですが、
置換してほしくないものまで置換してしまいます。

たとえば文字列A12をB12に置換したいが、
文字列A123は置換せずそのままにしたいような場合、どうすればよいのでしょうか?
ちなみにWhat:=str1とReplacement:=str2は別シートの置換リストから引っ張ってきています。

 ActiveSheet.Columns("A:A").Select
 Selection.Replace What:=str1, Replacement:=str2



564 名前:563 mailto:sage [2008/07/26(土) 04:44:26 ]
>>563の追記です。
1つのセル内には複数の文字列群があるため(A12とA123が同一セルにある)
xlWhole をつけてもだめでした。

565 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 06:20:22 ]
A123を先にB123に変換
A12を変換
B123をA123に変換
では多分駄目なんだろなぁ


566 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 06:54:00 ]
>>563
あくまでおいらのやり方ね。状況に応じて何種類か使い分けてるね。

>>565さんのやり方。
str1の検索ワードにlenでの長さを出して、降順にソート。長い物から置換して行く。

・オートフィルタで完全一致させる物を抽出。んでマッチにしたセルを置換。

・上二つや、組み合わせで対応出来ない時はregexpのreplaceを使う。(regexpの話出ると荒れるんだよね・・・)

たぶん、検索文字列と置換文字列がデータテーブルに存在するならば、
オートフィルタか、長い順に置換で出来るような気がするよ。

567 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 06:57:31 ]
>>564
>1つのセル内には複数の文字列群があるため(A12とA123が同一セルにある)

かぁ・・・・。
データテーブルを文字列の長い順にソートしてから、
オートフィルタの部分一致で抽出、見えてるセルにreplaceでどうかな。


568 名前:563 mailto:sage [2008/07/26(土) 07:57:01 ]
>>565 >>566 >>567さん
朝早くからご回答ありがとうございます!
今日夜にでも長い順にソートで試してみたいと思います。

569 名前:563 mailto:sage [2008/07/26(土) 08:07:43 ]
置換の>>563です、
あぁ・・・。
以下のような場合がマズイかもしれません。
もう少し調べたり考えたりしてみますね。

例)置換リスト A123→B123

対象データセルの文字列
A12 A123 A1234

※A1234までB1234になってしまう。

570 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 08:56:38 ]
一旦配列に取り込んでVBAでReplaceした方がいいんじゃないのかな

571 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:00:50 ]
あ、Replace関数使うんならLen関数も一緒に使うとかしないとダメだな

572 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:02:27 ]
置換条件が結構厳しそうだね。
replaceだと一致は理論上の部分一致だし、
1セルに複数の文字列が入ってるとなると、オートフィルタも限界あるなぁ。

regexpのreplaceメソッドが良いような気がするけど、詳しい人の意見も聞きたいな。
セルの中で、どんな風に文字が配置されてるかが分からないけど・・・まぁ行けるかと。

A12A123A1234 のうちA123だけを置換したいなら、 "A123^A"で引っ掛けられるかな。



573 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:07:43 ]
VBAのreplace使えるのって、A123もA1234も置換する場合に限られるような気がする。
もし、A123は置換するけど、A1234はそのまま、って場合にはちとまずい。


574 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:54:55 ]
だから配列に取り込むんだよ

575 名前:y mailto:sage [2008/07/26(土) 14:27:52 ]
>>569
まず、>>563

>文字列A12をB12に置換したいが、
>文字列A123は置換せずそのままにしたい

と書いていますが、2つの要求同士が矛盾しているので、
そのような動作はありえません。

解決の可能性としては、>>572の「セルの中でどんな風に文字が配置されているか」がポイントです。
つまり、文字の配置に規則性があるかどうか、ということです。
たとえば>>569で、対象データセルの文字列として「A12 A123 A1234」という例が示されていますが、
これを見る限り「文字列に含まれる各単語は、スペースで区切られている」という規則性が感じられます。
もし、すべての対象データセルの文字列がこの規則に従っているなら、望みの操作は可能です。

まずはすべての文字列に共通する規則性があるかどうかを確認し、
もし上記のような規則が存在するなら、>>570>>574が薦めている
「配列にとりこむ」方法を検討してみてください。
この場合、Split関数が使えます。



576 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:19:23 ]
>>569の例のように区切り文字がスペースって事なら(半角と全角が混在してるな・・・)

 ActiveSheet.Columns("A:A").Select
 For Each c In Selection
  c.Value = RTrim(Replace(Replace(c.Value," "," ") & " ", str1 & " ", str2 & " "))
 Next

とかでどうかな、遅いし全角スペースは半角になっちゃうけどね

577 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 21:04:21 ]
何でもかんでもVBAの機能だけでやろうとすんなって。
使える物は何でも使おうぜ。
VBSだろうがAPIだろうがWHSだろうが、VBAから使える以上、VBAで良いと思うぞ。

578 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 21:27:32 ]
Microsoft VBScript Regular Expressions
参照して、正規表現で置換かけるのはダメなん?

579 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:58:50 ]
完全一致を望むならば、やはり正規表現だと思う。


580 名前:y mailto:sage [2008/07/26(土) 23:48:07 ]
>>576のレスを見て、全角と半角の混在に気づきました。
これではJoinは使えませんね...

私は正規表現は苦手で、普段はあまり使っていないのですが、
たしかにこの状況では正規表現が良さそうな気がしてきました。
半角・全角スペースどちらにもマッチしてくれる\bがかなり便利。
"\b(A12)\b" を探して "B12" にReplaceするだけで済みますね。


581 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 02:43:35 ]
>>577
具体的にどうやるのか示せよ

582 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 08:18:41 ]
どんな物を置換したいのか、どんな並びになってるのかが分かればマッチパターンを考える事は出来まっせ。

もし、住所録の置換なんかで、
○○県アルプス市〜〜 → ●●県foo市〜〜
××県南アルプス市〜〜 → △△県bar市〜〜
みたいなのだと、正規表現じゃないと無理ですな。

何にせよ、規則性を見つけ出してパターンを組む事から始めよう。




583 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 11:20:14 ]
XP Excel2003で質問なのですが

480×640の画像のRGBの値を画素ごとに
R(480,640),G(480,640),B(480,640)
という配列に読み込みたいのですが可能でしょうか?


584 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 11:50:28 ]
スレ違い

585 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 12:37:40 ]
画素ごとに・・・ってあんた。

586 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 14:47:34 ]
1000万画素の写真として、3000万個の配列ですか・・・。
考えただけで鬱・・・。

587 名前:640*480がどうやったら1000万になるんだw mailto:sage [2008/07/27(日) 14:57:49 ]
>>586
もし暗算が苦手でしたら、WindowsにしろLinux(Gnome)にしろ電卓アプリが付属していますので是非お使いください。

588 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 15:28:04 ]
え・・・普通480×640って言ったら画像サイズの事じゃないの?
画素数は密度によって違うと思うんだけど。

589 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 15:46:09 ]
>>588
画像サイズが pixel 単位表記ではない可能性の話?

仮に mm 表記で 100dpi とすると
640mm/25.4*100≒2520pixel
480mm/25.4*100≒1890pixel
2520x1890=470万画素

590 名前:y mailto:sage [2008/07/27(日) 15:56:24 ]
>>583

可能です。中級ぐらいのVBA解説書で時々見かける課題です。
まずは対象の画像ファイルをBinaryモードでOpenし、
配列変数にバイト単位で格納します。数行で済みます。
ttp://www.cocoaliz.com/excelVBA/index/47/

次に、その画像のファイル形式の仕様に沿って、画素データを抽出する
だけですが、画素ごとの色データを取得するのが目的であれば、
24bitモードのBMP形式の画像ファイルがもっとも簡単です。
他の形式の画像ファイルでも、いったん24bitのBMP形式に保存しなおして
から処理するといいでしょう。

BMP形式の仕様はこうなっています。
ttp://www.kk.iij4u.or.jp/~kondo/bmp/

データ部には、1画素につきRGBの順で各1バイト(計3バイト)の
色データが並んでいます。(注意が必要なのは、並びが最下行から最上行の
方向になっている点です)
上記2サイトを参考にチャレンジしてみてください。

591 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 15:58:56 ]
エクセルっていろんな事出来るんだね・・・ほんとすごいです。

592 名前:y mailto:sage [2008/07/27(日) 16:24:18 ]
すみません。>>590は「VBA解説書」→「VB解説書」の間違いです。
さすがにExcelVBAの解説書で、画像ファイル処理の例は見たことはありません。
ある意味>>584ですが、ついつい答えてしまいました。



593 名前:583 mailto:sage [2008/07/27(日) 16:57:26 ]
画像サイズと画素数を混用してしまったせいで変な誤解をさせてしまったみたいです
すみませんでした。

>>590
非常にわかりやく解説していただいてありがとうございます!
ずばりこれを知りたかったんです。
ありがとうございます。

594 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 23:06:38 ]
結局、置換の質問した人はうまく出来たのかな。

595 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 01:39:56 ]
今頃痴漢してつかまってるよ

596 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 07:04:35 ]
( ´_ゝ`)

597 名前:563 mailto:sage [2008/07/28(月) 22:36:20 ]
ご報告が遅くなりましてすいません。置換の人です。

みなさんの知恵をお借りして、
私のつたないプログラム能力でなんとか作ってみました。

結局、セルを1つずつ読み込んで、
セル内の文字列に対してregexp正規表現 \b(str)\b で置換 
という形にしたところ、要求を満たすことができました。
みなさんありがとうございました!

598 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 22:53:14 ]
おめでとう

599 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:57:03 ]
入力された文字が漢字か平仮名かを判定することは可能でしょうか?

600 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 12:05:21 ]
はい。

601 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 12:42:22 ]
どうしればいいのでしょうか
教えてください

602 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 13:36:48 ]
全てのひらがなのリストを用意し、入力された文字がその中に見つかるかどうか判定すれば宜しいのではないかと。



603 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:22:43 ]
そんな無駄で面倒なことしなくても、文字コード判定すれば一目瞭然かと

604 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 16:30:33 ]
>文字コード判定

こいつを具体的に。

605 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 20:05:58 ]
VBAからSASを操る事は可能でしょうか。
もし可能だったら、どんな感じで行えるのかを教えてくださいませ。

606 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 20:38:51 ]
> VBAからSASを操る事は可能でしょうか。
可能です

> もし可能だったら、どんな感じで行えるのかを教えてくださいませ。
>>1★3

607 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:06:22 ]
ありがとうございました。


608 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:41:39 ]
>>604
平仮名の文字コード知るには

Cells(1, 1).Value = Asc("あ") ' -32096 を返す

609 名前:デフォルトの名無しさん [2008/07/29(火) 22:44:03 ]
グラフを描くとき、データ範囲設定において、
A1〜A12のデータがあり、A1〜A6、空白データ、A7〜A12と設定してグラフを描きたいのですが、
空白データの設定がわかりません。
空白データA1000〜A1010を設定して、Unionで範囲結合しても駄目でした。

できる限りシートのデータ位置は移動させたくありません。
何かよい方法がありましたら教えてください。

610 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:48:11 ]
>>608
で、それが>602よりも無駄でもなく面倒でもないと?

611 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:49:46 ]
>>609
見せないダミーのセルに空白データを抜いてコピーするんじゃダメ?

612 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:00:27 ]
>>602
もしアルファベットやらカタカナやらが入力されても漢字と判定するって事か
どういう入力があるのか知らんけど



613 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:11:06 ]
>>610
-32096から-32015の値を探せば良いだけ
直接文字列の"あ"とか探すよりも効率的
意味わからないかな?

614 名前:デフォルトの名無しさん [2008/07/29(火) 23:47:04 ]
>>611
すでにデータが入っていて、他関数からも使うので位置は動かしたくないのです。

615 名前:デフォルトの名無しさん [2008/07/30(水) 02:37:30 ]
コードを手動でエクスポートするのが面倒なので、コードをすべてエクスポートしてdoxygen
するコードを書いてみました。
要はイミディエイトウインドウの内容をクリアして、Enterキーを送ってイミディエイトウインドウ
でshellコマンドを実行したいんですが、クリアする処理をすると、コマンドが送られた後
クリアされてしまいます。クリアする処理を省けば問題ないのですが、できれば出力過程も
イミディエイトウインドウに出力したいのです。気分的に。
どなたか同じような事やったことある方いませんか?

Sub prcExportVBComponents()
Set oVBComponents = Application.VBE.ActiveVBProject.VBComponents
Set oWin = Application.VBE.Windows
Set oCodePane = Application.VBE.ActiveCodePane

' prcClearImmediateWindow ' イミディエイトウインドウをクリア
' oWin.Item("イミディエイト").WindowState = vbext_ws_Normal
' oWin.Item("イミディエイト").SetFocus
' SendKeys "^a"
' SendKeys "{Del}"
'処理

Debug.Print "shell " & Chr(34) & strComponentPath & "bld.bat" & Chr(34) ' doxygenを実行
'前の行に戻ってEnter
oWin.Item("イミディエイト").SetFocus
SendKeys "{Left}"
SendKeys "{Enter}"
End Sub

616 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 07:39:21 ]
>>615
わざわざイミディエイトウィンドウで実行しなくてもいいんじゃないの?
つまり、End Subの前の3行(コメントも入れて4行)を

Shell strComponentPath & "bld.bat"

に置き換える。

617 名前:デフォルトの名無しさん [2008/07/31(木) 21:46:16 ]
ブックを変更して、ファイルを閉じようとしたり、エクセルを終了
させようとすると、
「変更を保存しますか?」
とメッセージが出力されます。
ここで、「はい」、「いいえ」、「キャンセル」のどれが
選択されたかを取得する方法ってありますか?

618 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 00:26:32 ]
あります

619 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 00:41:10 ]
ちょっと前からこのスレ見てるけど、やけに意地悪なやつがいるな
たぶん同一人物だろう

620 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 00:45:00 ]
いいえ

621 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 07:50:45 ]
>>619
馬鹿?

622 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 09:16:09 ]
わざわざ質問に答えてて充分親切だと思うよ。
方法の詳細を知りたいなら、ちゃんと質問しない方が悪い。



623 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 09:32:49 ]
>>617
return value

624 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 15:02:50 ]
名簿にオートフィルタを使い、名前の列(B列)で抽出された可視セルを配列に格納するプログラムを作ろうとしています。
現在、可視セルを配列に格納する部分で躓いています。
Dim i As Long
Dim hairetu() As String
Dim kasi As Long

kasi = Range("B2", Range("B2").End(xlDown)).SpecialCells(xlCellTypeVisible).Count
ReDim hairetu(kasi - 1)

For i = 0 To kasi - 1
hairetu(i) = Range("B2:B100").SpecialCells(xlCellTypeVisible).Value
Next

修正すべき箇所や効率的な方法がありましたら教えてください。

625 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 15:10:23 ]
cells(1,1).end(xldown)
で、可視セルを1段ずつ下げて行くとか?

626 名前:デフォルトの名無しさん [2008/08/01(金) 17:41:24 ]
グラフで折れ線を描くとき、間にデータがないと線でつないでくれません。
ツール、オプション、グラフで線を補完すると線は引かれました。

ここで質問です。
間を補完したい項目、補完したくない項目があります。
ある項目のみ補完する方法があれば教えてください(VBAでも可)


627 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 20:48:21 ]
データを線形補間して、別のシートに出力、グラフ生成

628 名前:y mailto:sage [2008/08/01(金) 22:22:26 ]
>>624

コードを見る限り、SpecialCells(xlCellTypeVisible)が
可視セルのコレクションを返す、ということは分かっておられると思います。
コレクションに何個のセルが含まれているかをCountプロパティで取得し、
配列の要素数を確定するところまでは、きちんとできています。

問題は、最後のForループです。今の場合は、可視セルのコレクションの
個々の要素の値を配列に格納したいわけなので、
Forループではなく、For Each ループを使うのが妥当です。
(あらかじめ、コレクションの要素を受けるための変数c as Variantを宣言しておいてください)

i=0
For Each c in Range("B2", Range("B2").End(xlDown)).SpecialCells(xlCellTypeVisible)
 hairetu(i) = c.Value
 i=i+1
Next



629 名前:y mailto:sage [2008/08/01(金) 22:41:09 ]
>>626

まずは「ツール、オプション、グラフで線を補完」の状態にしておきます。
これで基本的に補完される状態になります。

次に、補完したくない要素について、線の色を背景色と同じにし、見えなくします。
VBAで表現すると次のようになります。
ActiveChart.SeriesCollection(1).Points(4).Border.Colorindex=2
(系列1の4番目の要素の線の色を白にする)
プロットエリアの背景色が白なら、こうすることで見えなくなります。

この操作をマウスでやってみて、「マクロの記録」を
してみると分かりやすいと思います。

630 名前:y mailto:sage [2008/08/01(金) 22:53:57 ]
>>614

>>611の言いたいのは、もとのデータを移動させることではなく、
もとのデータのコピーを別の場所に貼り付けて、
そのコピーをグラフのデータとすればいいのではないか、
ということだと思います。
私も、それ以外方法が思いつきません。

別シートのA1:A6に、元シートのA1:A6を、
A8:A13に、元シートのA7:A12を、
それぞれ「リンク貼り付け」します。

そして、別シートのA1:A13をグラフのデータとします。
「リンク貼り付け」しておけば、元シートのA1:A12が変化しても
即座に反映されます。


>>615
すごい面白そうですが、私はやったことがありません。

631 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 23:50:44 ]
コレクションのすべてに命令を掛けるループは for each が妥当だとは思うんだけど、
for でcountして回すのと、for eachでコレクションにループ掛けるのではどっちがスマートなんだろ。

今、実測出来る場所じゃないんだけど、誰か測定した事ある人いますか?


632 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 00:05:45 ]
>>631
ほとんどかわらないみたい
ttp://officetanaka.net/excel/vba/speed/s5.htm



633 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 00:20:28 ]
何も事情がないかぎりFor Each使ったほうが分かりやすい。

634 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 13:46:15 ]
値渡しとか参照渡しするくらいなら
はじめからPublicで定義しといたほうがいいとおもうのはおれだけ?

635 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 14:03:54 ]
Publicはできるだけ少なくするのが基本 なくせるならないほうがいい

636 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 14:09:22 ]
UserForm に Application.GetOpenFilename でファイルを開くダイアログを
使ってファイルを開いた後に、UserFormにファイルをドロップできるように
なってしまったんですが、私だけですか?

637 名前:y mailto:sage [2008/08/02(土) 14:16:59 ]
>>631

基本>>633ですが、たしかに事情によっては、
コレクション対象であってもForループの方がスマートな場合もあります。
たとえば、コレクションのすべての要素を配列に格納したい場合、

i = 0
For Each tmp In myCollection
 ary(i) = tmp
 i = i + 1
Next

とすると、配列添字カウンタ変数iと、アイテム取り出し変数tmp
の2つがどうしても必要ですが、Forループなら添字カウンタ変数だけで
済みますよね。

For i = 0 To myCollection.Count - 1
 ary(i) = myCollection.Item(i + 1)
Next

カウンタ変数の加算が、For構文の中に組み込まれているのも利点で、
できるだけDo Loop ステートメントではなくFor ステートメントを使うことを
好む方も、たいていそれが理由だとか。

でも速度的には、下の例はループのたびに補正演算が入るので、ほんのちょっと
遅くなってしまうかも。


638 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 16:49:03 ]
僕はいつもこうしてます。気分的なもので。
こっちのほうが早いような気がしてます。

lngCnt = myCollection.Count
For i = 0 To lngCnt - 1
 ary(i) = myCollection.Item(i + 1)
Next

639 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 16:51:36 ]
VBAで大量のコレクションをループすると非常に遅くなりますよね

640 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 17:55:31 ]
速度は気にするべきじゃない。
なんにせよ、パフォーマンスは計らないとわからないという一面もあるし。
最初はアホなコーディングさえしなければおk。

641 名前:y mailto:sage [2008/08/02(土) 18:31:11 ]
アホなコーディングといえば、初心者の頃の私は>>634をさらにつきつめたような
考えを持っていて、ある日「どの関数でもループにiを使うなら、iをパブリック変数に
しておけばいいじゃない!」とひらめいたのです。そしてその方法で2つぐらい
モジュールを書いて、「これはどんな解説書にも載っていない画期的な方法だ!」と
思い込んでいました。


642 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 18:35:13 ]
確かに画期的だね



643 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 18:52:55 ]
VBAはブロック単位で変数が初期化されるわけじゃないから、
初期化処理を書かないまま特定の処理部分をループにしたりすると、
前回の内容がそのまま流れてきたりしてしまうんだよなあ。

644 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 19:00:17 ]
static i が良く分かりません。

関数1で使った変数の続きを関数2で利用する時に、
いったん、ストック用の変数に入れて、関数2の時に呼び出してる人がいたので、
staticで続ければ良いんじゃないですか?

と言ったら、無知は黙ってろ。と言われました。
staticは関数間で解放されない変数と記憶していたのですが、間違ってますでしょうか。

645 名前:デフォルトの名無しさん [2008/08/02(土) 19:31:37 ]
エクセルからワードに差し込むように
エクセルファイル(データ)→エクセルファイル(伝票書式)に差し込みたいけど
伝票書式側のファイルにVBAや関数組んで引っ張ったほうがいいのかな?

差込ボタンを押したら
・(データ)ファイルの一番下の行をコピー
・(伝票)ファイルの適当なところに貼り付け
・でそこをセル参照
・↑↓ボタンを押したら(データ)ファイルのデータの1行上・下をコピー、以下同

こんな感じでしょうか?
もっといい関数とやらはあるのでしょうか?
会社のPCはアクセス無いから大変だ・・

646 名前:617 [2008/08/02(土) 20:18:35 ]
>>623

すいません。もう少し詳しく教えて頂けませんか?

647 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 20:39:25 ]
>>645
>・↑↓ボタンを押したら(データ)ファイルのデータの1行上・下をコピー
押したタイミングで命令をするならイベントハンドラの考え方になるね。

SheetSelectionChangeイベントが良いかな。
右左をとれないようにして、keydownで設定するのも良いかも。

ここまで書いたんだけど、どんな制御にしたいかイメージが難しいです。
すいません。

648 名前:y mailto:sage [2008/08/02(土) 21:16:58 ]
>>642 >>643
その後、ループの中から別関数を呼び出し、呼び出し先関数でもループを用いる形が出てきて、
同じPublic iを使い回していたその画期的なシステムは、完全に機能不全に陥りました。

>>645
いろいろなやり方があると思います。私はむしろデータブック側に、
任意のデータを取り出すためのユーザー定義関数を実装し、
伝票書式ブック側から参照設定するやり方をよく用います。
たとえば、データの主キーが「伝票番号」である場合、
「伝票番号」を渡すとその伝票の売上日を返す関数UriageDate(dNum)、
売り先を返す関数Urisaki(dNum)、金額を返す関数Kingaku(dNum)、
などをデータブック側に定義しておきます。

そうして伝票書式ブックから参照設定でそれらの関数を
利用できるようにすれば、任意のセルにその関数を入れるだけで、
お好みのデータを取り出すことができます。
たとえば、伝票書式ブックのA1が伝票番号のセルだとすると、あとは任意のセルに
=UriageDate(A1)、=Urisaki(A1)、=Kingaku(A1)
という数式を埋め込んでおけば、A1の伝票番号を変えるだけで、
即座にこれらの関数が適切なデータを返してくれます。

伝票書式ブック側にVBAモジュールを実装し、その中で「Cells(3,4)に売り先を書き込む、Cells(4,10)に金額を書き込む」
とやっていると、伝票書式のデザインを変更したいときに柔軟に対応できませんが、
このやり方なら、数式を埋め込むセルを変えるだけで済みます。
また、参照設定さえすれば、さらに別のブックからもこれらの関数を利用できます。


649 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 21:28:15 ]
機能不全になる前に気づけよw

650 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 21:36:20 ]
他人に迷惑かけない限り別にいいじゃない。
641じゃないけど実際に痛い目にあうとよく覚える。

651 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 21:38:18 ]
カスタムシート関数の場合は共有設定でも見られるのがいい

652 名前:y mailto:sage [2008/08/02(土) 21:46:37 ]
>>649
機能不全の理由が分かるまで3日ぐらいかかりましたw
初めての頃はまずそんなもんです。

>>644
間違っているかどうかは、文章だけではよくわかりません。
関数1を呼び出す関数が、関数2以外にも複数ある場合は、
それら別の関数が、関数1の中の Static i をいじる可能性があります。
本来、Static変数はそういう使い方をされるためにあるのですが、
やはり場合に応じて、いじられても良い時と、いじられたら困る時とがあります。
後者の場合は、とりあえず現在の値をどこかにストックしておく必要が生じます。




653 名前:645 mailto:sage [2008/08/02(土) 22:04:31 ]
ユーザー定義関数か・・・ちょっとやってみよう

654 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 22:33:09 ]
ちなみにユーザ定義のシート関数のパフォーマンスなら↓に載ってた。
まあ、正確だとはいえないが、VBAが決して遅くないことがわかる。
www.spreadsheethell.com/codematic/Excel-development/Excel-Visual-studio/excel-user-defined-functions.htm

655 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 23:38:08 ]
C#圧倒的だな

656 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 00:02:13 ]
そうね 圧倒的に遅い

657 名前:デフォルトの名無しさん [2008/08/03(日) 00:12:51 ]
マクロでコピー、貼り付けを記録すると
Range("A3").Select
Selection.Copy
Range("C3").Select
ActiveSheet.Paste
こうなりますが、汎用性を高めるために
  i=Activecell.row
  Cells(i,1).Select
Selection.Copy
  Cells(i,3).Select
ActiveSheet.Paste
としました。
でもコピー貼り付けが多くなったり、列入れ替えがあると列の番号の変更が大変です。
シートの上端行を名前で定義した場合、マクロで名前を使うにはどうすればいいのでしょう?
Cells(i,"顧客名").Select のように使えたらいいのですが・・・

658 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 00:15:53 ]
Range("C3") = Range("A3") でおっけ

659 名前:657 mailto:sage [2008/08/03(日) 00:24:34 ]
A3をC3にコピーするだけじゃなく
汎用性を高めるために
選択セルの行の 1列目を3列目にコピーするようにしたいのです。(実際は別ブックへ)

660 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 00:45:57 ]
do until cells(1,j).value = "顧客名"
j = j + 1
loop

cells(i,j).copy

とか?

661 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 00:47:13 ]
普通に[1:1].Find("顧客名").Column??

662 名前:657 mailto:sage [2008/08/03(日) 06:52:56 ]
i = ActiveCell.Row
j = [1:1].Find("顧客名").Column

Cells(i, j).Select
Selection.Copy
Range("C3").Select
ActiveSheet.Paste

でうまくいきました。ありがとうございます。



663 名前:デフォルトの名無しさん [2008/08/03(日) 22:25:28 ]
部門テーブル
主キー 
01)部門CD  数値 4桁
02)部門カナ 文字 10桁
03)部門名  文字 20桁
04)部門略称 文字 6桁
05)作成日  日付 --桁
06)作成時間 時間 --桁
07)作成端末 数値 7桁
08)作成者ID 文字 10桁
09)更新日  日付 --桁
10)更新時間 時間 --桁
11)更新端末 数値 7桁 
12)更新者ID 文字 10桁

部門CD,部門カナ    ,部門名      部門略称 作成日 作成時間  作成端末 作成者ID 更新日   更新時間 更新端末 更新者ID  
  1,エイギョウ    営業       営業    2002/09/01 00:00:00  80001 FUJI 2002/09/01 00:00:00 80001 FUJI   


664 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 22:28:16 ]
おっと

665 名前:デフォルトの名無しさん [2008/08/03(日) 22:53:52 ]
663のを教えて。


666 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 23:00:13 ]
富士通もとうとう日本語が喋れないのが標準になったか

667 名前:626 [2008/08/04(月) 03:41:16 ]
>>629
>次に、補完したくない要素について、線の色を背景色と同じにし、見えなくします。
一部線が引かれているところがあり、そこは見えてもらわないと困るのです。

668 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 04:00:15 ]
>>667
データを線形補間して、別のシートに出力、グラフ生成

669 名前:デフォルトの名無しさん [2008/08/04(月) 07:55:36 ]
Excelの機能には限界があるんだから、Excelでできない事は自分でやらないと

670 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 08:07:21 ]
>>667
線全部じゃなくて、要らないところだけ背景と同色にすればいいだろ。

671 名前:y mailto:sage [2008/08/04(月) 14:08:37 ]
>>667

>>670でフォローしてくださっている通り、
線全部ではなく、一部分だけを背景と同色にできます。
>>629のコード例はそのつもりで書いたもので、
系列1の線の、4つ目の線分だけを見えなくします。
つまり、点1から点4までと、点5から最後の点までは
きちんとつながっている状態です。

手作業で(マウスで)試す場合は、ある線をクリックして、
さらにもう一度クリックしてみてください。
クリックされた線分だけがアクティブになるはずです。
その部分だけに、お好みの書式を適用できます。
その動作をマクロ記録すれば、VBAでどう表現するのか
分かりやすいと思います。

>>668でもいいと思います。


672 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 14:14:19 ]
マクロ記録はAlt, T, M, Rと覚えてしまったら楽。



673 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 15:39:51 ]
一つの変数を複数のユーザーフォームで使いまわす方法ありますかね?

674 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 16:15:19 ]
>>672
やめてくれ。マクロ記録するたびにあのボーカルの顔が浮かんじまうw

>>673
「使いまわす」を詳しく。

675 名前:デフォルトの名無しさん [2008/08/04(月) 21:21:01 ]
久しぶりにマクロ組んで保存して使おうと思ったら・・・・
マクロ有効形式でなければ保存受け付けないだの
セキュリティレベルの警告も出ないまま無効だの
ファイルが安全な場所になきゃ有効にしてくれないだの


すげーむかついた
vista視ね

676 名前:デフォルトの名無しさん [2008/08/04(月) 22:03:41 ]
visuta厨涙目w

677 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 22:12:52 ]
それWindows VistaだからじゃなくてOffice 2007だからだろ。

678 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 23:57:08 ]
2007のリボンは本当にひどい。
慣れとか言う以前に、慣れても面倒。
クリック回数が増えただけですわ。

Alt+F8 , Alt+F11 で慣れてないとVBE環境もつらい・・。

679 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 00:27:38 ]
他に選択肢ないのがつらいね
あぁ待てばいいだけか

680 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 09:51:05 ]
質問です。現在、ユーザーフォームを.PrintFormを使い印刷しています。
このユーザーフォームは、
上側にボタンが横一列で並んでいて
中央にコメントボックス、
下側にラベル
という形になっています。

このユーザーフォームを、コメントボックスとラベルのみを印刷、
又は印刷時にボタンを非表示にする、ということは可能でしょうか?
もしできるのであればその方法を教えてください。お願いします。

681 名前:デフォルトの名無しさん [2008/08/05(火) 10:23:10 ]
>ボタンを非表示にする、

という事であれば、

userform1.button1.visible = false にすれば
非表示には出来る

682 名前:デフォルトの名無しさん [2008/08/05(火) 11:29:34 ]
セルに文字列があり、変数に取り込みメッセージの一部に使いたいのです。

しかしセルに改行が入っていると当然メッセージでも改行されます。
改行を取り除く方法があれば教えてください。



683 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 11:38:02 ]
vbcrlfを探して取り除く。

684 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 17:13:22 ]
Alt+Enterでのセル内改行はvbLfのみだぞ
.Value = "a" & vbCrLf & "b"
みたいにすれば、vbCrLf での改行も不可能では無いが
普通はvbCrLfを取り除いても意味無い

685 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 20:01:44 ]
excelでデータベースのロジカルチェックを掛ける事を考えておりまして、
つきまして、プログラム構造、モジュール構造についてアドバイスを頂きたく投稿します。

ロジカルチェック自体は、200-300個あります。
今考えているのは、1つのモジュールに、private sub で200個のプログラムを書いておき、
1つの sub で200個のチェックプログラムを call しようと考えています。

そこで質問なのですが、1つのモジュールにたくさん詰める事は好ましくないのでしょうか。
保守を考えると、private sub A010010 のように、チェック番号をプログラム名にしておけば、
Ctrl+Fの検索で、見つけやすいかなぁ。と思っています。

皆様だったらば、どのように構築していくか等、アドバイスを頂ければ幸いです。
よろしくお願いします。

686 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 20:19:44 ]
ストアド書いて、befor triggerにしろ

687 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:09:25 ]
勉強不足で申し訳ありません。ストアドプロシージャは初めて聞きました。

データベースはSASで作成されているのですが、SASを使える人が少ない上、
教育に金が掛かる&SASライセンスが高い。と言う理由で、
なるべくコストの掛からない方向を考えている次第です。
統計解析を行うので、データベースをSASから変える事は難しいです。

イメージとしては、SASで作成されたデータセットを1つのブックに統合し、
その統合ファイル上でロジカルチェックを掛けられればと思っています。

当方、ACCESSやSQLの知識が無い為に、ストアドと言う単語も初めて聞いたのですが、
やはりEXCELのみで完結させるのは難しいでしょうか。

もし可能であれば、もう少し詳しく教えていただけますでしょうか。よろしくお願いします。
情報小出しのようになってしまい申し訳ありません。

688 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:28:12 ]
>>687
長い目で見れば、弊社のような専門家にお任せいただくのが一番かと存じます。

689 名前:デフォルトの名無しさん [2008/08/05(火) 21:30:04 ]
難しい言い回しにしなくてもいいと思うよ
www005.upp.so-net.ne.jp/aoken/sas/sas_iom_xls.html

690 名前:y mailto:sage [2008/08/05(火) 21:38:27 ]
>>685

最適な構造は、最終的にどういう運用をしたいのか
なるべく具体的にイメージすることで見えてきます。
細部の仕様も、その過程で決まっていきます。

・常に全種類のチェックが必要か
 →状況により、「前半のチェックは省略したい」などの要求が起こりえる場合
   →Call文のコメントアウトで対応?
   →スイッチUI実装?
     →チェックする項目のプリセットを保存できれば便利?

・エラーレポートはどうしたい?
 →Excelシートに出力
 →テキストファイルに出力

・修復ロジックも実装したい?

そのプロジェクトは一人で担当しているのですか?
もし何人かでやっているのであれば、上のような点を
協働者とも相談してみてください。


691 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:44:58 ]
>>689
ありがとうございます。ただ、SASでステップは走らせません:(

すいません。私の質問の仕方が悪かったようです。

データベース、解析は一切関係無いとして、
1つのEXCELブック内にあるデータ同士の整合性をチェックするプログラムが200個あります。
この200個はどのように書いて行く、もしくは作成していくべきでしょうか。
個々に呼び出す必要はなく、必ず200個全てを走らせます。
1つの標準モジュールに200個羅列して行くべきか、モジュールを分割するべきか、
はたまたストアドを利用するか・・・。

ストアドプロシージャを調べてもEXCELと関連のあるページは見つけられませんでした。

本当に申し訳ありません・・・。

692 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:54:01 ]
>>690
レスありがとうございます。
組み込んだロジカルチェックは必ず全部実行させます。

エラーレポートに関しては、後々処理が出来るように、別ファイルにダンプし、ログとして集積させます。
そして、レポートを発行する際に、管理番号でオートフィルタを掛け、
マクロでレポートの形にして、発行出来るようにする事を考えています。

プロジェクトとしては、これから提案して変えて行こうと思っている段階です。
その為には、具体的にロジカルチェックをEXCELのみで掛ける事が重要と思いまして、
質問をさせていただきました。




693 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:56:31 ]
>>692
運用がわからんからなんとも言えんが、パフォーマンスなんかは問題にならんの?
# そして全く無視される>688w

694 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 22:03:04 ]
>>693
private sub で200個を1つのモジュールに記載して、
呼び出し用の sub で200個を call する事は問題が無いのか、そこが気になっています。

そこまで多くのプログラムを1つのモジュールに書いた事がありません。
本当に動くのかも悩みの種です。

統合ファイルの内訳としては、その度に変わるので一概には言えないのですが、
平均すると25-30シートで、1つのシートに多くとも2000行程度なので、問題はなさそうです。



695 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 22:37:38 ]
>>694
・Subではなくて、FunctionでBooleanを返したほうが良いのでは?
・一つのモジュールに入る大きさのコードなら、どれだけ書こうと全く問題がない(限界を超えたら
 実行時エラーとして教えてくれる)
・保守を考えるなら、第三者が見てわかりやすい関数名にしたほうが良い
・関数名には日本語が使えて、さらに日本語を使っても全く問題がないので、日本語を使った
 関数名にするというのも一つの手

696 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 22:51:41 ]
>>695
レスありがとうございます。
functionのboolean戻りは良いですね。
booleanで返した時に、エラー項目を引っ張る際にもう1段踏まないと行けないのがつらそうですが、
何とか対処出来そうです。

やはりモジュールに限界はあるのですか・・・。でも実行時エラーが出るなら安心ですね。

実はチェックリストが存在していて、そのチェックリストを基にプログラムを組むので、
チェックNo.のコードを関数名にするのが良いと思いました。

アドバイスありがとうございます。


697 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:02:38 ]
200ねえ…
そんな量じゃなければ、私ならインタフェース使ってクラス量産かな。
(なんせ200もクラスがあるとウザいので)
これなら処理を値として扱える。

698 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:05:49 ]
>>697
ですよねぇ・・・。
一つ一つは小さい処理で、日時の整合性を確かめたりする程度なのですが、
何せ200-300、プロジェクトによってはもっと増える事もあるんですよね。
だから、作成者と保守者が別でもわかりやすいように、と色々考えてはいるのですが、
なかなか纏まらない感じです。

皆様、アドバイスありがとうございました。
2-3日、無い知恵絞って頑張ってみようと思います。

本当にありがとうございました。失礼します。

699 名前:y mailto:sage [2008/08/05(火) 23:09:40 ]
>>694

>private sub で200個を1つのモジュールに記載して、
>呼び出し用の sub で200個を call する事は問題が無いのか
私も、これ自体は問題ないように思います。
少し上のほうのレスに、再帰呼び出しの話題がありますが、
数百個ぐらいなら、たとえネスト呼び出ししても大丈夫です。
コードの長さについては、万が一どうしても収まらない事態になれば
別々の標準モジュールに分割してもいいでしょう。
その場合、各ロジックチェックはPublicスコープにする必要がありますが、それが
嫌であれば、クラスモジュールに書いてFriendスコープにしておく手もあります。
いずれにしても、取り返しのつかない結果になる心配はありません。
常に200のチェックを行い、カスタマイズの可能性も無いのであれば、
まず1つのモジュールに羅列しておくのがシンプルで良いかと。

>>695の >・Subではなくて、FunctionでBooleanを返したほうが良いのでは?
と同じことを考えていましたが、エラーログ出力部となるプロシージャをどのように
配置するかによって、2通りの構造が考えられます。
ロジカルチェックをFunctionで書いて、呼び出し元にエラーチェック結果を返し、
呼び出し元からエラーログ出力プロシージャを呼ぶのか、
あるいは、ロジカルチェックをSubで書いて、エラーが検出されたらそのSubから
エラーログ出力プロシージャを呼ぶのか。
単純に「エラーがあった、なかった」だけのレポートで済むのであれば、
Bool値を返すFunctionでいいと思いますが、「どのようなエラーなのか」まで
表現したい場合は、後者の方が都合がいいかもしれません。


700 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:12:36 ]
COM経由で呼べる組み込み言語ってないだろうか。
適当にJScriptインタプリタ起動できたりしないのだろうか。厳しいかな。

701 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:31:26 ]
ときどき 0& ってのを見るんだけど、これってどういう意味ですか?
If Len(buf) = 0& Then〜 みたいな感じです

702 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:37:33 ]
Long型の0



703 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:38:51 ]
ごめん うそ

704 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:45:50 ]
>>700
Microsoft Script Control

705 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 00:27:14 ]
>>704
thx!

706 名前:デフォルトの名無しさん [2008/08/06(水) 11:07:42 ]
範囲(行のみ下がる、列数data_nは同じ)が離れているセルの値を、その範囲だけ、二次元配列に格納したいです。

仮に範囲数が4つなら二次元配列は(4,data_n)

unionで範囲を結合しても3つまでしか結合できませんでした。

だから1つずつ範囲から値を配列に格納しようとしていますがうまくいきません。

どのように配列定義、範囲から二次元配列への格納をすればよいでしょうか?


707 名前:y mailto:sage [2008/08/06(水) 18:02:38 ]
>>706

>範囲数が4つなら、二次元配列(4, data_n)
という点から想像すると、それぞれの範囲は1行×data_n列のサイズになっている
ということですか?

まず配列の定義ですが、特に設定を変えない限り、配列の番号は0から始まるので、
(4, data_n) と定義すると、実際には 5 × (data_n + 1) 個分の配列が
準備されます。本当にそれでいいかどうか確認してください。

次に格納の仕方ですが、
>1つずつ範囲から値を配列に格納しようとしていますがうまくいきません。
この考え方でも大丈夫です。中途半端でも構わないので、
とりあえず書いたコードを貼ってみてください。


708 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 19:37:01 ]
春日部市1-2-3のような文字列の数字部分のみ半角に変換する方法を探していたら
次のようなマクロを見つけました。

Sub MacroR()
Dim idx As Integer, trg As Range
 Set trg = ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, xlTextValues)
 For idx = 0 To 9
  trg.Replace What:=Right(StrConv(Str(idx), vbWide), 1), Replacement:=Right(Str(idx), 1)
 Next
End Sub

ここでRight関数を使っているのは、Str関数だと先頭に符号が付くからですか?

これのReplaceの部分を
  trg.Replace What:=StrConv(CStr(idx), vbWide), Replacement:=idx
に変更すると同じ事が出来たのですが、これだと何か不都合が出たりしますか?

709 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 19:44:55 ]
変数のスコープについて教えてください。
全ての標準モジュールで使用出来る範囲を付与するには、
どの部分に、どのように宣言したらよろしいのでしょうか。

710 名前:y mailto:sage [2008/08/06(水) 20:06:42 ]
>>708
あなたのコードの方が良いように思います。
ReplacementのところはCstr(idx)にするとより丁寧です。


711 名前:y mailto:sage [2008/08/06(水) 20:11:16 ]
>>709
付属のヘルプで、
「Public ステートメント」
「Public ステートメントの使用例」
を検索してみてください。


712 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 00:01:04 ]
>>709
つりですか?



713 名前:デフォルトの名無しさん [2008/08/07(木) 09:47:54 ]
>>707
はい1×data_nです。

Dim data AS Variant

search=0
if 該当の行が見つかったら then
search=search+1


data(search) = range(cells(search,data_n),cells(search,data_n))

endif

複数行をまとめて配列に移したいのです。
unionでダメでした。
妥協するならせめて一行をまとめて移したい。
上記は妥協コードです。

714 名前:y mailto:sage [2008/08/07(木) 17:31:25 ]
>>713
やりたいことは、何となくわかりました。
・セルを上から一つ一つチェックして
・該当の行が見つかったら
・該当の行のデータを配列に書き込む
という流れですね。

2次元配列に含まれる、特定の一次元配列に対して、まとめて書き込みを
することはできません。
該当の行の値を一つ一つ書き込むことになります。

For i = 0 To data_n - 1
 data(search, i) = cells(該当の行 , i + 1)
Next

ちなみに、「該当の行が見つかったら」とありますが、
該当の行が全部で何行あるかは、あらかじめ分かるのですか。
それとも、見つかった数だけ配列のサイズを増減したいですか。


715 名前:デフォルトの名無しさん [2008/08/07(木) 19:52:23 ]
>>714
やりたいことはそうです。
data_nはあらかじめ与えられており、一定です。

配列に一行ずつ入れるのは無理なのですね。
では、見つかったセルを一気に写す方法はないでしょうか?
やはり
rng=union(rng,見つかった新たな行)
で最後に
配列にrngを代入したのですが、3行分しか入らなかったのです。

716 名前:デフォルトの名無しさん [2008/08/07(木) 20:08:25 ]
>>714
該当の行の数は決まってません。
1〜240個で変動します。


717 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 21:22:20 ]
最近、yって子が頑張ってるね
まだまだVBAというかプログラム言語を始めたばかりのようだが
質問に答えるために調べる、質問に答える為に考えるというのは
結構身になるものだから、これからも頑張ろう

718 名前:y mailto:sage [2008/08/07(木) 21:38:52 ]
>>715
Unionで結合されたRangeは、内部的にはコレクション(のようなもの)であり、
二次元配列ではないので、直接に代入はできません。全体が連続していれば、
二次元配列と解釈してくれるので代入は可能なのですが、この場合は各範囲が
離れています。3行分入ったのは、Unionされた各範囲のうち、先頭の範囲から
3行分が偶然連続していたためと思われます。

さて、Unionされた範囲を取得ところまではなさっているようですので、
そこからどうもっていくかについてです。上記の通り、全体を直接代入できないため、
ここでもやはり、一つ一つ値を格納していくことになります。

まずは、格納先となる配列のサイズを確定します。dataは動的配列で宣言しておき、
 Dim data() As Variant
ReDimステートメントを使ってサイズを確定します。
 Redim data(1 To 行数, 1 To 列数)
列数は、data_n となります。さて行数はどうなるでしょうか?
ヒント:rng.Countで、Unionされた範囲rngに何個のセルが含まれるかを取得できます。

>続きます

719 名前:y mailto:sage [2008/08/07(木) 21:40:46 ]
>>715 (続き)

続いて、格納するためのループです。For Each で、
rngに含まれる各セルを1つずつtmpに取り出し、
data(r, c)に代入します。
ここでrは二次元配列の行番号、cは列番号です。

Dim r as Long, c as Integer, tmp as Variant
r = 1: c = 1
For Each tmp In rng
 data(r, c) = tmp
 c = c + 1
 If ??? > data_n Then
  r = r + 1 
  c = 1
 End If
Next

???には何を入れればいいか、考えてみてください。

720 名前:y mailto:sage [2008/08/07(木) 22:24:41 ]
>>717
情報系の教育は受けたことはないのですが、
最近、人にVBAを教えなければならない立場になってしまい、
ありとあらゆる質問が投げられてくるこのスレで
修行させていただいています。
自分のレスを見直すために、簡単な名前をつけています。

2年ほど前は、私も>>706>>401のような質問をしていました。
その頃アドバイスしてくださった方々には大変お世話になりました。

721 名前:デフォルトの名無しさん [2008/08/07(木) 23:29:41 ]
>>719
???はc。

ありがとうございます。
やはり一つづつですか。
しかし、それだとCell毎にExcelにアクセスするので速度が遅くなるような気がします。

できないことがわかったので、代案としては

Dim data as Variant (一次元配列用)
Dim r as Variant   (二次元配列用)
'-------一行丸ごと配列格納
data = range(cells(search,data_n),cells(search,data_n))

そのあとrからdataへ
つまり一次元配列から二次元配列へ一気に代入する方法はないでしょうか?



722 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:27:34 ]
VBって、配列は弱いんでなかったっけ。
配列数指定しないといけないし。



723 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:39:34 ]
1回の格納ごとにredim preserveしていってもそこまで遅くは無い。
というか、あきらめるべき。

ちなみにredim preserveを減らそうがためにVectorみたいな
一度にアロケートする成長リスト形式にしても速くならなかった。

724 名前:デフォルトの名無しさん [2008/08/08(金) 00:46:27 ]
>>723
いや、Cellsを毎回使うことが遅くなるということで。。。
tmpに一気に代入されているという解釈になるのかな。。。
【参考】VBA高速化
ttp://officetanaka.net/excel/vba/speed/index.htm

725 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:49:48 ]
あ、ごめん 上レスぜんぜんみてなかった

726 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 01:39:10 ]
>>721
>しかし、それだとCell毎にExcelにアクセスするので速度が遅くなるような気がします。
おまえは馬鹿のクセに試しもせずに答えを求めるな
時間計って試してから出直して来い

727 名前:デフォルトの名無しさん [2008/08/08(金) 02:00:11 ]
セルがいくら多くてもシートやオートシェイプのオブジェクトをループする遅さに比べたら全然速い

728 名前:デフォルトの名無しさん [2008/08/08(金) 03:35:17 ]
セルを参照する数が多いと遅くなるよ。
だから範囲を全て配列に渡してから配列で演算するのが常套手段。


729 名前:デフォルトの名無しさん [2008/08/08(金) 03:37:08 ]
>>721>>716
>1〜240個で変動します。
つまりMAXで240×data_nのセル参照数となるから
data_nが50程度なら感じるほどに遅くなるよ。

730 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 05:46:25 ]
>>721
速度を気にするなら >>728の言う通り一度範囲を全て配列に渡してから処理する方がいい
例えばこんな感じ

Sub hoge()
 Const date_N As Integer = 50
 Dim Buf As Variant, Buf2 As Variant
 Dim iC As Integer, iC2 As Integer, X As Integer
 
 With Worksheets("Sheet1")
  Buf = .Range(.Cells(1, 1), .Cells(250, date_N)).Value
 End With
 
 X = 1
 ReDim Buf2(1 To date_N, 1 To X)
 For iC = 1 To 250
  If Buf(iC, 1) = "A" Then
   ReDim Preserve Buf2(1 To date_N, 1 To X)
   For iC2 = 1 To date_N
    Buf2(iC2, X) = Buf(iC, iC2)
   Next iC2
   X = X + 1
  End If
 Next iC
 
 ReDim Buf(1 To UBound(Buf2, 2), 1 To UBound(Buf2, 1))
 For iC = 1 To UBound(Buf, 1)
  For iC2 = 1 To UBound(Buf, 2)
   Buf(iC, iC2) = Buf2(iC2, iC)
  Next iC2
 Next iC
End Sub

731 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 10:47:54 ]
>>730
速度気にするなら無駄多すぎw

Sub hoge()
  Const DATA_N As Integer = 50
  Const DATA_ROW As Integer = 250
  Dim Buf As Variant
  Dim iC As Integer, iC2 As Integer, X As Integer

  Buf = Sheet1.Range("A1").Resize(DATA_ROW, DATA_N).Value

  For iC = 1 To DATA_ROW
    If Buf(iC, 1) = "A" Then
      X = X + 1
      For iC2 = 1 To DATA_N
        Buf(X, iC2) = Buf(iC, iC2)
      Next iC2
    End If
  Next iC

  Sheet1.Cells(DATA_ROW + 2, "A").Resize(X, DATA_N).Value = Buf
End Sub

732 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 13:32:19 ]
時間計るのに、ミリ秒まで計る方法ってある?



733 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 19:07:14 ]
API

734 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 20:55:33 ]
240個だけw

735 名前:y mailto:sage [2008/08/08(金) 21:05:51 ]
速さへの関心が高いようですね。計測用のマクロを書いて、計ってみましたよ。
あくまで向学心(というか興味本位)です。速さが全てではないはずなので、
あまり過敏に反応しないでくださいね。

>>718-719
85 milliSec

>>730
20 milliSec

>>731(セルへの書き込みの部分は含まない)
10 milliSec

タイムは、10回計った平均です。
準備したテストデータは、
250行×50列の範囲に、1行おきに該当行(1列目の値が"A")を配置してあります。
つまり、該当行は150行です。
>>731は、配列変数のサイズが最後まで250行のままである点など、厳密な比較ではありません。
でも、セルへの書き込み時に切り捨てるという解決の仕方がおもしろいですね。勉強になります。

ちなみに、ミリ秒単位の時刻を得るために、
ttp://members3.jcom.home.ne.jp/daruma_kyo/info/getMilliSec.html
で公開されているモジュールを利用しています。

736 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 21:18:00 ]
>>731
速度気にしてるつもりなのに無駄多すぎ

> Const DATA_N As Integer = 50
数値型、文字列型の定数で型指定するな

> Dim iC As Integer, iC2 As Integer, X As Integer
カウンタはIntegerで桁が足りてもLong使え

> Range("A1")
文字列での参照ではなくCells(1,1)とインデックス参照しろ

> Cells(DATA_ROW + 2, "A")
こちらも同じく "A" ではなく 1 で


っていうかこの話、配列クラス自作しちゃった方が早い気がする
無駄に注文多くて我が侭なのに、デフォで用意されてる配列でどうにかしようってのが間違いだろ

737 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 21:18:52 ]
ExcelVBAでやる時点で間違っている

738 名前:デフォルトの名無しさん [2008/08/08(金) 21:23:40 ]
今のPCなら数百のシートを操作してもそんなにストレス感じないのに
msecオーダーで速度求めるならC++で書けよなと思った。

739 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 21:51:05 ]
正直言って、VBAは速度気にしないで使えるのが気楽で良い。
VBAだしぃー。ってのが免罪符になる。

本当に商用プログラムを作るならばVBAでやる事が前提からして間違い。
マシンパワーに余裕が出てきた今だからこそ、速度は敢えて気にしない。

と言っても、cells選択したり、表示速度が極端に遅くなるのは論外ね。


740 名前:デフォルトの名無しさん [2008/08/08(金) 21:51:07 ]
ちなみにC++で書いたことあるけどそんなに劇的には速くならないけど

741 名前:y mailto:sage [2008/08/08(金) 21:57:21 ]
>>736
>文字列での参照ではなくCells(1,1)とインデックス参照しろ
おー、ほんのちょっと速くなった。
>カウンタはIntegerで桁が足りてもLong使え
Longにしてみたら、やはりちょっと遅くなるんですね。

>>737-738
すみません、つい出来心でやってしまいました。
「自分が提案したコードって、実はやたらと遅いの?」と思って確かめたかっただけです。
個人的には85milliSecで完了できれば充分じゃないかと思いますが...

>>739
ですよねー

>>721
ということでした。「一次元配列から二次元配列へ一気に代入する方法」ですが、やはり
「一気に」は無理です。そのかわり、いろんな別解やアドバイスが出てきて勉強になりましたね。
条件文は c で大正解です。これからも頑張ってください。

742 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:01:24 ]
VBAでいろいろ書いて「これおっそいだろうなー」って思っても
たいがい人間の認識できる速さのプランク長ぐらいで終わってしまう。驚き



743 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:14:00 ]
ただあれだ。
ページの表示設定を印刷モードだっけか。あれにしてVBA走らせるとむちゃ処理重いな。
screenupdate falseにすりゃ良いんだけど。

あと覚えてるのだと、cells.autofitがむちゃ重い。
その狂ったマクロ作った奴は、流石にクレーム食らってた。

744 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:22:45 ]
FSOでネットワーク上のディレクトリ走査するのをExcel関数にして羅列してもなかなか遅くできる。

745 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 00:51:16 ]
データの多いシートのAutoFitoはやばいぞ、VBAじゃなくても普通に遅い

746 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 09:43:06 ]
質問です。 マクロでPCのシャットダウンはできるのでしょうか? 出来たら、やり方を教えてください
あと、MsgBoxをのバックを画像にすることは出来ますか?

Windows98
Office2000
マクロ初めてまだ間もないです

747 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 09:50:31 ]
>>746
>Windows98
そんな過去の遺物を使うのはやめなさい。

>マクロでPCのシャットダウンはできるのでしょうか?
WinAPIを使えばできるはずですが。

>あと、MsgBoxをのバックを画像にすることは出来ますか?
日本語でOK。

748 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:58:21 ]
>>746
API


749 名前:746 mailto:sage [2008/08/09(土) 13:43:59 ]
>>747

メッセージボックスの背景を画像にしたいのですが、できますか?


よろしかったらマクロのやり方を教えてください。

750 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:37:09 ]
>よろしかったらマクロのやり方を教えてください。
WinAPIを呼ぶだけです。それについては、>1の★4に該当するので教えられません。

>メッセージボックスの背景を画像にしたいのですが、できますか?
そんなことをするよりも、画像を貼ったユーザフォームを用意した方が早いと思います。

751 名前:デフォルトの名無しさん [2008/08/09(土) 22:49:35 ]
エスセルVBAがすきだたですが

752 名前:746 mailto:sage [2008/08/10(日) 03:48:25 ]
>>750
ユーザーフォームでやってみました。 うまく出来ました。

もうひとつお聞きしたいことが、
ボタンを押すとユーザーフォームが出るようにしたのですが、いくつものユーザーフォームを作り、ボタンを押したら、
ランダムでユーザーフォームを表示することは出来ますか?




753 名前:デフォルトの名無しさん [2008/08/10(日) 07:10:45 ]
>>626 等でグラフ補完を質問したものです。
そのときの回答>>629をヒントに
いらない部分の線を消すことで解決しました。
しかしExcel2003で開発していたのですが、
Excel2003では異なった場所の線が消えていました。

他のバージョンでも同様の結果を出すためにはどうすればよいでしょうか?

754 名前:デフォルトの名無しさん [2008/08/10(日) 08:26:21 ]
シートに写真を複数枚挿入し、そのサイズ変更を一括で行うにはどうすればいいですか?
シートには写真以外の図形オブジェクトもあり、それらは選択も変更もしません。

jpgだけを複数選択やワイルドカードなど使えるのでしょうか?
  1枚だけマクロ記録するとこうなります。
ActiveSheet.Shapes("Picture 1").Select
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = 150.75
Selection.ShapeRange.Width = 201#

755 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 09:23:27 ]
>>754
for each

756 名前:y mailto:sage [2008/08/10(日) 12:04:40 ]
>>753
線分を消す部分のコードだけで構わないので、あなたが書いたものを貼ってください。
それに加えて、何番目の点と何番目の点の間の線分を消すつもりだったのかと、
その意に反して、どの線分が消えてしまったのかも書いてください。


757 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:00:09 ]
ぬるぽですか

758 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:07:35 ]
y消えろ

759 名前:デフォルトの名無しさん [2008/08/10(日) 13:39:51 ]
>>753
訂正します。
>しかしExcel2003で開発していたのですが、
>Excel2003では異なった場所の線が消えていました。
Excel2003で開発してExcel2002では異なる結果でした。

Excel2003でコード実行し計算した結果グラフをファイルに保存し、
それをExcel2002で見るだけで異なる線が消えている。。。
またExcel2002で見た(異なる線が消えている)グラフを、再度Excel2003で見ると正常になる。

どうもグラフの順番のつけ方?の定義のようなものが異なるのではという感じがします。
コードのせいではないと思います。

しかしコレでは駄目なので。。。うーん悩ましい。


760 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:16:36 ]
本人に悪気はないんだろうけど、コテハン使うなら、
他の人がせっかく答えてるのに、被せて回答するのはやめた方が良い。

他の答えてる人の面目丸潰れだよ。
んでみんな答える気が失せて行く。

761 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:22:20 ]
本人を特定できるコテつけて発言してるなら別だが
名無しで面目もないもんだ

762 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:34:27 ]
IDもでないしね



763 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 17:29:45 ]
>>760
こういう手法もある、とか提示してくれる分にはいいんでない?
セオリーや最短の方法イコール最善の方法、になるとは限らないし
傍目でROMってる人のレベルにうまくマッチする場合もあるしね

764 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:16:42 ]
勉強のために答えてるんだから大目に見てやれよ
それに他の人の面目が潰れるほどの良回答はまだまだ出来てないじゃん
彼に面目潰されるようじゃ、潰された方がレベル低すぎってものだ

765 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 20:41:50 ]
マターリやりましょ。
しかし最近は外部関数呼ぶ話が増えてきましたな。


766 名前:y mailto:sage [2008/08/10(日) 21:14:24 ]
>>759
そうなんですか。失礼しました。
うちには2003しかないので、残念ながらその状況を再現できません。
2002のほうで、2003で実行したのと同じコードを実行するとどうなりますか?
やはり2003とは異なる線分が消えてしまいますか?

グラフの書式の仕様というと、Excel的にはとても大切なところなはずなので、
バージョン間でそう簡単に定義が変わるとは思えないのですが...

767 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:23:48 ]
>>759
一度2002でもマクロの記録でやってみれば
それでコードの問題かわかるだろ

768 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 01:13:09 ]
TMR!TMR!

769 名前:デフォルトの名無しさん [2008/08/11(月) 09:02:55 ]
>>767
2002はもっていないんです。
使用者からのバグ報告なので。

770 名前:y mailto:sage [2008/08/11(月) 19:08:16 ]
>>769
2002で試せないなら、残念ですが私はもうお手上げです...

771 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 19:36:35 ]
VBAと関係ない話なんでスルーしてもらって構わないんだけどさ。すごく気になったんで。

バージョンが多数存在するソフトの場合、金取って受注するならば、
可能な限り古いバージョンまで持っておかないとダメだよ。

金取って作業するならば、鉄則なんで。

772 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 19:42:22 ]
Windows95サポートですね、判ります。



773 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:22:25 ]
OSって意味じゃない。

774 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:52:48 ]
> バージョンが多数存在するソフトの場合、金取って受注するならば、
> 可能な限り古いバージョンまで持っておかないとダメだよ。
そんなことは無い
クライアントの発注要項に対応できるバージョンが揃ってれば問題ない
逆に考えれば、所有する環境で対応出来ない要項の発注は受けなければ良いだけ

プログラムに限った話じゃないが、自分(自社)に何が出来て何が出来ないのかを把握して
それに見合った受注をすれば良い、これこそが鉄則
設備、環境、能力以上の受注をしてしまうのは愚の骨頂だが、
何でもかんでも揃えようとするのもまた愚かしくある

もちろん、事業拡大、売上向上の為には良い設備環境を整えるというのは大事だが
「可能な限り古いバージョンまで持っておかない」と、金取っての受注が一切出来ないわけでもないし
「可能な限り古いバージョンまで持っておく」ことが、金取って受注する上での鉄則でもない

それと、VBAの場合はOSも関係有るよ
Office(Excel)自体もOSのコンポーネント使ってるし、VBAからはCOM、Win32API、OCXなど
様々なOSのコンポーネントを任意で呼び出せる
故に、当然ながらOffice(Excel)のバージョンが同じでも、OSが変われば結果も変わることがある
場合によってはOSのSPが変わっただけでも影響があるくらいだからな

775 名前:デフォルトの名無しさん [2008/08/11(月) 23:33:16 ]
別bookの「ホゲ.xls」が開いてればそれをアクティブに、開いてなければ開くというコードを教えてください。

776 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 23:45:03 ]
>>775
Sub activate_forcefully_hoge()
On Error GoTo hoge_is_none
Dim hogePath$: hogePath = "C:\hoge.xls" ' ホゲ.xlsのパス
Dim hogeFileName$: hogeFileName = "hoge.xls" 'ホゲ.xlsのファイル名
Dim activated As Workbook
Set activated = Workbooks(hogeFileName)
GoTo activation
hoge_is_none:
Set activated = Workbooks.Open(hogePath)
activation:
activated.Activate
End Sub


777 名前:775 mailto:sage [2008/08/12(火) 00:00:21 ]
>>776
ありがたいけど・・・わかりやすくダイレクトに
if Workbookなんたらこうたら("ホゲ.xls")がない then Workbooks.Open Filename:= "ホゲ.xls"
という形で出来ませんでしょうか?
if のあとのいいメソッドかなんか無いですか?


778 名前:775 mailto:sage [2008/08/12(火) 00:11:32 ]
On Error GoTo hoge_is_none
Windows("ホゲ.xls").Activate
hoge_is_none:
Workbooks.Open Filename:= "ホゲ.xls"
Windows("ホゲ.xls").Activate
これでうまくいきました、ありがとう

779 名前:デフォルトの名無しさん [2008/08/12(火) 15:40:13 ]
VBAに詳しい方お願いします。


 A列 B列 C列 D列 E列 F列 G列 H列 I列 J列…
1  1 010  a   AB
2  1 010  a      春  夏  秋  冬
3  1 010  a      上  下
4  2 020  b   BC
5  2 020  b      花
6  2 020  b      陸  空
6  2 020  b      水

:
:
↑を↓に変える記述教えてください。。

 A列 B列 C列 D列 E列 F列 G列 H列 I列 J列… 
1  1 010  a   AB
2  1 010  a      春 
3  1 010  a      夏
4  1 010  a      秋
5  1 010  a      冬
6  1 010  a      上
7  1 010  a      下
8  2 020  b   BC
9  2 020  b      花
10  2 020  b      陸  
11  2 020  b      空
6  2 020  b      水
:
:


780 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 15:46:55 ]
>>779
いいか。マクロの記録ってやつを使うんだ。
んで、並び替えしてみればほぼ再利用可能なコードが出来るはずだ。

781 名前:デフォルトの名無しさん [2008/08/12(火) 16:52:19 ]
マクロの記録をしてからができないんです。。
ifとかDo Whileとか、、、

E1に値が入っていないのでカーソルを下に移動(E2へ移動)
 E2に値が入っているのでカーソルを右に移動(F2へ移動)
 F2に値が入っているので下(3行目)に新しい行を挿入し、(A2,B2,C2) を コピーして、(A3,B3,C3)に貼り付け、F2を切り取りE3に貼り付け る
 これをF2、G2、H2と繰り返してI2で空欄が出るまで続ける。
E8に値が入っていないのでカーソルを下に移動(E9へ移動)


  って感じにしたいんです(TT)

782 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 18:01:50 ]
最近勉強し始めたばかりなので
初歩的な質問かもしれませんが
ヒントください。

オートフィルタの抽出で
If A.Value = True Then
Sheets("○○○").Select
Range("A1").AutoFilter Field:=8, _
Criteria1:="*" & A.Value & "*"
End If
というコードを作ったのですが
フィルタがうまくかかりません。
(A.valueはユーザーフォームのテキストボックスです)
Aにいれるテキストが全角かな文字であるがために
プログラムが反映されてないのではと思うのですが
A.valueをA.Textにするとエラーがでます。
(A.text = true というのが無理っぽいです)
解決策があれば教えていただけないでしょうか。
よろしくお願いします。



783 名前:y mailto:sage [2008/08/12(火) 20:28:12 ]
>>782
If の条件式についてですが、
「テキストボックスAに、何か文字が入っていれば抽出を行う」
という意図ですか。そういうことであれば、

If A.Value <> "" Then

にするといいでしょう。


784 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:07:42 ]
>>779
質問にやさしく親切に答えてくれるスレ 3
pc11.2ch.net/test/read.cgi/tech/1167125332/886
なんだ、マルチか。

785 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:25:02 ]
>>783 ありがとうございます!!!
うまくいきました!!
2〜3日ずっと悩んでいたので本当に感謝!!
ありがとうございましたm(_ _)m

786 名前:y mailto:sage [2008/08/12(火) 21:28:33 ]
>>779

Dim r As Long, c As Integer, cc As Integer, dr As Long, dt As Variant, rNum As Long
rNum = WorksheetFunction.CountIf(Range("D:IV"), "<>")
ReDim dt(1 To rNum, 1 To 5)
r = 1: dr = 1
Do While Cells(r, 1) <> ""
 If Cells(r, 4) <> "" Then
  For c = 1 To 4
   dt(dr, c) = Cells(r, c)
  Next
  dr = dr + 1
 ElseIf Cells(r, 5) <> "" Then
  c = 5
  Do While Cells(r, c) <> ""
   For cc = 1 To 4
    dt(dr, cc) = Cells(r, cc)
   Next
   dt(dr, 5) = Cells(r, c)
   c = c + 1
   dr = dr + 1
  Loop
 End If
 r = r + 1
Loop
With ThisWorkbook.Sheets.Add
 .Range(.Cells(1, 1), .Cells(1, 1).Offset(rNum - 1, 4)) = dt
End With

もっと効率的な方法で書ける方もおられると思いますが...
それと、マルチ(複数のスレッドで同じ質問をすること)はしないようにしてくださいね。


787 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:12:20 ]
どなたかプログラマ向けの難しめのVBAの書籍(洋書でも可)を御存知ないでしょうか。
Excel Hacksとかではなく、VBAやらCOMとの絡みなど詳細な事項などが書いてあると嬉しいです。

いざ勉強しても何か心許ない感じになってくるので、
Oreilly的な本を一冊読んできちんと理解しだいです。
御存知でしたら、助言お願いします。

788 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:46:38 ]
y大人だなぁ

789 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:11:46 ]
COMってのは不特定多数が制作しているものだから
MSが作ったCOM以外を書籍で解説することはまず無いし
MSが作ったCOMに関してならMSDNにも情報がある

そしてExcel VBAに関しては、>>1★3にも有るとおり
Excelの操作をGUIではなく言語でやってるだけであり
突き詰めたところでそう難しいものでも無い
その先を行きたいならVBAではなくVBの範疇になるので
VBの書籍を買え

790 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 02:00:39 ]
>>789
すみませんが、VBでもいいので、
VB6互換の環境について、書籍を御存知ないですか?

791 名前:デフォルトの名無しさん [2008/08/13(水) 02:37:31 ]
vb6ってたとえば関数のオーバーロードとかクラスのインヘリットとかがない等、
C++とかに比べて言語仕様自体に機能が多いわけじゃないから、アルゴリズムさえ
コードにできればリファレンス読むだけで十分な言語なんですよね?
高度な書籍っていっても結局vb6の機能をフルに活用して何が出来るかとかいう書籍がほしい
んだったら、結局vb6からAPIやCOM使ってなんかするサンプルコードなんかが沢山載ってる本
をほしいって事と同じようなものだと思うから、結局vbの枠で書籍を探すよりも、むしろ
COMの本買うとか、めんどくさいからvbやめて別の言語に手を出して、C++詳説の本買うとか
しないといけないんじゃないかなぁと思うんですが。どうなの?


792 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 02:47:33 ]
とりあえずここらへんにしておこうかな
www.amazon.com/Advanced-Visual-Basic-Techniques-DevelopMentor/dp/0201707128/
www.amazon.com/Programming-Microsoft-Visual-Basic-6-0/dp/0735605580

>>791
言語仕様自体はあまり明確じゃない言語だと思います。
クラスのインヘリタンスはあるにはありますね。ひ弱ですが。

古い言語のせいか、Webにある資料もいまいちどうもパッとしないのです。
C++はまあ別にどうでもよいので(知っているので)、
COMに?興味が出たらCOMの本買うと思います。若干時代に逆行していますが。

私としてはVB6/VBAのバイブルみたいなものを探していたところです。
一応、上記の本読んでみることにします。



793 名前:792 mailto:sage [2008/08/13(水) 02:48:23 ]
古い言語といっても、まあ、新しいわけだけれど、
陳腐化したといったほうがよかったかな。

>>791さん、お付き合いありがとうございました。

794 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 06:49:43 ]
VBA上級テクニック なんちゃらって本があったな。
API関数やVBSの呼び出し方が解説してあってよかったかも。
ただ、具体的なAPI関数についての説明なんかは当然なし。

当時、具体的な呼び出し方が説明してあるのは役に立った記憶があるよ。
あと、何で変数の型が必要か、とかrangeの概念なんかも詳しく説明してあった。
それまで全部variantで使ってた変数の型も、きっちり宣言出来るようになったし、
何となく使ってたfor eachも、何がどう動いてるのかが理解出来たよ。


795 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 08:14:00 ]
Range以外は全てVB6分野の話だな

796 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 08:58:00 ]
InputBoxを使った入力について教えてください。
セルのコメントをInputBox関数で入力させるマクロを組んでいます。
この入力値を、任意の箇所で改行したいのですが、できますか?
可能な場合、InputBox関数で呼び出される入力ダイアログボックス
にはどのように入力すれば良いのでしょうか?
ご教示お願いします。

797 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 09:34:30 ]
どうしてもInputBox使いたいなら、任意の文字列を改行として扱うしか無いかな

Dim strTemp As String
strTemp = InputBox("改行したい部分に\nを入れてください。", , "1行目\n2行目\n\n4行目")
strTemp = Replace(strTemp, "\n", vbCrLf)
MsgBox strTemp

改行扱い文字列は、別に\nじゃなくても本文中に出現しないものなら何でも良い


でも、ユーザーフォームで複数行入力できるダイアログを作るのが正攻法だろ

798 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:07:04 ]
できました。Replaceすればいいのですね。
ありがとうございました。

799 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:30:48 ]
Aというシートからユーザーフォームのテキストボックス(10個ぐらいある)
に入力された内容に従ってデータを抽出して
既存のBシートに貼り付けるような比較的長いコードを作りました。

最終的には、もしユーザーフォームの
「新規シートを作成して貼り付け」という
チェックボックスにチェックが入っていた場合は
Cシートを新たに作成し、そこにデータを貼り付け
さらにDシート・・Eシートとシートを増やせるようにしたいと
思っています。
その場合は
現在作ってある長いコードを使って
if checkbox1 = true then
 worksheets.add
「新しいシートに貼り付けてね」という長いコード
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
else 「シートBに貼り付けてね」という長いコード

end if
という風に、指定するシートを変えるだけで
ほとんど同じコードを2回記述するしか方法はないでしょうか??
もっと完結にできる方法があれば教えてください。
モジュールがやたら長くなって見にくくなってしまうのを回避したいです。





800 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:30:00 ]
>>799
共通する部分の処理でプロシージャを作り
Callで呼べばいい

801 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:50:00 ]
>>800 ありがとうございます!!
さっそく試してみます。

ステートメントを早くいろいろ覚えないと
後で「こんなステートメントあったんだ!じゃぁあの時
もっと簡単にプログラムできたじゃん!」って思うことが多いです(;;
もっとよく勉強します。
本当にありがとうございました。

802 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:55:04 ]
>>801
>後で「こんなステートメントあったんだ!じゃぁあの時
>もっと簡単にプログラムできたじゃん!」って思うことが多いです(;;

それが糧になるんだよ。決して無駄にはならないさ。
# 仕事なら話は別だが。



803 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:48:11 ]
アクティブシート上にあるすべてのボタンを消去するのって
ActiveSheet.Buttons.Delete
じゃ駄目なんですか?
いくら実行しても何も起こらないんですが。

804 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:58:14 ]
画面に向かって「消えろー」って10回叫べば消えるかも

805 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:13:52 ]
for each

806 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:27:47 ]
>>803
゙ボタン゙と言っているのはオートシェイプ?マクロ用のボタン(名前忘れた)?

807 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:53:50 ]
>>806
オートシェイプです。

すいません、今調べたら
ActiveSheet.DrawingObjects.Delete
という命令でシート上のボタンはすべて消せることがわかりました。

追加で質問なんですが、一行目に配置されたボタンだけを残し、二行目以降のボタンをすべて消去する方法ってありますか?


808 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:07:36 ]
>>807
プログラム化するならわからんが、オブジェクトの選択(矢印の付いたアイコン)
で範囲選択したら、その領域内に含まれる図形は全て選択できるからデリートで消す

809 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:24:34 ]
>>808
デリートでセルを消してもそのセル上のボタンは幅が0になるだけで線になって残りません?
完全に消去する方法が知りたいのですが。

810 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:48:34 ]
>>809
セルの行削除・列削除では消えませんよ。
図形描画のツールバーを出して、オブジェクト選択のボタンを使うべし。

811 名前:デフォルトの名無しさん [2008/08/14(木) 14:23:44 ]
1行1件のデータシートがあります。
顧客 製品 台数
A あ 1
A あ 1
B あ 1
B あ 1
B い 1

これの顧客Bだけ範囲選択して
B あ 2
B い 1  という結果を別シートに出したいのです。
・選択1行目をコピー貼り付け
・2行目以降、前回顧客と製品名が一致したら台数インクリメント
・Activecell.Rows.Count数だけループ
という方法でなくもっといいのはありますか?


812 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:16:40 ]
CountIf



813 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:52:52 ]
>>811
ピボットテーブル知ってる?

814 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:17:46 ]
>>811
オートフィルタの抽出を別場所にする

815 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:22:52 ]
>>811
おいらならオートフィルタで指定の顧客名を抽出して、
if (cells(i,2).value = cells(i+1,2).value) daisu++}
ってインクリメントするかな。


816 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:24:49 ]
すいません。文法間違えました。
javascriptとしても間違えております・・・比較演算子違うし。

if cells(i,2).value = cells(i+1,2).value then
daisu = daisu + 1
end if

でした。本当に申し訳ない。

817 名前:811 mailto:sage [2008/08/14(木) 18:32:04 ]
目的は別シートに貼り付けるため、なのです。
全体を集計するのであればピボットで済みますが、そうではなく
必要な部分だけ抜き取って(項目も無し)それだけ集計して貼り付けたいのです。

手作業ではコピー、貼り付けしたあと、台数を修正して余計な行を削除
なんですがこれを自動化したいだけです。
標準の集計やピボットを利用するには、項目行もコピーしてシートも新しくせねばならず
また、完成した集計表では顧客名や製品名に勝手に空欄が出来てしまうので
使いたい形に修正するだけで作業が余計に感じます。

818 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:35:25 ]
これはマクロの記録で十分対応できるレベルだろ

819 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:52:49 ]
・選択部分を新しいシートにコピペ
・製品を軸に昇順に並べ替え
・製品名が変わるまでloop、んでカウント
・一番上の台数に代入
・代入した行にフラグ
・フラグ立てた行以外削除

こんな感じ?その情報でやるなら。
操作者が範囲を選択する時点で、選択ミスの可能性があるから、俺ならやらん。

きっと製品名は凄い沢山あるんだろうね。VBAスレで聞くって事は。

820 名前:y mailto:sage [2008/08/14(木) 21:33:06 ]
>>817
うーん。ピボットテーブルはなるべく敬遠したいとのことですが、
必要な部分だけ抜き取ったり、ある項目だけの台数を合計したり、というのは
やはりピボットテーブルが本領を発揮する場面だと思うんですね。
「項目行もコピーしてシートも新しくせねばならず」とありますが、
ひとつピボットテーブルを作ってしまえば、あとはその設定を変えながら
運用すればいいわけです。
VBAでピボットテーブルも操作できることはご存知ですよね?
抜き出したい顧客に合わせてピボットテーブルの抽出アイテムを変えたり、
抽出結果を任意の別シートに貼り付けたりするような、手作業では
面倒な部分をVBAで自動化すればいいと思うんです。
全体をVBAで実現するやり方で考えていらっしゃる方もおられるので、
そちらも検討した上で、もう1つの考え方として受け取ってください。


821 名前:y mailto:sage [2008/08/14(木) 21:43:08 ]
ピボットテーブルで処理する例です。

Sub ch_pivot()
Dim item As PivotItem, kName As String
kName = InputBox("顧客名を入力してください")
With Sheets("Sheet2")
With .PivotTables("ピボットテーブル1")
.PivotCache.Refresh
.PivotFields("顧客").PivotItems(kName).Visible = True
For Each item In .PivotFields("顧客").PivotItems
If item.Name <> kName Then item.Visible = False
Next
End With
Range(.Cells(5, 1), .Cells(.Rows.Count, 3).End(xlUp)).Copy _
Destination:=Application.InputBox("貼り付け先を指定してください", Type:=8)
End With
End Sub

822 名前:y mailto:sage [2008/08/14(木) 21:46:09 ]
>>822のコードは、次のような前提で動作します。
(下のように設定されていないと動作しません)

○データシート
>>811のデータは"Sheet1"という名前のワークシートにおかれているとする。

○ユーザー定義の名前
・任意の名前(ここでは"pivotSource")を定義する。参照範囲は次のようにする。
 =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),3)

○ピボットテーブル
・使用するデータの範囲を"pivotSource"とする
・レイアウトは行に"顧客"と"製品"。データに"台数"(集計方法は合計)。
・名前は"ピボットテーブル1"
・配置する場所は"Sheet2"という名前のワークシートの$A$3。
・顧客ごとの集計を非表示に
・列の総計を非表示に




823 名前:y mailto:sage [2008/08/14(木) 21:59:43 ]
すみません。「>>822のコード」→「>>821のコード」の間違いです。
あとピボットテーブルはピボットテーブルウィザードなどを利用して
自分で設置してください。(セル範囲の名前の定義も自分で。)


824 名前:デフォルトの名無しさん [2008/08/14(木) 22:49:18 ]
グラフを複数作成しようとしていますが、速度が10秒/1グラフと遅く
特に書式設定が速度的に遅いと感じます。

書式、データ数は同じで、データ内容だけ異なります。
グラフはチャート毎に1シートに描いているものです。
(埋め込みグラフじゃないほう?)

グラフの雛形的なものを使って複数グラフを作成し、
少しでも高速化したいと考えています。

実施したのですがデータの設定の順番が異なるのか、うまくいきません。
何かグラフコピーペーストのセオリーのようなものがあれば教えてください。


825 名前:デフォルトの名無しさん [2008/08/14(木) 23:26:51 ]
>>824
screenupdate=Falseは既に実施しております。

826 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 00:29:15 ]
データの数とグラフの数が多いと遅くなると思いますよ。
オブジェクト数が多いとExcelの動作が劇的に重くなるのは仕様なのかな?
グラフ1つ作成するのに10秒かかるんだったらマクロの記録でグラフ作成するコード作って
比較してみればいいんじゃないですか?

827 名前:デフォルトの名無しさん [2008/08/15(金) 05:25:40 ]
>>826
マクロの記録を参考に、いらない部分を削り、作成しました。
それで遅いので、複数グラフ作成で速くする方法はないかと考えました。


828 名前:デフォルトの名無しさん [2008/08/15(金) 05:45:16 ]
質問があります。
正方行列(2×2)を一行(1×4)で表したとき、関数で配列(2×2)を作り、
さらにこの配列を関数で計算する方法が分かりません。例えば
1 2
3 4
の行列をエクセルシート上でA1:D1に1,2,3,4と入力したとき
=test(A1:D1)として配列(2×2)を作ります。

Function test(data As Range)
Dim A(1, 1) As Double
k = 1
For i = 1 To 2
For j = 1 To 2
k = k + 1
A(i - 1, j - 1) = data(k - 1)
Next
Next
test = A
End Function

このとき行列式(=1*4-2*3)を計算するため
=determ(test(A1:D1))とすると、#VALUE!となって困ってます。

Function determ(B As Double)
determ = B(0, 0) * B(1, 1) - B(0, 1) * B(1, 0)
End Function

いろいろ試してみたのですが、どうも配列の扱いがよく分からなくて。
XP Excel2003ですがよろしくお願いします。

829 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 07:13:14 ]
第一要因
 determ関数の引数が配列ではない
 配列を引数に取る場合は
 B() As Double
 のように、配列変数の後ろに () を付けなければならない

第二要因
 引数の型が合ってない
 配列を返す関数では、関数内で型を指定していても
 返される値はVariant型の配列となる

第三要因
 配列の要素数が合ってない
 シート上には0行目0列目が無いので、
 配列(1, 1) つまりは 配列(0 To 1, 0 To 1)
 を関数の結果として返すと、自動的に
 配列(1 To 2, 1 To 2)
 のように下限要素が0から1に変換される

以上を踏まえてdetermの方を
Function determ(B() As Variant)
  determ = B(1, 1) * B(2, 2) - B(1, 2) * B(2, 1)
End Function
とすれば動くと思う

ところで、>>828の例は質問用に簡素化しただけで、実際は配列要素数を決め打ちではなく精査してるよね?
あと、A(i - 1, j - 1) = data(k - 1) で、全部 -1 やってるのは何か意味有るの?

830 名前:828 [2008/08/15(金) 07:54:20 ]
>>829
早速ありがトン
急いで試してみたけど、なんかうまくいかない...

全部-1にしてるのは、配列は0から始まるって教わったので。
お察しの通り、本とは大きい行列なので、簡略化したんだけど。
=test(A1:D1)で配列をシートで見たけど合ってた。

ちょっとこれから会社なので、夜にまた試してみるよ。

831 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 08:53:51 ]
最低限、君が書いた例通り、A1:D1に1,2,3,4と入れて
=determ(test(A1:D1))
とする分には問題なく動く
上手く行かないとすれば、実際のコードに適応する上で君が何か間違ってるからだろう

あと、0から始まるのはそうなんだが、
For i = 1 To 2
For j = 1 To 2
k = k + 1
A(i - 1, j - 1) = data(k - 1)

For i = 0 To 1 '<- 1〜2ではなく0〜1
For j = 0 To 1
A(i, j) = data(k)
k = k + 1 '<- 変数kのインクリメントを後回しに
とすれば、3カ所の -1 は不要なんだが、何故わざわざi,j,kに1多い数を入れて -1 してるのかなぁと

832 名前:デフォルトの名無しさん [2008/08/15(金) 12:57:16 ]
Excelでタブを作るのは無理ですか?



833 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 14:24:13 ]
へるぷみー。
テキストボックスに入力された名前を
新規のワークシートに付ける際に、例えば「あいうえお」という
名前のシートが既にあるにもかかわらず
テキストボックスに「あいうえお」と書かれた場合は
自動で「あいうえお1」次にまた「あいうえお」と入力されてしまった場合は
「あいうえお2」になるようにしたいと思い、
下記のようなコードを入力してみました。
(sheetnameがテキストボックスのオブジェクト名です)
Dim i As Integer, cnt As Integer, n As Integer
cnt = Worksheets.Count
n = 1
If CheckBox.Value = True Then
For i = 1 To cnt
Do Until sheetname.Value <> Worksheets(i).Name
sheetname.Value = sheetname.Value & n
n = n + 1
Loop
Next i
Worksheets.Add after:=Worksheets(cnt)
ActiveSheet.Name = sheetname.Value
End if

このコードだと
「あいうえお」→「あいうえお1」→「あいうえお11」
→「あいうえお111」
という風になってしまいました。
できるシリーズの本とかで調べたりWeb検索してみたりしたのですが
解決策が見つかりませんでした。
よろしくお願いします。

834 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:52:13 ]
>>833
どこがVBAの質問なんだか。単純な名前生成の問題じゃないか。
毎回シート名に"n"を継ぎ足すんじゃなくて、都度入力された名前に"n"を継ぎ足せばいいだろ。
オブジェクト変数を使いまわすんじゃなくて、一時変数で処理する癖をつけた方がいいな。

835 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 17:07:40 ]
>>832
何のタブかわからんが、ブックのタブならツールバーで作る手がある

836 名前:デフォルトの名無しさん [2008/08/15(金) 18:48:16 ]
>>832
ユーザーフォームでタブを云々ならマルチページなりタブストリップなりをコントロールから追加

837 名前:デフォルトの名無しさん [2008/08/15(金) 19:03:27 ]
ひとつのシートに複数のタブブラウザーみたいなのを作りたいと思っています。

838 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 19:27:20 ]
複数のシートにしちゃいけないの?

839 名前:デフォルトの名無しさん [2008/08/15(金) 20:10:50 ]
ひとつのシートに複数のタブじゃないとダメなんです。できませんかねぇ。

840 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 20:16:54 ]
わざわざシートタブがあるのにそれを使わずに更にタブをつける理由も抜きに、「できませんかねぇ」じゃねぇよ。

841 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 20:19:42 ]
やろうとすれば出来るけど面倒

842 名前:828 [2008/08/15(金) 20:21:18 ]
>>831
たびたびありがとー

朝はバタバタしててできなかったけど解決しますた^^
ご指摘のとおりにFor文は0〜1にした方がすっきりしますね。

教科書とか読むとほとんど1〜だったのでなんか理由があるのかと
なんとなくこうしてました。

これで行列のいろんな演算ができそうです。
感謝、感謝



843 名前:デフォルトの名無しさん [2008/08/15(金) 20:38:15 ]
ひとつのシートにタブを複数にする理由は本当はプログラムを組んでPOSシステムみたいなものを作りたいのですが知識がなく、それをExcelでと考えています。面倒でも構いませんから教えていただきたいです。

844 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 20:43:01 ]
>>843
道具には向き不向きというものがあるよ

845 名前:デフォルトの名無しさん [2008/08/15(金) 21:33:42 ]
>>842
配列についてはExcel VBAのヘルプで Option BASE で検索してみて


846 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 21:52:43 ]
>>843
ボタンをタブに見立てて仮想的に実装すれば良い

これで解らないなら君には無理
諦めるか金払って作ってもらえ

847 名前:828 [2008/08/15(金) 22:03:14 ]
>>845
Option BASEで配列の最小値を0か1に選択できるのか
これは便利だわ
さんくす!

848 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 22:26:03 ]
Option BASEは基本使っちゃいけない機能の1つ

初心者がパッと見る限りは便利そうに見えるが
コードの明示性が著しく損なわれる

Option Private
Option Compare
も同じく、プロシージャや関数で逐一指定するのが正しい
逐一指定ではコードが長くなり冗長だと言う奴も居るが、冗長とは単に長いだけではなく無駄に長い意味もなく長いということで
これらの逐一指定は、それらの参照レベルや比較方式などを明示するという意味を持っているので冗長とはならない

グローバル変数の多用を害とするのも同じような理由から

849 名前:y mailto:sage [2008/08/15(金) 23:03:56 ]
Option BASE 1 が期待通りに機能しない場合もあるので、それも頭に入れておいたほうがいいかも。
これを宣言していても、「Array 関数またはキーワード ParamArray を使って作成する配列の添字の最小値は 0 」
となってしまいます(ヘルプ参照)。Split関数が生成する配列も同様に Option BASE 1 の影響を受けません。


850 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 23:17:43 ]
>>834
ありがとうございます!
一時変数なるものについて勉強してから
それをヒントにもう一度よく考えてみます。

851 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 23:19:17 ]
それは「期待通りに機能しない」とは違う。
プログラムに置いて「期待通りに機能しない」というのは、
仕様書きに反する結果を返す場合などに使用する言葉。
「仕様通りに機能しない」とほぼ同義である。

Array、ParamArray、SplitなどがOption BASE 1の影響を受けないのは、
確立された仕様で常に同じ結果になるので、これが思惑通りじゃなかった場合は
「間違った期待をしていた」ということになる。
仕様を間違って覚えていたら、思惑通りに動かないのは当然のことだからね。

852 名前:y mailto:sage [2008/08/15(金) 23:33:36 ]
あ、なるほど。その通りですね。




853 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 23:43:46 ]
別にそこまで字面にこだわるようなものじゃないと思うが。
期待通りに機能しない、というのは単純に使用者が想定しがちな
一貫性を提供しない、ということだろう。

854 名前:z mailto:sage [2008/08/16(土) 00:21:47 ]
Application.Application.Application

855 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 06:50:42 ]
OPTION BASEってプロシージャで1回しか宣言出来ないのがなぁ。
ま、OPTIONだから当然なんだけどね。

他の言語はあまり数知らないけど、配列で0からスタートしない言語ってあるのかな。
2系列しか言語知らないけど、配列は0から始まる。って覚えてるから違和感はないな。


856 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 06:57:54 ]
>配列で0からスタートしない言語ってあるのかな

最近のCOBOLは違うかどうかまでは知らんけど、少なくともCOBOL85は1からスタート

857 名前:828 [2008/08/16(土) 07:38:49 ]
>>848
ご忠告ありがとー
Opttion BASE 1だと配列に格納する場合の添字と
配列から取り出すときの添字の値が同じだし、

行列の添字が一致するので便利と思ったけど、
使うときは注意したいと思います。

最終的には数千の行列を計算したいので逐一指定だけでは大変かと
思っていたけど、初心者の私にはまずこれでやってみます。

>>849
yさんありトンです
過去レスで配列のこともいろいろ書かれてますが
読み返すと少しずつ分かってきました。

Array関数などはまだ使ったことがないけど、
使うときにはOption Baseに添字が影響されないことを思い出します。

皆さん大変勉強になりました。初心者の質問に真摯に対応していただいて
なんかうれしいです。ありがとうございます。

858 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 10:59:40 ]
VBが嫌なのは普通に長さ0の配列を作れないこと

859 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 11:00:38 ]
ちょっと古い質問ですまんが、>>736
>> Const DATA_N As Integer = 50
>数値型、文字列型の定数で型指定するな
これってどういうこと?
Const DATA_N = 50
の方がいいってこと?

860 名前:y mailto:sage [2008/08/16(土) 11:58:13 ]
>>858
長さ0の配列って、どんなことに便利なんですか?
アイテムを持っていないCollectionのようなイメージでしょうか。

861 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:09:50 ]
>>860
こういう一貫性のあるコードを書くことができる:
Dim anArray() As String
anArray = Split("") ' Variant()ならArray()でよし

For Each eachCell In [~~:~~]
ReDim Preserve anArray(UBound(anArray) + 1)
If pred(eachCell) Then anArray(UBound(anArray)) = eachCell
Next eachCell
別に例としてはなんでもいいんだけれども、
とにかく『空』の表現がないといろいろと面倒。

862 名前:y mailto:sage [2008/08/16(土) 12:48:05 ]
ありがとうございます。空の状態から1つずつ追加する、みたいなイメージのコーディングが可能に
なるわけですね。にしても、Split("")という表現でそれを実現できるとは...
ローカルウィンドウで確認すると、代入直後の変数anArrayの型がString(0 to -1)なんてなっているあたり、
Base0の理屈からすれば正しいのかもしれないですが、たしかに普通じゃないですね。




863 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:14:19 ]
VBAならEnptyでいいのでは?


864 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:45:38 ]
JAVAあたりだと、配列数をredimする必要もなく、どんどんputして行けるんだよね。
それが良いとは一概に言えないけど、VBだとそこらへんが不便。

865 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 15:58:34 ]
Enpty?

866 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:16:54 ]
>>864
たぶんjava.util.List<E>のことを言っているのだと思うが、Javaでも
配列じゃダメ(というわけでもないがReDim無いので相当に面倒)だがね。

VBは標準でDictionary揃えていないあたりコレクションの取り扱いが面倒。

867 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:53:35 ]
は?コレクションならあるだろ

868 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 18:02:01 ]
エンプティダンプティ

869 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 18:10:33 ]
>>867
コレクションっていうのはJavaでいうコレクションのことね。
SetやらMapやらQueueやら。

870 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:07:46 ]
アホが

871 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:08:17 ]
Jamaだよ

872 名前:デフォルトの名無しさん [2008/08/17(日) 00:35:10 ]
設定としては再計算を自動にしているのですが、マクロでやると、
エクセルのコマンドバーに「再計算」が表示されます。そこを自動にするため、
SendKeys "{F9}", True
を書いてみたものの何の役にも立っていません。
どのようにしたら、いいでしょうか?
ご教示願います。





873 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 00:49:14 ]
年月日時間の計算なのですが、
VBAで hoge = cells(1,1).value - cells(1,2).value とすると型が一致しないと怒られますが、
ワークシート関数で、 =A1-B1 とやると、うまく計算してくれます。

ワークシート関数にはVBAには無い自動整形機能などが付いているのでしょうか。

874 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 00:49:59 ]
言い方がおかしかったです・・・・。
どんなVBAの機能で計算されているのでしょうか。

875 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 01:52:48 ]
>>872
Sheet.Calculate使えばいいでしょ

>>873-874
そもそもVBAとExcelの演算はぜんぜん別物。
Excelの計算はVBAの機能などではない。

876 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 01:54:13 ]
あー、わざわざSheet指定じゃなくて、Application.Calculateの方がよさそうだな。

877 名前:y mailto:sage [2008/08/17(日) 02:01:48 ]
>>872
ttp://support.microsoft.com/kb/248179/ja
ただし、Excel2002や2003でも、再計算をしても「再計算」の文字が消えない、
という状況はよくあるようですし、私も時々経験します。理由は分かりませんが、
シート上の数式の個数が多いと起こりやすい気がします。
しかし実際には、きちんと計算されているようです。

ちなみに、マクロで再計算を実行したい場合は、SendKeysよりもCaluculateメソッド
のほうが妥当です。

878 名前:y mailto:sage [2008/08/17(日) 02:03:20 ]
>>875 すみません。被りました。

879 名前:872 mailto:sage [2008/08/17(日) 02:52:19 ]
2003 XPです。
再計算はされていません。再計算に続けてワークシートイベントのcalculateが
動くようにしているつもりなのですが、再計算のために手動でのF9キーを
押すと、きちんと再計算後のイベントが働き、目的が達成されます。
ただ、今日は、状況、目論見等の説明がうまく書けてないので、また、来ます。
夜遅くに、ありがとうございました。


880 名前:デフォルトの名無しさん [2008/08/18(月) 17:05:33 ]
すみません。ご指導お願いします。。
100万行以上あるテキストファイルを、1万行づつ分割して
元のデータの形式、区切り文字、列のデータ形式
を指定し、エクセルシートに取り込んむVBAは可能でしょうか?
可能であるならどのようにしたらいいのでしょうか?(Accessは使わず)
  宜しくお願いします。


881 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 18:19:56 ]
>>880
で、幾ら払うの?

882 名前:y mailto:sage [2008/08/18(月) 18:54:52 ]
>>880
偶然ですが、ちょうど私も500万件の氏名+ふりがなデータを使って
似たようなテストをやっている最中です(遊びで)。うちの場合は
1シートあたり5万行ずつで100シート分です。理屈としてはできるはずですが、
途中何が起こるかわからないので「可能です」とは言えません。

テキストファイルの取り込み方は、まず「テキストファイル VBA」とかで検索してみてください。
たくさん出てきますよ。




883 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:40:16 ]
>>880
Excelのバージョンによらない解決法は、
1. テキストファイルを順次読み込み、1万行分のファイルを作る
2. Excelの機能でテキストファイルを読み込む
3. 読み込んだシートをBookのシートにコピー
4. 1にもどる

884 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:41:52 ]
>>882
どう考えても「可能」だろ。
適当なこと言うなよ。

885 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:50:10 ]
名前とふりがなで1件50バイトとして5万行で2.5MB
100シートだから250MB
おれはexcelで30MB以上のファイル開いたことないなー

886 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:05:49 ]
Excelにデータを読み込むのが目的じゃなくて、読み込んだデータを何かに使うのが目的じゃないのか?
だとしたら、SQLiteとかの方がいいかもしれんぞ。

887 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:09:55 ]
いや、だったらmdbでいいだろ

888 名前:y mailto:sage [2008/08/18(月) 20:35:22 ]
>>884
あ、可能なんですね。失礼しました。
こんなに件数が膨大だと、メモリの関係で途中で止まってしまうとか、その他不測の事態が
起こったりしないとは言い切れず、従って「可能」とも言い切れず...みたいな心境でした。

氏名生成を16:00頃に開始して、今でようやく400万件です。
テキストファイルで120Mbになっています。どうなることやら...


889 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:43:24 ]
というか、excelに向いてる事、向いてない事を考えろよ。

出来る。と向いているは全く違うぞ?
yみたいに遊びで試すなら何やっても良いけど、
仕事で使うなら、excelで大量のデータ処理をするなんて考えは捨てるべき。

と思ったけど、yは500万件の氏名データ持ってる時点で遊びじゃない。
もっと色々と自覚したほうが良い。

890 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:52:46 ]
>>880
速度気にせずその条件を実現するなら単にループを二重に回せば良いだけだろ。

外側はDo...Loopで、テキストファイルのデータが終わったら終了。
内側はFor...Nextで、1 To 10000のカウンタループ。

外側のループで新規シート作ったら、内側のループで1行分のデータを読み込み、
シートに入力していけば良い。データが無くなったらExit Doで一気に外側のループも抜ける。
内側のループ内でやることは、データが3行でも100行でも1000000行でも変わらない
まあ、データ量が多い場合は1行ずつ読み込まないで、全体を変数に取って処理したり
逐一セルに代入するより配列介した方が早いとかはあるけどな

内側のループ内でやること、つまり1行分を読み込んでExcelに適用することすら解らないと言うなら、
>>1★5読んで出直すか、>>881も言うように金払って作ってもらえ。

因みに、作成できるシートの数はシートの内容や環境依存で、
内容では使用行列数もそうだが修飾が大きく影響し、環境では主に物理メモリのサイズが影響する。

>>889
> と思ったけど、yは500万件の氏名データ持ってる時点で遊びじゃない。
持ってるんじゃなくて、プログラムのテストや勉強用で作る場合もあるだろ。
俺もVBAじゃなういが、自作プログラムのテスト用に住所氏名などの仮想データを数十万件と用意したこともある。
実用ではなくテストや勉強や遊び用なら、データは同じ氏名の繰り返しでも何ら問題ないからな。
俺の場合は10件くらいの適当な住所氏名の繰り返しにしたが。

891 名前:y mailto:sage [2008/08/18(月) 21:03:44 ]
>>889
誤解ですよ〜(泣)。500万件の個人情報を握っているわけではなく、
このソフトで氏名を生成しているだけです。
ttp://www.vector.co.jp/soft/win95/amuse/se318543.html
>>890が察してくださった通り、大量の仮想データを使ったテストをしようとしています。


892 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:36:25 ]
Excelの仕様くらい調べてくれよ・・・



893 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:47:54 ]
何勘違いしてるの?

894 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:52:50 ]
どうしてもExcel VBAじゃないとだめなん?
今時珍しいぞあんな低速言語

895 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:54:06 ]
yが来るようになってから、このスレが変になった

896 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:02:30 ]
依存するのは物理メモリか?

897 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:04:15 ]
>>895
いいじゃん。活気があって。

898 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:04:23 ]
>>880は特に「単一のブックで」といった事は書いていないようだが
その辺は暗黙の了解なのだろうか

899 名前:デフォルトの名無しさん [2008/08/19(火) 11:22:06 ]
みなさんありがとうございます。。
補足させてください。
フォルダの中に複数のテキストファイルがあります。
それをVBAで1シートに1テキストファイルづつで取り込んで
(区切り文字(#)、列のデータ形式(文字列)を指定して)
作成済みのマクロを実行し、出力させたいのですが。。
データが大きいので5シートで1つのファイルにしたいです。
フォルダの中にはテキストファイルが100ほどあるので、結果、エクセルファイルが
20できればいいのですが。。
できればデスクトップに新しいフォルダが作成されて
その中に出力されていくようにしたいです。
お力を貸してください。よろしくお願いします。

900 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 11:28:39 ]
現在、ユーザーフォーム上でワークシートを表示させるべく
スプレッドシートを設置することはできましたが、
このスプレッドシート上にチェックボックスを表示させる方法が分かりません。
何か良い方法があれば教えてください。お願い致します。

901 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:35:33 ]
>>899
質問というより丸投げの典型例

902 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:37:14 ]
>>899
ファイル名は連番のノンブルとか付いてるのかい?

フォルダに入ってるバラバラのファイル名のファイルを全部読み込む。
って言うならばVBAの範疇超えてるからスレ違い。



903 名前:y mailto:sage [2008/08/19(火) 22:38:26 ]
>>900
SpreadsheetコンポーネントのSheetオブジェクトは、Excelシートと比べてとてもシンプルな機能しかなく、
OLEObjectsプロパティも持っていないため、CheckBoxなどのコントロールを追加する領域自体が見当たりません。
コンポーネントのヘルプにもとくに触れられていないようです。
普通にユーザーフォーム上にCheckboxを配置するだけでは足りないのですか?


904 名前:デフォルトの名無しさん [2008/08/20(水) 14:35:52 ]
よろしくお願い致します。
OS:XP エクセル2003 VBAのことは、まったくの初心者です。
質問なのですが、下記のようなチェックボックス7にチェックが入れば、
チェックボックス8〜11に自由にチェックが入れれるようになり、
逆にチャックボックス7にチェックが入ってない場合は、
チェックボックス8〜11のチェックはクリアされ、
チェックできないものを作りました。

ここから、チェックボックス7にチェック入れたあとは、
必ずチェックボックス9〜11のどれかにチェックが入っている状態
(ラジオボタンのような)で、チェックボックス7にチェックが
入ってなかったら、8〜11のチェックがクリアで尚且つ、
チェックができなくなるようにするにはどうすればよいでしょうか? 
よろしくお願い致します。

Private Sub CheckBox7_Click()
If CheckBox7.Value = True Then
CheckBox8.Enabled = True
CheckBox9.Enabled = True
CheckBox10.Enabled = True
CheckBox11.Enabled = True
Else
CheckBox8.Value = False
CheckBox9.Value = False
CheckBox10.Value = False
CheckBox11.Value = False
CheckBox8.Enabled = False
CheckBox9.Enabled = False
CheckBox10.Enabled = False
CheckBox11.Enabled = False
End If
End Sub

905 名前:y mailto:sage [2008/08/20(水) 17:04:59 ]
>>904
>ここから、チェックボックス7にチェック入れたあとは、
>必ずチェックボックス「9〜11」のどれかにチェックが入っている状態
とありますが、文脈からすると「8〜11」のつもりでしょうか?

8〜11にラジオボタン的な挙動をさせるには、
@CheckBox8〜11にそれぞれClickイベントプロシージャを作成
A各プロシージャには、自分以外のCheckBoxの値は全てFalse、自分の値だけをTrueにするコードを記述
すればよいかと思います。なお、「自分以外のCheckBoxの値は全てFalse」の部分は、
別にプロシージャを作成して、各イベントプロシージャから呼び出すようにすれば合理化できます。

CheckBox7がTrueになった直後は、8〜11のうちどれをTrueにするのか、とか、
8〜11のうち既にTrueになっているものがClickされたらどうするのか、などの点が
はっきりしませんが、方針さえ決めてしまえば簡単に修正できるはずです。


906 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 18:53:18 ]
こいつの口調、癇に障る。
ただそれだけで、消えてほしいと願う。

907 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 19:57:47 ]
お前が消えればいいじゃん

908 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 20:50:56 ]
>>906
お前の方が癇に障って癪だわ。お前が消えろ。

909 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 21:22:01 ]
自作自演ヒドス

910 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:10:50 ]
匿名掲示板でコテハンを長く名乗るって事は、それだけのリスクがあると言う事。
自分の向学の為ならば、コテを名乗る必要はどこにもない。

仮に間違った事を回答したとしても、責任なんてない。逃げるのも簡単。
それが匿名掲示板だから。

自分で退路を塞ぐだけでも愚かな事なり。

911 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:27:26 ]
そんなのどうでもいいわ。ここはExcel VBAのスレだろ

912 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:27:31 ]
コテハンがそんな大層なもんかね
何か勘違いしてるんじゃないの



913 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:45:02 ]
退路っていうのは間違っても訂正しないことなんだろうか

914 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:47:48 ]
荒れてますな〜w

915 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:49:41 ]
>>914
マクロだけにねプッ

916 名前:デフォルトの名無しさん [2008/08/21(木) 08:41:58 ]
>>905

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

917 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:14:17 ]
すんません。質問させてください。

違う部署の人にヘルプを頼みまして、条件に合致する物にフラグを立ててくれたんです。
後で処理するんで、文字列の最後尾に記号をくっつけといてもらったのですが、
よりによって、アスタリスクが最後尾に付いてました。

適切に指示しなかった私が悪いと思い、今後は別の記号か、
別のセルに数字でフラグを立ててもらう事にしたのですが、
そこで質問です・・・。

autofilterも、replaceも、*はワイルドマークとして機能しているようですが、
エスケープシーケンスは存在しますでしょうか。
文字列としての*を判定させたい場合の処理などが可能でしたら教えてください。


918 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:22:29 ]
[*]

919 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:43:27 ]
ありがとうー

920 名前:デフォルトの名無しさん [2008/08/21(木) 21:59:10 ]
質問です。
他のxlsファイルを読み込んでいろいろ作業するのを、マクロの記録からやると
切り替えごとにWindows("hoge.xls").Activateになりますよね?
これだとファイル名を変えると動かなくなるのでなんとかしたいのですが
元の方はThisworkbook.Activateに置き換えすると済みますが
相手ファイルも同様に使いやすくするにはどうしてますか?

GetOpenFileで指定したファイルをどこかの非表示セルに書き込んで
それを読み込む方法しかないのでしょうか?
他にいい保存場所ないのかなぁ?

921 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:14:15 ]
起動中のエクセルファイルには、起動順に番号が割り当てられている。
ファイル名を指定しなくても、
Workbooks(n).Activate
(nは数字)という形で、n番目に開いたファイルをアクティブにできる


922 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:16:17 ]
一時的にマクロを停止させ、
その間にワークシートを操作するプログラムを組みたいのですが躓いています。

waitメソッドを使えば実現できるかと思ったのですが、
マクロは停止するけれどもワークシートが操作不可能です。

実現するべく何が良い方法があればご教授ください。



923 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:18:11 ]
doevents

924 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:25:07 ]
>>920
hoge=Activexworkbook.nameで開いたファイル名を取得

925 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:25:33 ]
コントロール配列使えないVBAももうちょっと頑張ってくれればいいのにな。
vbe.netとかつくって欲しい。

926 名前:920 mailto:sage [2008/08/21(木) 22:32:10 ]
>>924
それだと毎回ダイアログ画面で指定しなきゃいけませんよね?
ファイル名を変えちゃったときに、一度指定してもらうだけで済ませたいのです。

927 名前:y mailto:sage [2008/08/21(木) 22:48:28 ]
>>926
非表示セルか非表示シートのセルでいいのでは。
個人用マクロブックとか、外部テキストファイルとか、いろいろ考えられますが、
複雑になるだけだと思うので。


928 名前:デフォルトの名無しさん mailto:age [2008/08/21(木) 23:30:45 ]
総合スレよりこっちの方が良さそうなのでこちらで質問します。
ワークシート上に配置したコンボボックス(フォームではなくActiveXの)に初期値として、
今日から5日前〜今日から10日後の日付をセットしたいのですが、うまくいきません。
ユーザーフォームだとUserform_Initializeの中に記述すればいいんですが、
同じ様にはできません。どうすれば良いでしょうか。
clickイベントでも試しましたがコンボボックスはchangeイベントしかダメなのかな?

929 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 02:32:27 ]
>>928
UserformにはUserformのイベントがあり、ThisWorkbookにもイベントがある。
Private Sub Workbook_Open()
For i = 4 To 0 Step -1
Sheet1.ComboBox1.AddItem Date - i, 4 - i
Next
Sheet1.ComboBox1.ListIndex = 0
End Sub


930 名前:928 mailto:sage [2008/08/22(金) 07:23:05 ]
>>929
そっか、ブックを開いた時にイベント発生させれば良かったのか。
ありがとうございました。

931 名前:デフォルトの名無しさん [2008/08/23(土) 03:58:17 ]
相対参照を含む数式を位置関係を考慮してずらしてコピーする方法はありますでしょうか
コピー元C5セル:=B5
コピー先C10セル:=B10
のようにコピーしたいのですが
Range(C10).formula=Range(C5).formula
のようにするとC10が=B5になってしまいます。
調べてもFillDownというものしか出てこず離れたところにコピーするやり方が分かりません。
すみませんがご存知の方教えていただけないでしょうか

932 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 06:33:53 ]
>>931
Range("C10").FormulaR1C1 = Range("C5").FormulaR1C1



933 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:03:39 ]
>>932
ありがとうございます
意図したことが出来ました


934 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:59:51 ]
VBA使って関数や数式のコピーってどうなのよ。
モジュールに数式書いてくれればすぐわかるのに、
数式のコピーって、いちいちプロパティで調べないといけないから面倒なんだけど。

なんでそんな事するの?死ぬの?

935 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 16:14:09 ]
>>934
あなたは13日後にしにます

936 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 17:40:05 ]
呪殺予告きたー!
これは逮捕だな

937 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:27:46 ]
>>934の言っている意味がわからない。
数式コピーされると死ぬの?呪殺されちゃうの?

938 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:53:17 ]
なれないVBAで苦労しているのですが、オートシェイプ周りの制御はどうすれば
良いんでしょうか。移動や変形どころか、アクセス方法すら分からずじまいで。

取っ掛かりだけで十分なので、教えていただければ幸いであります。
流れ読まずにすまんですたい。

939 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:00:01 ]
なにがしたいの?

940 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 22:09:37 ]
>>938
(っ´▽`)っ
マクロの記録でやってみればいいじゃん

941 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:20:50 ]
>>939
「頂点の編集」がグリッド無視するのをどうにかしたり、直線を他のオートシェイプに置換できないかなと。

>>940
あーなるほどこんな手が。取っ掛かりが掴めました。ありがとうございます。

942 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 22:27:25 ]
(っ´▽`)っ
テンプレに
わからなければ、とりあえず「マクロの記録」をやってみましょう
がないことに驚き☆



943 名前:デフォルトの名無しさん [2008/08/23(土) 22:33:10 ]
Excell2007でVBAでプログラム組んで動かしたんだけど
かなり実行に時間がかかってしまう・・・

今のパソコンはC2Dの2.4Gでメモリ2GでXP何だけど
ハードを新しくするのとOSをVistaにするのどっちが効果的ですか?

944 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:34:16 ]
真逆の選択肢に見えるのが面白いw

945 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:39:42 ]
>>943
64bit Vistaにしたまえ

946 名前:y mailto:sage [2008/08/23(土) 22:50:05 ]
>>943
もうご存知かもしれませんが、>>724もとりあえず参考までに。



947 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:50:45 ]
>>934
出来てありがとうって言ってるのにその追い討ちはわけがわかりませんww
数式コピーできなくても死にはしませんよ
VBAに書くと柔軟性が失われるから外出しにしておきたいのです。
再利用性を高めるのに最も良い方法は命令をコマンドにすることです。数式に限らずSQLなどの柔軟性の高い命令は外出しが良いのです。

948 名前:デフォルトの名無しさん [2008/08/23(土) 22:52:21 ]
リストボックスで複数選択した分だけ
H列の11行目から4行ずつ下へオートフィルを使ったコピーで展開したいんだけど、
コードがうまく思いつかなくて四苦八苦してます。


リストから複数選択した分をjに入れたとして、
コードは
Range("H7:H10").AutoFill Destination:=Range("H7:H10+j")


としたけど中々コードが思いつかずわかりません・・・
VBA始めて2週間、本やネットで検索してもリストボックスの扱いがあまりなく苦労してます。

949 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 22:55:51 ]
>>947
(っ´▽`)っ
それだったら、数式をConst String型にしておいたほうがいいよ☆
数式のコピーよりも分かりやすいような気がする。
数式のコピーだと、>>934のように、数式がソース上どこにも出てこないことになるから。

950 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:59:06 ]
>>943
スレ違いだけど
チューニングという選択がいいと思うよ
まずは使い終わった計算式を削除してみること

951 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 22:59:11 ]
(っ´▽`)っ?
>柔軟性の高い命令
今気づいた。動的に数式が変わるっていうこと?
それだとConstじゃダメだね。

952 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 23:01:30 ]
>>943
(っ´▽`)っ
「マクロの記録」で生成されたプログラムだと、
.selectが多くできるけど、これを無くすとかね。
range("A1").select
selection.value = 1

range("A1").value = 1



953 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 23:20:09 ]
>>948
(っ´▽`)っ ほ〜れほ〜れ☆
Range(Cells(7, 8), Cells(10, 8)).AutoFill Destination:=Range(Cells(7, 8), Cells(10 + j * 4, 8))

954 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 23:21:37 ]
>>951
動的には変えませんが、数式はユーザに変えてもらうカスタマイズポイントです

955 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 23:30:25 ]
>>954
(っ´▽`)っ
ほうほう。
じゃあ、セルに名前をつけて、それでアクセスするといいかも。
Range("C10").FormulaR1C1 = Range("C5").FormulaR1C1
これだと、C5ってなんだ?ってことになる。ソース上はわからない。
ワークシートのC5を見ればわかるけどね。
たとえば、セルC5に"カスタマイズSQL"という名前を付ければ
Range("C10").FormulaR1C1 = Range("カスタマイズSQL1").FormulaR1C1
と書くことができる。
ソース上もわかりやすくなってイイ!>>934の不安も払拭される。

セルの名前は「挿入」→「名前」→「定義」で設定できるよ☆

956 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 23:31:13 ]
(っ´▽`)っ
間違えた☆

たとえば、セルC5に"カスタマイズSQL"という名前を付ければ
Range("C10").FormulaR1C1 = Range("カスタマイズSQL").FormulaR1C1
と書くことができる。

957 名前:948 mailto:sage [2008/08/23(土) 23:32:54 ]
>>953
できた!サンキューです♪
胸のつっかえが取れました(o^-')b

Rangeじゃ駄目だったんですね。
これで次の勉強に進められます。

ありがとうございますヾ(o゚∀゚)ノ゛

958 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:23:56 ]
VBAで課長の背骨をヘシ折る事は可能?
あと、栗とか剥ける?VBAで。

ググッても全然HITしない。

959 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:33:29 ]
ああ、できるよ。

960 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:59:57 ]
>>956
ありがとう
一応名前付き範囲は知ってるよ
君はのりのりですごい親切だね
また今度教えてね

961 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 01:06:38 ]
うぜーよ

962 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 01:35:44 ]
>>959

うっそマジ?
じゃあ例えば

Sub 課長()

Dim 課長 As Integer
Dim ボディ As Boolean
Dim 吐血 As Integer

課長 = 1
吐血 = 101


Do Until 課長 = 吐血

If Cells(課長, 1) = "" Then
ボディ = True
課長 = 課長 + 1
End If

Loop

MsgBox "課長は吐血しました。もうやめて下さい。"

End Sub

とかで課長吐血する?VBAで吐血する?



963 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 01:46:31 ]
そのコードじゃ無理だけどな

964 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 09:10:49 ]
VBAでルーチン組んでから、椅子で殴れば良いじゃん。

965 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 10:12:58 ]
ハードディスクのデータをクリーンにするプログラムを組んでプレゼントしなさい。

966 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 10:20:17 ]
VBAでできるけどスレ違い。Excel関係ないから。

967 名前:デフォルトの名無しさん [2008/08/24(日) 10:52:44 ]
2003です。
マクロの記録からオートシェイプをやったけど
そのまま実行すると塗りつぶし無しだけがキャンセルされてしまいます。

ActiveSheet.Shapes.AddShape(msoShapeOval, 257.25, 109.5, 39.75, 21.75).Select
Selection.ShapeRange.Fill.Visible = msoFalse
Selection.ShapeRange.Fill.Solid
Selection.ShapeRange.Fill.Transparency = 0#
Selection.ShapeRange.Line.Weight = 1.5
Selection.ShapeRange.Line.DashStyle = msoLineSolid
Selection.ShapeRange.Line.Style = msoLineSingle
Selection.ShapeRange.Line.Transparency = 0#
Selection.ShapeRange.Line.Visible = msoTrue
Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)
どうすれば塗りつぶし無しに出来ますか?


968 名前:側近中の側近 ◆0351148456 [2008/08/24(日) 11:07:37 ]
>>967
(っ´▽`)っ
Selection.ShapeRange.Fill.Solid
を削除しましょう。

969 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 11:52:21 ]
>>968
ありがとうございます

970 名前:デフォルトの名無しさん [2008/08/24(日) 14:41:12 ]
CSVファイルの数値を分析したいのですが
フォルダ内すべてのCSVファイルにマクロを実行する方法はありますか?

紹介されている本やHPを教えていただけませんでしょうか?

よろしくお願いします。

971 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 20:17:55 ]
うーむ・・・CSVってカンマ区切りのデータテキストの事だよね?
一度EXCELに読み込んで処理じゃダメなのかな。

972 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 20:51:32 ]
このスレ的にはそれがいいね。
どうやってやるかは、マクロ記録すればすぐ判ることだし。



973 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 21:59:24 ]
excelで普通によみこむと、おもってるのと違う動きされることあるんだよなー。
だから、俺は、1行ずつ読み込み、コンマで区切りごとのデータを自前で配列にいれる
多バイト文字つかわれてたりするとこは、1フィールドごとにエンコードチェック、
をずっとEOFまでやってから、自分のおもってる型にかえてから処理しとる。

974 名前:y mailto:sage [2008/08/24(日) 22:14:08 ]
「フォルダ内すべての」CSVファイルに対して処理をしたい、
という点でもつまずいているのかも。それについては、
「FSO」を検索すると役立つ情報が見つかると思います。


975 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:17:58 ]
CSVの定義って厳格な物ある?ファイル形式とか。
気になって調べたんだけど、ファイル形式までは規格されてないような。

んで、フォルダの中身全部、って指定がかなり難しいのではないかなと。
たとえば拡張子がtxtだとしても、それがCSVで組まれたデータファイルなのかは、
計算機で判断出来るの?って思ってさ。

976 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:37:56 ]
>>974
先にDir勧めろ。

>>975
RFC4180というものがあるにはある。

977 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:38:05 ]
RFC 4180

978 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:54:22 ]
基本的に、顧客が好むのが、Excelでひらいたときにどうみえるか。
なんで、
"dataA", "dataB", ... , "dataX"
みたいに、""でかこむことになる。
数値解析とかだけのローカル用途なら、囲まんけどな。

979 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:04:47 ]
FSOの.Filesでファイル一覧取得して、Right$で.csvだったら、
FSOの.Readallで読み込んで、VBCRLFでSplitして、
配列に入れて配列をカンマで、Split

980 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:09:35 ]
プロジェクトのこまごま作業で多かったのがFSOによる再帰ファイル検索だ

981 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:14:27 ]
"abc,def","ghi",""""
ってな感じのデータに対応しようと思ったら面倒よ、自前でやるのは

982 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 02:00:47 ]
FSOでやるなら普通にGetExtensionNameでcsvかどうかを見ればいいんでね?



983 名前:y mailto:sage [2008/08/25(月) 19:17:14 ]
>>976
あ、そっちの方が簡単かも...
オブジェクト作らないで済みますし。

Const fPath = "(フォルダのパス)"
Dim fName As String
fName = Dir(fPath, vbNormal)
Do While fName <> ""
 If UCase(fName) Like "*.CSV" Then
  'Open 〜
  '>>979の後半みたいな処理
  'Close 〜
 End If
 fName = Dir
Loop

こんなやり方でいいのかな。
CSVデータは、シングルクォーテーション('')で囲まれたタイプのも
ざらにあるので意外と厄介ですよね。

984 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 20:21:21 ]
Dir(fPath & "\*.csv", vbNormal)
Ifはいらない

985 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 20:28:40 ]
FSOとかつかうと
2008/08/25 20:27:30
みたいなフィールドがtextstream通した時点で
2008/08/25 20:27
とかされるからやめたほうがいいぞ。他にも罠多数。

どうしてもVBAっちゅーんなら、バイナリで読み込んで処理。これしかない。
自作のあるけど、バグあるとはずかしいから公開できん。
結構、考慮するべきパターンあるんで、かなり大きい。

986 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 20:47:47 ]
(っ´▽`)っ
もし作るのが業務ソフトウェアなら、許容するCSVの仕様ぐらい決めたら?
こういう感じに。ちなみにこれはExcelのCSVの仕様に準じている。

・カンマ区切り
・ダブルクォーテーション内のカンマは区切りとみなさない。
・二連続のダブルクォーテーションは、文字としてのダブルクォーテーションと見なす。
(項目にダブルクォーテーションを含めたい場合には、ダブルクォーテーションを2つ打つこと)
・閉じていないダブルクォーテーションはエラー。

入出力は過剰だと思うぐらい明確にしたほうがいい。

987 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 20:50:39 ]
(っ´▽`)っ
>>986に追加。

項目にカンマを含めたければ、ダブルクォーテーションで項目を囲うこと。
(例:"1,000","12,000")

988 名前:967 mailto:sage [2008/08/25(月) 20:52:23 ]
ActiveSheet.Shapes.AddShape(msoShapeOval, 257.25, 109.5, 39.75, 21.75).Select
Selection.ShapeRange.Fill.Visible = msoFalse
Selection.ShapeRange.Fill.Transparency = 0#
Selection.ShapeRange.Line.Weight = 1.5
Selection.ShapeRange.Line.DashStyle = msoLineSolid
Selection.ShapeRange.Line.Style = msoLineSingle
Selection.ShapeRange.Line.Transparency = 0#
Selection.ShapeRange.Line.Visible = msoTrue
Selection.ShapeRange.Line.ForeColor.SchemeColor = 64

これで2003でうまく塗り潰しの無い輪っかが描けたので
会社の2007に組み込んだんだけど、今度は黒塗り潰しに化けてしまいました・・・・
急遽マクロの記録で輪っかを描いてみたものの、なんと2007では図の挿入あたりの記録はしてくれないようです・・・。
互換性が無いのもむかつくが、マクロ記録も改悪されてるとは実に情けない話と思います。

どなたか、黒丸で中塗り潰しの無い輪っかを2007で実現してくれるコードを教えてください。

989 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:04:19 ]
マクロの自動記録でいいんじゃないの

990 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:10:10 ]
CSV仕様きめても精確な実装はなかなかむずかしい。
もうほんと想定外の入力がされてたりする。

特に業務でよくあるのが複数行にわたって改行つきのコメントフィールドとか
SJISとはかぎらんわけで、難しい。

もうこれでいいだろ、とおもうくらい慎重に実装しても、おれの技術じゃ
100万件のフィールドよむと、たいてい2,3件は、バグにかかる。
で、そっから、その特殊なケースをADHOCに直していくという対応。
例外でたからあとから3件追加しますとか、じゃ納得してくれんし、3年後に
でるかもしれないわけで。。。ほんと怖いよ。

一番いいのは、EXCELでCSVをよみこむのはあきらめることじゃ。。。


991 名前:967 mailto:sage [2008/08/25(月) 21:15:57 ]
>>989
2007ではマクロの記録をしても、オートシェイプの挿入〜線種変更などをなにも記録してくれないのです。

992 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 21:16:40 ]
>>991
(っ´▽`)っ
ウォッチウィンドウでそれっぽいプロパティを探せ☆



993 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:54:19 ]
>>991
2007で普通に記録できたよ。
ついでに貼っておきますね。

ActiveSheetのオートシェイプを赤にするコード。

Dim sp As Shape
For Each sp In ActiveSheet.Shapes
With sp
sp.Fill.Visible = msoTrue
sp.Fill.Solid
sp.Fill.ForeColor.SchemeColor = 10
sp.Fill.Transparency = 0#
sp.Line.Weight = 0.75
sp.Line.DashStyle = msoLineSolid
sp.Line.Style = msoLineSingle
sp.Line.Transparency = 0#
sp.Line.Visible = msoTrue
sp.Line.ForeColor.SchemeColor = 64
sp.Line.BackColor.RGB = RGB(255, 255, 255)
End With
Next



994 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:03:21 ]
これで透明になるよ
For Each sp In ActiveSheet.Shapes
sp.Fill.Visible = msoFalse
Next


995 名前:デフォルトの名無しさん [2008/08/25(月) 22:44:49 ]
999-9999-9999や9999-99-9999の書式で入力された電話番号を
(999)-9999-9999や(9999)-99-9999の書式にしたいのですが
A=Range("A1").Value
B=Find("-",A,1) -の位置
C=Left(A,B-1)    -の前だけ抽出
D=Mid(A,B,Len(A)-B+1) -の後ろを抽出

求める文字列="(" & C & ")" & D

関数だとこんな感じだけど、VBAではどうやりますか?



996 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:45:45 ]
うちはXMLに統一してるんでCSV時代のトラブルは一切無くなったな。

997 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:46:41 ]
>>995
InStr

998 名前:y mailto:sage [2008/08/25(月) 22:57:06 ]
>>984
ありがとうございます。大文字・小文字を考えなくて済むのでますます楽です。

>>985
まさかそんな罠があるとは...。自分でも実験してみます。

999 名前:デフォルトの名無しさん [2008/08/25(月) 22:59:46 ]
ume

1000 名前:デフォルトの名無しさん [2008/08/25(月) 23:01:54 ]
1000

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






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

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

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