Excel VBA質問スレ Part5at TECH
Excel VBA質問スレ Part5 - 暇つぶし2ch910:デフォルトの名無しさん
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 "エラー発生②"
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


993:デフォルトの名無しさん
08/03/10 20:52:13
勉強中の者です。初歩的な質問で申し訳ないのですが、お力添えをお願いします。

条件分岐で、"A1"セルに何か入っている場合に実行、
空欄の場合はエラーメッセージを出したく思います。

if range("A1") = true then
msgbox("実行")
else
msgbox("空欄です。")
end if

としてみたのですが、思うように動作致しません。
てっきり、false = 0 、 true は何か要素がある。と頭にあったのでやってみたのですが、
VBAの壁にぶちあたっております。

何卒、ご助力を賜りたく存じます。よろしくお願いします。

994:デフォルトの名無しさん
08/03/10 20:57:49
=""

995:デフォルトの名無しさん
08/03/10 21:21:05
If Range("a1").Value <> "" Then
MsgBox "何か入っている"
Else
MsgBox "空欄"
End If

996:デフォルトの名無しさん
08/03/10 21:35:39
false = 0 、 true = -1
0 = false、 0以外 = true


997:デフォルトの名無しさん
08/03/10 22:03:18
if Typename(Range("A1")) <> "Empty" then ~
ではどうか

998:デフォルトの名無しさん
08/03/10 22:47:48
みなさんありがとうございます。
検証してる間にスレ落ちしてしまうと申し訳ないので、お礼だけ先に。

明日検証いたします。
本当にありがとうございました。

999:デフォルトの名無しさん
08/03/11 08:20:17
.

1000:小倉優子 ◆YUKOH0W58Q
08/03/11 08:20:37
1000ならジュースでも飲むか

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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch