Excel VBA質問スレ Pa ..
[2ch|▼Menu]
784:デフォルトの名無しさん
08/02/18 15:39:11
>>781
たまたま>780がmax()の仕様を知らなかっただけだろ。
どうしてもワークシート関数を使いたいなら配列を1要素ずつ処理すればいいと言う点では同意。
max()の場合なら、b = worksheetFunction.max(a(inCnt), b)とでもすれば使える。
# average()なんかはそうはいかないけど。

785:デフォルトの名無しさん
08/02/20 07:04:05
関数の引数にセル位置を「A1」の形式で入れたいとき、
行を変数にはできないんでしょうか?
たとえば変数xをSUM関数につかう場合、=SUM(A1:Ax)としてもエラーになりますよね・・

786:デフォルトの名無しさん
08/02/20 08:08:49
このすれ頭から読み直せ


787:デフォルトの名無しさん
08/02/20 11:53:43
HYPERLINK関数で質問です。
HYPERLINK関数では、特定の文字を含むリンクは張れないのでしょうか?

現在、HYPERLINK関数を用いたシートの目次を、
マクロで作成しております。
ですが、シート名に記号を含むと参照できないようです。
(@や#などほとんどの記号は駄目ですが、
 アンダーバーだけは大丈夫なようです・・・。)

しかし、マクロではなく、編集メニューの
[挿入]→[ハイパーリンク]から同じシートを指定した場合は、
参照できるようですorz
これら2つの操作は全く別物なのかもしれませんが・・・orz

---------------------------------------------
<参照できる例>
=HYPERLINK("#シート名!A1", "シート名")

<参照できない例>
=HYPERLINK("#@シート名!A1", "@シート名")

Excelのバージョン:2002(10.2614.3311)
---------------------------------------------

参照できない例のようなシート名で、
HYPERLINK関数で参照する方法はありますでしょうか?

何かわかる方がおられましたら、ご助言ください。
よろしくお願いします。

788:デフォルトの名無しさん
08/02/21 12:29:39
Officeボタンも知らないヤツが、質問スレで回答側に回ろうとするなよw

789:デフォルトの名無しさん
08/02/21 13:27:23
目先の問題の回答は出来なくても質問の仕方を教えるのはできるだろ

790:デフォルトの名無しさん
08/02/21 19:44:50
エクセルで計算した数値は少数桁何桁精度なのでしょうか?

791:デフォルトの名無しさん
08/02/21 19:59:12
3桁

792:デフォルトの名無しさん
08/02/21 20:11:40
>>790
IEEE 754倍精度はある。

793:デフォルトの名無しさん
08/02/21 23:07:20
Perlについての質問箱スレから誘導されて来ました。
Excel VBAからDOSコマンドを実行することはできますか?
具体的にはPerlスクリプトを実行させて、結果をExcelで受け取って
表示するまでを1クリックで行いたいと思っています。
環境はWindowsXP Home Edition、Excel 2003 です。
よろしくお願いします。

794:デフォルトの名無しさん
08/02/21 23:51:57
>>793
>Excel VBAからDOSコマンドを実行することはできますか?
ちょいと命令忘れたができる。
VBAからPing送ったりbatを呼び出したりしたりもできるから間違いない。

>具体的にはPerlスクリプトを実行させて、結果をExcelで受け取って
>表示するまでを1クリックで行いたいと思っています。
上の内容を具体的にしたつもりだろうが、上ができたとしてもこちらは関係ないだろ?
PerlからExcelにイベントでも起こさせられれば可能。

795:デフォルトの名無しさん
08/02/22 00:06:30
XPにDOSは載ってません

796:793
08/02/22 01:09:30
>>794
ありがとうございます。では情報があることを信じて
再びgoogleの海へと漕ぎ出すことにします。
>上ができたとしてもこちらは関係ない
言われてみたらその通りでした。
いつPerlの処理が終わったかExcel側で知る必要がありますもんね。

>>795
すみません、XPではコマンドプロンプトでしたか。

797:デフォルトの名無しさん
08/02/22 01:46:04
>>793
>>728-731

798:デフォルトの名無しさん
08/02/22 02:00:35
active perlはどう?

799:デフォルトの名無しさん
08/02/22 12:22:22
>>792
つまり何桁ですか?

800:デフォルトの名無しさん
08/02/22 20:07:05
>>792
倍精度の前のIEEE 754って、何を規定した規格の番号ですか?

801:デフォルトの名無しさん
08/02/22 21:39:25
>>800
ググれ
浮動小数点数の規格だ

802:デフォルトの名無しさん
08/02/22 23:55:17
>>800
Excel2000辺りは倍精度だけど、2003辺りからは拡張倍精度になっているから要注意。
前者は10進数で概ね15桁、後者は10進数で概ね19桁の精度があることになる。

803:693
08/02/23 16:40:39
解決したよ。

Origin句を定数xlWindowsから、
Shift-Jisのコードページである"932"へ変更してみたところ
文字化けなく開くことができたのでご報告。

その辺の細かな挙動の違いにだいぶ時間使いました・・・。
今後の何かの参考になれば、ということで、ひとつ。

804:デフォルトの名無しさん
08/02/23 16:45:14
VBAやEWCELのlog関数で計算して、その答えから逆算してもとに戻してみたら3桁精度しかなかったのです。
精度をあげる方法がありましたら教えてください。

805:デフォルトの名無しさん
08/02/23 18:30:23
寡聞にしてEWCELなるものは存じ上げませんが、VBAでやってみたということでしたら
ソースをご提示願えませんでしょうか。

806:デフォルトの名無しさん
08/02/23 18:44:19
EXCELの前身のアプリじゃね

807:デフォルトの名無しさん
08/02/23 20:11:53
WinXP+Office 2k7です。
ワークシート上部のいくつかのセルに任意の数値を入力するとそれに基づいて全体が計算されるシートを作りました。
B8というセル(自分で数値を入力する)の値がいくつならセルI818が0になるか、というのを探すためにLoopを使ったのですが、

Dim x As Integer
x=0.1
Do
x=x+0.0001
Range("B8").Value=x
Loop Until Range("I818").Value=0

とやってもI818が0になっても普通に通り過ぎてしまいますorz
ひょっとしてワークシート上でI818が計算されるのを待たずにLoopが続いてしまうんでしょうか。。?
お知恵をお貸しください

808:デフォルトの名無しさん
08/02/23 20:23:28
お前、小卒か?
整数って意味を知ってるか?

809:デフォルトの名無しさん
08/02/23 20:28:32
あ、integerじゃなくてdoubleでした。
こっちに書くとき間違えた\(^o^)/

810:デフォルトの名無しさん
08/02/23 20:33:09
> B8というセル(自分で数値を入力する)の値がいくつならセルI818が0になるか
自分でマクロ書かなくても、それはExcelのゴールシークを使えばいいのではないかと思う。

811:デフォルトの名無しさん
08/02/23 20:36:45
>>810
うは・・・全然知りませんでした('A`)
お手数おかけしました。ありがとうございます

812:デフォルトの名無しさん
08/02/24 11:00:13
すれ違いでしたら誘導お願いします。
「マクロを有効化する」を出さずfor文相当の機能を実現しようと思ってます。
直接forは使えないので、富豪的にセルのマスを記憶装置にする方針です。

やりたいことは、以下の状況で
「列Bが「新」の行の数値を抜き出して
それをコンマで連結して指定のセル(例えばD100)に入れる」です。
 列A 数値(1ずつ増えていく)
 列B 「新」「旧」のどちらかの文字

一旦、以下の式をC列に入れて、ドラッグでオートフィルします。
=if(B1="新",A1,"")
これはうまく行き、C列には「新規」の行のみに数値が表示されます。
次に、D列の先頭にC1の値を入れます(forの初期条件)
次に「同じ行のC列に値があれば、一つ上のD列の値をコンマで連結」
  「同じ行のC列に値がなければ、一つ上のD列の値をそのまま表示」
をforのステップ条件としてD2にかき、D100へオートフィルしようとしたのですが
=CStr(D1) & "," & CStr(C2)やCStr(val(D1)) & ..といった式ではうまくいきません。
アドバイス頂けないでしょうか

以上長文失礼しました。

813:812
08/02/24 11:03:55
↑訂正「新規」ではなく「新」ですね

814:デフォルトの名無しさん
08/02/24 11:37:49
Vlookupじゃね?

815:デフォルトの名無しさん
08/02/24 12:12:23
>>804

> VBAやEWCELのlog関数で計算して、その答えから逆算してもとに戻してみたら3桁精度しかなかったのです。
log関数は数値が小さいと精度は悪くなる。
少し値が変わると急激に値がかわるからな。    
自分で精度のよい関数を作るのがよい。
級数展開とかやれば作れる。

>>805-806
おまえら厨房だな。

816:デフォルトの名無しさん
08/02/24 13:44:03
質問なのですが適当な大きさのユーザーフォームを作成してフォームの中にラベルや
ボタンを設置します。設置したラベルやボタンが常にフォーム幅の真ん中に設置
させる方法はありますでしょうか?フォームの大きさを後で変更しても真中に自動で
なるようにしたいです。

817:812
08/02/24 15:25:46
>>814
それだとコンマをくっつけることができませんでした。
しかし、結局、こんな感じで解決しました
if(C2<>"",concatenate(D1,",",text(C2,"#")),D1)


818:デフォルトの名無しさん
08/02/24 21:05:38
>>816
算数レベルで処理


819:800
08/02/24 22:00:00
>>802
Thanks。概ねという留保付けは、このせいですか?
Excel で浮動小数点演算の結果が正しくない場合がある 2007年3月19日
URLリンク(support.microsoft.com)

820:デフォルトの名無しさん
08/02/24 22:38:32
816さんどーゆうことですか?


821:802
08/02/24 22:49:22
あーそうそう、そこの精度の欄にある、暗黙と仮数を足した53ビットを10進で表わすと概ね15桁ってこと。
つまり、log2(2^53)≒15.95=15~16桁。

822:デフォルトの名無しさん
08/02/25 10:04:55
教えていただきたいのですが、エクセルで、Aの列に任意のセルのカーソルが
ある場合のみ(B列やC列ではプログラム自体が稼動しなくしたいのですが)
FANCTIONを実行したいのですが、うまくいきません。
どうしたらうまくうごくのでしょか?


823:デフォルトの名無しさん
08/02/25 11:18:34
>>822
もうちょっと分かるように説明しる。あと、どんなFUNCTIONよ?
ボタン押したときに、カーソルが特定の列にある場合にのみ処理を有効にしたいってことか?


824:デフォルトの名無しさん
08/02/25 11:38:48
822です。
>カーソルが特定の列にある場合にのみ処理
まさにこの事です。エクセルの行列のデーター
をVBで計算させてるのですが、キーの列をA列にして
そこからActiveCell.Offset(0, x)とActiveCell.Offset(0, x+1)
を足してActiveCell.Offset(0, x+2)へ答えを出しなさいとしてるのですが、
いかんせん、キーにしているA列以外にセルがある場合も実行していまうので
ActiveCell.Offset(0, x+2)の書き込みたいところデーターのあるActiveCell.Offset(0, x+3)
とかに上書きしていまうので、何とかしたいのです。FANCTIONは
ActiveCell.Offset(0, x+3)=ActiveCell.Offset(0, x)+ActiveCell.Offset(0, x+2)
を変数にしたものです。


825:デフォルトの名無しさん
08/02/25 11:42:10
すいません。間違いました。FANCTIONは
ActiveCell.Offset(0, x+2)=ActiveCell.Offset(0, x)+ActiveCell.Offset(0, x+1)
を変数にしたものです。
です。




826:デフォルトの名無しさん
08/02/25 12:17:05
>>825
単にFANCTIONとやらの先頭で、ActiveCellがA列じゃなければ終わればいいだけじゃね?

827:825
08/02/25 12:58:53
ActiveCellがA列じゃなければが、
書けないのです・・・


828:デフォルトの名無しさん
08/02/25 13:12:22
そもそも>824のxはどこから出てきたのか知らんが、
offsetプロパティに辿り着けるくらいならcolumnプロパティくらい見つけられるだろ。
試しにmsgbox activecell.columnして味噌。


829:825
08/02/25 14:11:10
If ActiveCell.Column = 1 Then で出来ました!
828さん ありがとうございます。
感謝 感謝!


830:デフォルトの名無しさん
08/02/25 15:57:11
基本的な質問でスミマセン!
ワークシートに新しい埋め込みグラフを作成(Addメソッドによる)したいのですが

Dim co As ChartObject
Set co = Worksheets("sheet1").ChartObjects.Add(50, 40, 200, 100)

は正常に動くんですが

Worksheets("sheet1").ChartObjects.Add(50, 40, 200, 100)

は、構文エラーになります。なんで?
わざわざ変数に格納しないと、機能しないのはなぜなのでしょうか?
詳しい人おられましたらご教授いただけないでしょうか?

831:デフォルトの名無しさん
08/02/25 16:00:26
そういう構文だからだろ。疑問を持つところじゃない。

832:デフォルトの名無しさん
08/02/25 17:16:37
Rng AS Range
Rng1 AS Range
Rng2 AS Range

Rng=Range("A1:G10")

このRngから一番右の範囲をRng1に入れたい。
またRngから一番右の列を除いた範囲をRng2に入れたい。

どのようにすればよいでしょうか?

833:デフォルトの名無しさん
08/02/25 18:32:27
union

834:デフォルトの名無しさん
08/02/25 18:45:36
>>830
Callステートメント

835:デフォルトの名無しさん
08/02/25 18:49:27
>>832

Rng1=Rng.Resize(Rng.Row.Count-1,Rng.Columns.Count).offset(1,0)
Rng2=Rng.Resize(1,Rng.Columns.Count).offset(1,0)

836:デフォルトの名無しさん
08/02/25 22:51:26
>>830
Worksheets("sheet1").ChartObjects.Add 50, 40, 200, 100

837:デフォルトの名無しさん
08/02/25 23:07:06
ところで君たちは未だにVB独特のハンガリアン記法を守っているのかい?
今度VBAをメンテすることになって読みにくいなあと思ってるんだが・・・。


838:デフォルトの名無しさん
08/02/25 23:21:31
なんでExcelでシステムハンガリアン使うん?

839:デフォルトの名無しさん
08/02/25 23:40:24
>>835
はぁ?

>>832
Set Rng1 = Rng.Columns(Rng.Columns.Count)
Set Rng2 = Rng.Resize(, Rng.Columns.Count - 1)

840:デフォルトの名無しさん
08/02/25 23:55:21
質問です、デスクトップでユーザーフォームだけ残してエクセルは最小化する方法はありますでしょうか?

841:デフォルトの名無しさん
08/02/26 00:00:18
任意のxisファイルを2個各シートに読み込みたいのですが
どうやってもできません・・・
ファイルの読み込みってどうやればいいのでしょうか?

842:デフォルトの名無しさん
08/02/26 00:17:49
>>841
ブックを開いておいて、シートを移動すれば医院で内科医。

843:デフォルトの名無しさん
08/02/26 00:27:13
vbaを使用してRS232cで計測するはめになったんですが、エクセルのvbaはvb6のようなタイマがないので、
擬似的なタイマを作成するときに、何か注意点とか欠点教えてください

844:デフォルトの名無しさん
08/02/26 00:28:18
ご愁傷様。

845:デフォルトの名無しさん
08/02/26 00:30:47
>>842
VBAでボタンでファイルを選択って出したいのです!
でも参照とか選択ってBOXの出し方すら分かりません・・・

846:デフォルトの名無しさん
08/02/26 00:56:58
>>845
ファイルを開くダイアログ
URLリンク(www.serpress.co.jp)

847:デフォルトの名無しさん
08/02/26 01:14:15
質問です、デスクトップでユーザーフォームだけ残してエクセルは最小化する方法はありますでしょうか?

848:デフォルトの名無しさん
08/02/26 01:15:58
>>846
おお、これでBOX造れるんですね!どうも!
またちょっと頑張ってみます

849:デフォルトの名無しさん
08/02/26 07:10:38
>>847

こういう事?

Private Sub UserForm_Initialize()

Application.Visible = False
UserForm1.Show

End Sub

850:デフォルトの名無しさん
08/02/26 08:29:10
Dim a As Integer
a = Count("a1:a4")
For i = 1 To a
Beep
Next i

シートのデーター数だけ繰り返し処理したいのですが
a = Count("a1:a4")ここんとこがエラーになってしまいます。
どう処理したらいいのでしょう?




851:デフォルトの名無しさん
08/02/26 12:43:24
a = WorksheetFunction.Count(Range("a1:a4"))
でどう?
試してないけど。

852:デフォルトの名無しさん
08/02/26 16:50:49
851さん 850です。動きましたありがとうございました。


853:デフォルトの名無しさん
08/02/26 19:00:35
Renge(RefEdit1.Value)と使いたいのですが
RefEdit1.Valueを『セル範囲』かどうか調べる方法はありますでしょうか?
よろしくお願いします。

854:デフォルトの名無しさん
08/02/26 20:10:29
フォームから入力するVBAを作成しました。
プログラムを走らせ、フォームがでますが、
何も入力せずに放置するとFrame内だけが白くなります。
改善する方法はありますでしょうか?

855:デフォルトの名無しさん
08/02/26 21:57:03
830です。
>>834 さん
なるほど!。値を渡す構文になってしまっていたのですね!
>>836 さん
本当だ!動きました。ありがとうございました。
834さん。836さん。お陰様で疑問が解決しました。感謝!感謝!


856:デフォルトの名無しさん
08/02/26 22:29:04
>>854
気にすると体に毒だぞ

857:デフォルトの名無しさん
08/02/27 09:51:07
>>856
つまり対策はないと?

858:デフォルトの名無しさん
08/02/27 09:52:18
モニタの色温度を変えると白を赤っぽく変えたりできるよ

859:デフォルトの名無しさん
08/02/27 18:33:00
>>857
俺ら低レベルではわからないんだよ。

860:デフォルトの名無しさん
08/02/27 21:33:21
>>854
再現する最低限の構成で、ブックもしくはユーザーフォームモジュールをうp
情報全く無しじゃ、さすがに改善法どころか改善可能か否かすらもわからんわな

861:デフォルトの名無しさん
08/02/27 23:22:06
俺らはそれだけVBAをさわってないってことさ。


862:デフォルトの名無しさん
08/02/28 00:26:29
現実の出来事かどうかすらあやしい

863:デフォルトの名無しさん
08/02/28 05:23:21
他のフォームでも同じ現象になるのか検証したの?

864:デフォルトの名無しさん
08/03/01 04:27:20
エクセルで作った表を画像として保存するマクロってありますかねぇ?

865:デフォルトの名無しさん
08/03/01 04:55:31
>>864
VBAの範囲だけじゃ無理だけど実現可能

866:入院中の側近 ◆0351148456
08/03/01 08:15:23
>>864
(っ´▽`)っ
暇なので作ってみたよ☆

Option Explicit

Private Declare Function GetVersionExA Lib "KERNEL32.DLL" ( _
  ByRef pVersionInfo As OSVERSIONINFO _
) As Integer
Private Declare Sub keybd_event Lib "USER32.DLL" ( _
  ByVal bVk As Long, _
  ByVal bScan As Long, _
  ByVal dwFlags As Long, _
  ByVal dwExtraInfo As Long _
)
Private Const VK_SNAPSHOT As Long = &H2C
Private Const VK_MENU As Long = &H12
Private Const KEYEVENTF_KEYUP As Long = &H2

Private Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type

(次レスに続く)

867:入院中の側近 ◆0351148456
08/03/01 08:16:12
(>>866の続き)

Public Sub printScreen()
  Dim pVersionInfo As OSVERSIONINFO
  pVersionInfo.dwOSVersionInfoSize = Len(pVersionInfo)
  If pVersionInfo.dwMajorVersion >= 5 Then
    Call keybd_event(VK_SNAPSHOT, 1, 0, 0)
  Else
    Call keybd_event(VK_MENU, 0, 0, 0)
    Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0)
    Call keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0)
  End If
End Sub

868:入院中の側近 ◆0351148456
08/03/01 08:36:24
(っ´▽`)っ
>>866-867はPrintScreenするマクロだよ。
あとは任せた☆(っ´▽`)ノシ

869:デフォルトの名無しさん
08/03/01 08:41:50
割り込みで申し訳ないですが、パラレルポート制御を
考えているんですが、VBIOSCMみたいなDLLってVista対応版は
ありますか?
その他でパラレル制御の方法はありますか?
是非ご教授願います。

870:デフォルトの名無しさん
08/03/01 10:07:39
PC内のフォルダおよびファイルを全て
エクセルシートに書き出したい。
DIR関数でやってみたけど、
フォルダを見つけたら階層を掘って、掘り尽くしたら戻って…
て処理が上手く行かない。
ご協力頼んます

871:デフォルトの名無しさん
08/03/01 10:10:05
(っ´▽`)っ はプロかな?凄いな

872:入院中の側近 ◆0351148456
08/03/01 10:21:41
>>870
(っ´▽`)っ
ヒント:再帰

873:入院中の側近 ◆0351148456
08/03/01 10:28:33
>>870
(っ´▽`)っ
こういう関数を作る。

引数:フォルダ
処理
・引数のフォルダの情報をワークシートに書き出す。
・フォルダ内の全てのファイルの情報をワークシートに書き出す。
・フォルダ内の全てのサブフォルダに対し、それを引数として当関数を呼び出す。

(っ´▽`)っ
ちなみにエラーをキャッチしておかないと、
参照不可のフォルダ、ファイルのところで処理が止まるよ。

ファイル、フォルダに関してはScripting.FileSystemObjectを使うといい。

874:870
08/03/01 11:16:18
>(っ´▽`)っ
ありがとう。やってみます。

875:デフォルトの名無しさん
08/03/01 13:25:08
なんだ、ファイルを全て書き出したいと言うから中身を書き出したいのかと思ったぜ。
単にファイル名を書き出したいだけなんだな。

876:デフォルトの名無しさん
08/03/01 21:36:05
FSOに慣れておくとASPにもVBSにも使えるからオトクです(^ω^)

877:デフォルトの名無しさん
08/03/01 23:32:26
>>870
URLリンク(www.atmarkit.co.jp)

878:デフォルトの名無しさん
08/03/02 23:54:52
物凄く基本的な事で申し訳ないのですが・・・、処理待ちでスリープを掛けたく、
 WScript.sleep (250)
と記述していますが、エラー424 オブジェクトが必要です というエラーが出るのです。

何か参照設定が足りないんでしょうか。。

879:デフォルトの名無しさん
08/03/02 23:56:42
ググれよ・・・

880:デフォルトの名無しさん
08/03/03 00:01:10
>>878
WScript.exeを参照設定しろー

881:デフォルトの名無しさん
08/03/03 00:45:53
>>880
ありがとうございます。
WScript.exeを参照し、Windows Script Host(Ver5.6)を参照設定に加えたのですが
やはり同じエラー出ました。
参照の問題では無さそうなので、設定も含めた他の部分をもう一度見直して見ます。

>>879
当然質問前に検索したのですが、WScriptの参照設定について記述されたページが見つからなかったもので・・・。
すみませんでした。


882:デフォルトの名無しさん
08/03/03 01:15:50
Win32 APIのSleep関数を使えばいいじゃない。

883:デフォルトの名無しさん
08/03/03 01:22:50
>>878
それって、Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)じゃいけないの?

884:デフォルトの名無しさん
08/03/03 10:54:00
自分が過去に作ったソースをよく探すんですけど、
Excelファイルが散在してるし、開いてからAlt+F11を押す手間とか効率悪いです。
GoogleDesktopSearch用Excel VBAプラグインってないもんですかね?

885:デフォルトの名無しさん
08/03/03 11:52:08
別にプラグインじゃなくてもブックファイルからVBAを抽出するだけでもよさそうな。
まぁ、そういうものがあるかどうかって話になるけど。

886:デフォルトの名無しさん
08/03/03 11:59:12
>>885
VBAのコードは、マクロでファイルにexportできるから、作ろうと思えば比較的簡単に作れる。
ただし、そのexportしたものがGDSでIndexingされるかどうかは、別の話。

887:デフォルトの名無しさん
08/03/03 13:43:25
こう? URLリンク(officetanaka.net)
保存するとき拡張子に.txtを追加してあげればいいよね。
とりあえず何とかなりそうな気がする。どもども。

888:できたよん
08/03/03 18:53:27
VBAソースをいっぺんに吐き出すマクロ(Excel2003)
準備
・A列にファイルリストを作る
 参考:URLリンク(www.vbalab.net)
・ツール→マクロ→セキュリティ→信頼できる発行元
 のVBプロジェクトへのアクセスを信頼するをON

ext(1) = ".bas": ext(2) = ".cls": ext(3) = ".frm"
Set xl = CreateObject("Excel.application")
xl.Application.Visible = True
xl.AutomationSecurity = msoAutomationSecurityForceDisable 'マクロ無効
For i = 1 To 9999
 bookName = Cell(i, 1)
 If bookName = "" Then Exit For
 Set bk = xl.Workbooks.Open(bookName, False, True)
 With bk.VBProject.VBComponents
  For j = 1 To .Count
   If .Item(j).Type <= 3 Then _
    .Item(j).Export bookName & "_" & .Item(j).Name & ext(.Item(j).Type) & ".txt"
  Next
 End With
 bk.Close SaveChanges:=False
Next

889:デフォルトの名無しさん
08/03/04 12:34:14
すいません。KILLの使い方が分かりません。
たとえば、BOOK1のファイルごと、削除したいのですが
どうゆうコードで書いたらいいのですか?
 

890:デフォルトの名無しさん
08/03/04 12:41:43
killはファイルを消すときに使う

891:デフォルトの名無しさん
08/03/04 13:15:20
kill "your.xls"

892:デフォルトの名無しさん
08/03/04 16:57:42
Kill "BOOK1.*"

893:デフォルトの名無しさん
08/03/05 11:30:59
質問させてください。

.value = "hogeの値は" + hoge + "です"

の表記をしたいのですが、""テキストと、変数を並べて表記する方法が分かりません。
+で結合ではありませんでした。
VBAでのテキストと変数の表記方法を教えてくださいませ。

894:デフォルトの名無しさん
08/03/05 12:00:21
>>893
VBの文字列結合は &

895:デフォルトの名無しさん
08/03/05 12:44:58
Private Sub CommandButton1_Click()
Kill "BOOK1.*"
End Sub
book1のファイルのコマンドボタンでこれを実行すると、ファイルが
みつからないとエラーだでてしまうのですが・・・
ファイルをかっこよく消したいです。

896:デフォルトの名無しさん
08/03/05 13:14:45
>みつからないとエラーだでてしまうのですが・・・
かっこわりw

もしかして、ワイルドカードが使えないんじゃないの?

897:デフォルトの名無しさん
08/03/05 13:17:44
*←これでしょ?
でも使えないの・・・


898:デフォルトの名無しさん
08/03/05 14:18:02
* これを見るだけでなんか恥ずかしくなってしまうよな

899:デフォルトの名無しさん
08/03/05 14:42:21
違うの?

900:デフォルトの名無しさん
08/03/05 15:30:35
すいません、ExecuteExcel4Macroで、ループを使わずに
一気に範囲データを読み込むことは出来ないのでしょうか?

901:デフォルトの名無しさん
08/03/05 17:00:06
Dim d(100,100)AS Douale3Dim rng AS Range
rng=Range("A1:C3")
このrngから配列dに行列を入れ替えて代入する方法がわかりません。
どのようにすればよいでしょうか?

902:デフォルトの名無しさん
08/03/05 17:06:38
Excel VBAとかマジわかんないけど
If ActiveCell.Column <> 1 Then
Exit Function
End If
じゃだめなの?

903:デフォルトの名無しさん
08/03/05 17:29:47
>>901
訂正します。

Dim d(100,100)AS Double
Dim rng AS Range
rng=Range("A1:C3")

d=(double)Transport(rng)

このrngから配列dに行列を入れ替えて代入する方法がわかりません。
どのようにすればよいでしょうか?

904:デフォルトの名無しさん
08/03/05 20:34:08
>>900
おれも尻鯛

905:デフォルトの名無しさん
08/03/05 21:17:08
>>900
まずはどうしてもループが使えない事情があるなら説明してみろ
単に使いたくないとか時間が掛かるとかなら帰れ

906:900
08/03/05 21:19:31
>>905
お前に言う必要は無い。
わからないならレス不要

907:900
08/03/05 21:38:46
自己解決しました。
お前らマジ役立たず

908:900
08/03/05 21:39:40
なんだか偽者出てるみたいですが、900です。

>>905
ループで一度データをコピーするプログラムを作成したのですが、
開始から終了までかなり時間がかかってしまうことが分かりました。
処理時間を軽減できないかと考えて、範囲ごとコピーできないかと考えた
のが理由です。


909:デフォルトの名無しさん
08/03/05 21:43:04
縦横変換したものを一旦シートに貼り付けて、それから変数に代入しろ

910:デフォルトの名無しさん
08/03/06 02:28:41
>>900
速度向上のためにはSelectするな!withを使え!
Rangeで取り込んで配列に一括取り込み。


911:デフォルトの名無しさん
08/03/06 02:32:43
>>903
まず型変換して代入で可能
d=CDbl(rng)

あと行列逆転はFor〜Nextで1セル毎にループでできるが、一括でできる方法はないかな?



912:デフォルトの名無しさん
08/03/06 08:45:45
速度気にするなら、まずExecuteExcel4Macroでやろうってのが間違いだと気付け

913:デフォルトの名無しさん
08/03/06 09:06:42
>>908
ExecuteExcel4Macroなんか使って読みにくく、また他に使い途もないコードを書くより、
ADO使って"SELECT * FROM [Sheet1$]"みたいにやった方が、将来的に考えて
色々と応用できて幸せになれる確率が高いぞ


914:900
08/03/06 09:50:11
御回答ありがとうございます。
ExdcuteExcel4Macroは使わない方針でいってみたいと思います。

915:デフォルトの名無しさん
08/03/06 09:59:52
>>911
>>909

916:デフォルトの名無しさん
08/03/06 10:11:06
Publicで宣言したプロシージャを
ツール→マクロ→マクロとメニュー選択した際のダイヤログボックスに
表示させない方法があったと思うのですが、
どうやればいいでしょう????

917:初心者
08/03/06 11:40:13
初歩的な質問かと思いますが、可能な限り過去の書き込みを検索しましたが、解決できませんでしたので、質問させていただきます。

A1からA10に数値の値が入っているとします。
もしこのA1からA10までの値がすべて0だったら、○○というプログラムを実行する、というマクロを組みたいと思っています。

If Worksheets("Sheet1").Range("A1:A10") = 0 Then
Call ○○
End If

というふうに自分では作ってみたものの、うまくいきません。
アドバイスの方よろしくお願いします。


918:デフォルトの名無しさん
08/03/06 15:42:25
>>915
シート作成は速度の関係上できるかぎり避けたいのです。
関数やプロパティで行列を逆に入れ替える方法はないでしょうか?

919:デフォルトの名無しさん
08/03/06 15:47:34
>>918
計測してから物を言え。

920:デフォルトの名無しさん
08/03/06 16:12:20
>>917
dim i as integer
for i = 0 to 9
if worksheets("sheet1").range("a1")..text <> "0" then exit for
next
if i == 10 then
call ***
end if

921:デフォルトの名無しさん
08/03/06 16:13:18
あ、思いっきり間違ってた。
if worksheets("sheet1").range("a1")..offset(i,0).text <> "0" then exit for
が正解。

922:デフォルトの名無しさん
08/03/06 16:47:13
>>919
シート作成するのが通常よく使うよね。
VBAではあまり速度を問われないことがおおいから。
私もそうですし他の方法しか教えられない。

>>918
気長にVBAスペシャリストを待ちましょう。


923:919
08/03/06 16:53:13
スペシャリストの俺に喧嘩売ってんのか?

924:デフォルトの名無しさん
08/03/06 17:02:20
取りうる方法は三つしかない。
・行列を変換しながら1セルごと配列にコピー
・rangeを配列にまるごとコピーした後に、行列を変換しながら別の配列に代入
・行列を変換して別のシート(同じシートでもいいが)にコピーしてから、rangeを配列にコピー

実行する内容や量やExcelのバージョンやPCのスペックによって変わるから、
自分で測って一番速い奴を使え。

925:デフォルトの名無しさん
08/03/06 17:24:23
んなこたーない。

dim rng as range
dim d as variant
set rng = worksheets("sheet1").range("a1:c3")
d = application.worksheetfunction.transpose(rng)


926:デフォルトの名無しさん
08/03/06 18:43:57
教えて先生!!
あたしシートの追加をしたいのぉ

Sub Macro1()
Dim unko As String
unko = "ウンコ"
Sheets.Add ?????
End Sub

変数名を取得して、その変数名をシート名としたシートを追加したいというかぁ
リネームじゃなくて、ダイレクトに追加できればいいなぁとおもうの。
エロイ人おしえてーー。

927:デフォルトの名無しさん
08/03/06 20:07:32
>>901
dがVariant型でよければ、
d = WorksheetFunction.Transpose(Range("A1:C3"))
でdには縦横入れ替えた2次元配列が格納される。

928:927
08/03/06 20:10:40
よく見たら>>925でがいしゅつじゃねーか。


929:デフォルトの名無しさん
08/03/06 20:38:03
>>916
そういう時は、dummyで使わない引数をプロシジャの()の中にセットする様にしているけど邪道か?


930:デフォルトの名無しさん
08/03/06 21:14:07
>>925

dim rng as range
dim tmp as variant
dim d as double
set rng = worksheets("sheet1").range("a1:c3")
tmp = application.worksheetfunction.transpose(rng)

最後に
forループで
tmp(i,j)からCDbl(d(i,j))に代入しました。
かなり速度が改善しました。
ありがとうございました。

931:デフォルトの名無しさん
08/03/06 21:15:09
クラスを書く習慣を付ける

932:916
08/03/06 22:26:58
>>929
問題なしです!ありがとうございました!

933:デフォルトの名無しさん
08/03/06 23:06:52
>>895
book1を開きながらbook1ファイルは削除できまい。
あと、book1は何処に保存してあるのか。

934:デフォルトの名無しさん
08/03/07 00:08:32
>>931
誰に言ってるの?
必要ならつけりゃいいが、必要ない場合もある。
たとえばシートモジュールでMe.なんてウザイだけ。

935:デフォルトの名無しさん
08/03/07 00:24:40
>>934
何だよヴォケ!
クラスを明示するの当たり前だろ?
>>925みたいなコードもブックから明示してないからまだまだだね。
ブックの上のApplicationも明示しないとね。


936:デフォルトの名無しさん
08/03/07 03:21:54
相手の欠点はよくみえるが自分の欠点はみえないんだよ。
こどもじゃあるまいし、書いてることをそのまま実行したりはしないよ。
ヒントがわかれば十分。

937:926
08/03/07 05:40:25
うぅ・・・分かる方、いらっしゃいましたらhelpです・・・><

もしくは、追加→リネーム の方法がベストなのでしょうか。
bookを開いてから、何枚のシートを追加したかの監査変数を使う事が避けられれば理想なのですが・・。

皆さんどのようにしているのかも興味があります。
何卒よろしくお願いします。
お礼にこれあげます。>+(

938:デフォルトの名無しさん
08/03/07 07:08:02
>>937
sheets.Add().name="ウンコ"

939:938
08/03/07 07:12:38
>>937
試してみたら()も省略できた

sheets.Add.name="ウンコ"

940:デフォルトの名無しさん
08/03/07 08:30:45
>>937
一応マジレスしておくと、質問するならふざけるな。
ふざけないで質問してたらきっと即レスついたはずだ。

941:895
08/03/07 09:04:48
933さんありがとうございます。
>あと、book1は何処に保存してあるのか。
これは、C:\Documents and Settings\xxx
と指定すればいいのでしょうか?


942:895
08/03/07 09:17:12
それと、例えば、エクセルのファイルネーム”あ”.xlsのファイルにパスワード
を設けて(例えばパスワードは10)他の人に勝手に開かれないようにしてるのですが
人のPCのデータを除き見るやから達からデータを守る為、パスワードの入力を
例えば3回失敗したらファイルごと、どこのディレクトリに合っても強制削除したいのですが
どうコードを書いたらいいのでしょか?


943:デフォルトの名無しさん
08/03/07 10:34:01
自分自身のマクロでそれをするのは無理。


944:デフォルトの名無しさん
08/03/07 11:05:26
>>935
おろ?
君は>>925>>931じゃなかったの?
似たようなこといつも言ってるMougの馬鹿を一人知ってるんだが。
ってか彼はうるさい割にはいつもシートからしか明示しないがね。

945:925
08/03/07 11:16:26
なんだか知らんけど、俺を巻き込まないでくれ・・・

946:デフォルトの名無しさん
08/03/07 13:19:45
質問です。私の持っているVBA本に
「同一モジュール内に同名の行ラベルを設置できない」
って書いてあったので、検証しようと思い以下のサンプルコードでテストしました。

'  プロシージャ「p1」
Public Sub p1()
 On Error GoTo ErrHandler

 Err.Raise 10
 Exit Sub
ErrHandler:
 Debug.Print "エラー発生@"
End Sub

'  プロシージャ「p2」
Public Sub p2()
 On Error GoTo ErrHandler

 Err.Raise 10
 Exit Sub
ErrHandler:
 Debug.Print "エラー発生A"
End Sub

同一モジュール内にプロシージャ「p1」も「p2」も「ErrHandler:」という行ラベルを設置していますが、
それぞれの「On Error GoTo」はきちんとプロシージャ内の「ErrHandler」へ処理しています。

これってどういう事なんでしょう?
私の持ってるVBA本が間違っているのでしょうか???



947:デフォルトの名無しさん
08/03/07 13:46:18
>>946
はい、その通り間違っているので、書名を公開してみんなが不幸せになるのを防ぎましょう。

948:デフォルトの名無しさん
08/03/07 20:56:10
マクロの中で自分のファイル名(フルパスで)を取得するにはどうすればよいですか?

949:デフォルトの名無しさん
08/03/07 21:02:21
thisworkbook.pathとname

950:デフォルトの名無しさん
08/03/07 21:29:13
>>942

Sub hoge()
  Dim a As String
  Dim w As Object
  Dim v As Object
  a = ThisWorkbook.Path & "\" & ThisWorkbook.Name
  Set w = CreateObject("WScript.Shell")
  Set v = w.exec("cmd.exe /c del """ & a)
  Application.Quit
'  Do Until v.stdout.atendofstream
'    MsgBox (v.stdout.readline)
'  Loop
End Sub


951:デフォルトの名無しさん
08/03/07 22:47:43
>>950
それ、マクロ無効にすると開けちゃうから。

952:デフォルトの名無しさん
08/03/07 23:48:02
「クラスを書く習慣をつける」って書いたの俺なんだけどさ(>>935じゃない)
別件(Public云々)にレス付けたつもりだったんだが、曲解した挙げ句に意味不明な粘着を発揮してるキチガイが居るな
なんだよ「Mougにホゲホゲ」ってよ
見えない敵が見えてる系のキチガイの考えることはマジで分からんw

> 934 名前: デフォルトの名無しさん [sage] 投稿日: 2008/03/07(金) 00:08:32
> >>931
> 誰に言ってるの?
> 必要ならつけりゃいいが、必要ない場合もある。
> たとえばシートモジュールでMe.なんてウザイだけ。

> 944 名前: デフォルトの名無しさん [sage] 投稿日: 2008/03/07(金) 11:05:26
> >>935
> おろ?
> 君は>>925>>931じゃなかったの?
> 似たようなこといつも言ってるMougの馬鹿を一人知ってるんだが。
> ってか彼はうるさい割にはいつもシートからしか明示しないがね。

953:デフォルトの名無しさん
08/03/08 00:04:09
Excel2003
XP SP2

ブックを非表示にして、フォームをタスクトレイに常駐させてタイマー処理は実装可能でしょうか?

教えてエロい人

954:デフォルトの名無しさん
08/03/08 04:24:55
YES

955:944
08/03/08 04:39:19
>>952
とぼけても無駄無駄w
お前はMougでも感じ悪いけどこっちでも感じ悪いな。

956:デフォルトの名無しさん
08/03/08 05:04:10
NO

957:デフォルトの名無しさん
08/03/08 08:28:43
とぼけてるのがいるなw

958:デフォルトの名無しさん
08/03/08 12:35:40
見えない敵と戦う聖戦士がム板にも湧いてきて、粘着してくるとは思わなんだわ
悪いことは言わないからMougとやらで聖戦に興じてろや
釣りにしてもキモすぎるし、真性だとしても治療に付き合う義務はない

959:デフォルトの名無しさん
08/03/08 15:06:06
アクティブじゃないシートの選択しているセルの値ってとれないでしょうか?
シート名が特定できれば、一旦アクティブにして値をとって戻るとか出来るのですが
いろいろなシート(名)を対象に出来るようにと思っています
よろしくお願いいたします


960:デフォルトの名無しさん
08/03/08 16:48:31
>>958
いらんおせっかい書くからだよ。
つまらん自説を述べるから粘着される。

961:デフォルトの名無しさん
08/03/08 23:07:05
VBEで挿入できるものに、ユーザーフォーム、標準モジュール、クラスモジュールの3つがあるけど、
クラスモジュールだけ使ったことがない。これってどういう時に使うもんなんです?

Excel2002ですけど。

962:デフォルトの名無しさん
08/03/08 23:37:13
そのまんまクラスを書くモジュール
VBAだと継承ができないんで、独自イベントを実装したいときとか、
構造体代わりに使うとか、コントロール配列を実現させたいときに
使うぐらいしかないけどね(^ω^;)

963:961
08/03/09 08:10:28
んんん、、、判らん w スマソ まだ俺のレベルでは必要ないって事すかね www

964:デフォルトの名無しさん
08/03/09 10:25:51
ExcelVBAごときにクラスなんかいらん

965:デフォルトの名無しさん
08/03/09 10:39:07
strategy patternを使いたいときとか

966:デフォルトの名無しさん
08/03/09 15:28:15
コントロール配列を実現させたいとき=継承
だったと思うから

「継承代わりに使いたいときだけ」
しか使わん

967:デフォルトの名無しさん
08/03/09 18:58:31
CSVの書き出しに関して、教えてください。

EXCELデータを、カンマ区切りの改行コードつきCSV形式で書き出したいのです。
↓このような感じ
項目1,項目2,項目3,改行コード(vbcrlf)項目1,項目2,項目3・・・
print # でコード記述

データの最後は改行コード(vbcrlf)で終了しなくてはいけないのですが、
そうすると当然のことですが、最後に余分な空白行ができてしまいます。

改行コードで終了するが、最後の空白行はなくす、ということは可能なのでしょうか?

「もう。無理です・・・」と泣きを入れてみたのですが、なんとかしろ、
とのお達しがあり、もし、良い方法があれば伝授いただければ助かります!!

宜しくお願いします。


968:エスパー君登場
08/03/09 19:20:08
最後に余分な空白行が出来ているというのは気のせい。

969:デフォルトの名無しさん
08/03/09 19:26:29
「余分な空白行」というのは、CRLFCRLFのことだが、もしファイル末尾がそうなっているとしたら、
それはコードのバグ。
ファイルの末尾がCRLFで終わっているなら、余分な空白行など存在しない。

970:デフォルトの名無しさん
08/03/09 19:58:51
ぐぐれ 最後の改行 vb

971:デフォルトの名無しさん
08/03/09 20:08:08
ありがとうございます
「EXCEL VBA 改行コード」で検索していたのですが、
良い方法を見つけることが出来ず、悩んでいました。
頑張って挑戦してみます


972:デフォルトの名無しさん
08/03/09 20:55:39
最後の改行と余分な空白行というのは違う意味だと思う

973:デフォルトの名無しさん
08/03/09 21:06:19
>>971
ちょっと待て。何をどう挑戦するつもりなんだ?

974:側近中の側近 ◆0351148456
08/03/09 21:56:06
(っ´▽`)っ
EOF直前の改行は本来必要なものと考えるが。
たまにEOF直前の改行がないテキストファイルを見るが、あれはどうなの?
ちなみにviだとエラーメッセージが出るぞ。

975:側近中の側近 ◆0351148456
08/03/09 22:01:32
(っ´▽`)っ??? >>967のいう「余分な空白行」ってこういうことだよね?

"aaa\r\nbbb\r\nccc\r\n"(\r\nは改行コード)
これを
"aaa\r\nbbb\r\nccc"
にしたいってことでしょ?多分。
「『なんとかしろ、』とのお達しがあり」
ってあるけど、その「なんとかする」理由は何だろうね?
何もないのに言ってるなら、その人にもうちょっと勉強しろって言いたいんだけどね。

976:側近中の側近 ◆0351148456
08/03/09 22:02:33
(っ´ω`)っ
おもいっきりスレ違いだね
いきててごめんね

977:デフォルトの名無しさん
08/03/09 23:01:20
「余分な空行」という夢オチ

978:デフォルトの名無しさん
08/03/09 23:18:21
CSVファイルはRFC 4180の仕様だと、
最後のレコードの後には改行はあってもなくてもいいらしい。
オレの場合は最後のレコードの後には必ず改行付けるけどね。

979:デフォルトの名無しさん
08/03/09 23:25:11
975のようなテキストをメモ帳か何かテキストエディタで開いたとき、
aaa
bbb
ccc
I ← ここにカーソルが移動できる
ということを「最後に余分な空白行ができてしまう」と言っているんだと思った。
だとしたら、それは最後にCRLFを置いているからだとしか言いようがない。

980:デフォルトの名無しさん
08/03/10 01:26:00
excel2003
xp
他のシートの複数セルのSetの仕方がわかりません。

Dim Rng AsRange
Sheets("sheet2").Activate
Set Rng = Range(Cells(1, 1), Cells(2, 2))
Sheets("sheet1").Activate
Set Rng = Nothing
こう書けば一応動くのですがWithを使い
With Sheets("sheet2")
Set Rng = Range(.Cells(1, 1), .Cells(2, 2))
End With
と書いてもsheet1のA1: B2が入ってしまいます。
よろしくお願いします。

981:デフォルトの名無しさん
08/03/10 01:40:10
Set Rng = .Range(.Cells(1, 1), .Cells(2, 2))

982:デフォルトの名無しさん
08/03/10 02:39:29
Unix文化ではうんたらかんたら

983:デフォルトの名無しさん
08/03/10 12:48:36
「#N/A」のようなエラーセルの値を変数に入れようとすると
「型が一致しません」というエラーが出るのですが、
例えばエラーセルの値をコンスタントに、「""」として処理するような
事は可能なのでしょうか?

VBAがセルのエラー値をどのように扱っているのか、
msgboxで出すことも出来ないので
困っています。

お知恵拝借できると幸いです。

984:デフォルトの名無しさん
08/03/10 13:04:33
トラップ処理すれば

985:デフォルトの名無しさん
08/03/10 13:38:14
If(IsError(...

986:デフォルトの名無しさん
08/03/10 13:39:51
URLリンク(www.eurus.dti.ne.jp)


987:983
08/03/10 14:27:26
>>984-986
ありがとうございます。
どちらかの方法でやってみようと思います。

988:デフォルトの名無しさん
08/03/10 16:59:57
Ctrl+セルクリックで選択範囲を追加していけますよね
それをVBAで行うにはどうしたらいいですか?
例えば.Cells(i,j)が選択してある状態で、さらにCells(i+10,j)を追加で選択するにはどうしたらいいですか?

.Cells(i,j).Select
hoge
.Cells(i+10,j)Select ←ここで、それまでの選択範囲に追加する形にしたい


989:デフォルトの名無しさん
08/03/10 17:23:03
selectionでrange取得
rangeに新cellを追加
追加したrangeをselect

990:988
08/03/10 18:07:51
>>989
>rangeに新セルを追加
はどうやって実現するのですか?

991:デフォルトの名無しさん
08/03/10 19:46:03
Excel2003
XP SP2

結構でかいファイルのI/Oやコピーなどの処理をワーカースレッドで行なうことは可能でしょうか?

992:デフォルトの名無しさん
08/03/10 20:46:02
>>990
union



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

4793日前に更新/253 KB
担当:undef