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


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

Excel VBA質問スレ Part10



1 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 04:56:43 ]
ExcelのVBAに関する質問スレです

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

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

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

82 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 22:01:26 ]
マクロを起動するとOUTLOOKで特定の相手にメールを送る処理って作れませんか?
OSはXP、EXCELは2003です。

83 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 22:03:33 ]
多分それが
発想の転換なんだと思っているんだと
思う

84 名前:謝礼男 [2009/03/03(火) 22:17:41 ]
解決してくれた方にはマジで現金振込みで謝礼します。
解決スピードにもよりますが2万なら余裕で出せます。というかそれ以上に困ってます。

助けてください。クビになりそうです。
マクロあんまり詳しくないのにネットで探していじってたらわからなくなりました。

■現状:会社の機密書類に誤ったPASSをかけてしまいファイルが開けず困っています。明日取引先のプレゼンで使う資料が多数あって明日朝までに開けないとマジで上司に殺される。てかクビ。
■背景:上司のPCのエクセルファイルに全部passをかけてと頼まれたが1000個くらいあったので、マクロを使ってpassをかけようとした。途中までは順調だったが途中からpassが謎なものになってしまい、開けない。
■行動:とりあえずありえそうなpassは入力。フリーソフトでpass解読試みるが解読できず。
■依頼:可能性としてマクロが誤作動したのが原因ではないかと考えられるため、マクロ詳しい方にありえそうな誤作動ぶりを解明して、パスを解明してもらいたい。詳細は↓



85 名前:謝礼男 [2009/03/03(火) 22:18:20 ]
■詳細:簡単に説明すると 
指定したフォルダ(D1)にあるエクセルファイルに指定のpass(C4)をかけるというマクロ
また別のマクロを使ってD列にはPC内のフォルダを列挙しており、上記作業が終われば次のフォルダに移動する。
で、実行したのが以下のマクロ

86 名前:謝礼男 [2009/03/03(火) 22:18:46 ]
Private Sub CommandButton1_Click()
Dim c As String
Columns("A:B").Select
Selection.ClearContents
Range("C1").Select
Selection.ClearContents
Range("A1").Select
a = Range("D1")
b = Dir(a & "\*", 2)
ChDir a
For l = 1 To 300
If b <> "" Then
Cells(l, 1).Value = b

87 名前:謝礼男 [2009/03/03(火) 22:19:32 ]

If (Right(b, 3) = "xls") Or (Right(b, 3) = "XLS") Then
c = a & "\" & b
On Error Resume Next
Workbooks.Open (c)
If Err.Number = 0 Then
Workbooks(b).Activate
ActiveWorkbook.SaveAs Filename:=c, _
FileFormat:=xlNormal, _
Password:=Range("C4").Value, WriteResPassword:="", ReadOnlyRecommended:=False, _CreateBackup:=False, _
ConflictResolution:=True
Workbooks(b).Close
Cells(l, 2) = "○"
Else
Cells(l, 2) = "×"
End If
Else
Cells(l, 2) = "×"
End If
b = Dir(, 2)
Else
l = 300
End If
Next
Cells(1, 3) = "終了"
Range("D1").Select
Selection.Delete Shift:=xlUp
End Sub


88 名前:謝礼男 [2009/03/03(火) 22:20:35 ]
■実際にした作業
・当初:マクロのとおり。ボタンクリックして、置き換えますかのyesをクリックして次へ次へ。
・途中1:そもそもパスがかかっているやつがあってそのファイルを開くpass入力求められたときは
面倒だったのでescおしてpass入力画面消して、置き換えますかのyesボタンも面倒になったのでyキー連打。
・途中2:さらにマクロ実行のコマンドボタン押すのが面倒になったので、マクロにショートカットキーをつけることに。
プライベートサブにショートカットのつけ方がわからず、
以下のマクロをプライベートサブではなくて普通のモジュールのマクロとして保存(macro1)し、macro1にショートカットキーを付加。ちなみにショートカットは ctrl+y
・途中3:↑のショートカットを使いctrl+yおしてescとyを連打する作業。

そしてその結果わかったのが。
プライベートサブでなくしてからは、passがかかっていない。(ほぼ全部)
しかし、時々passがかかっていて、なおかつ指定したpassではなくなっていた。

ってな感じでpassがわからなくなりました。
長文駄文失礼しましたが、本当に困っており、助けてくれる方をお待ちしています。
本気で謝礼いたしますので、なにとぞよろしくお願いします。

ちなみにwin2000のエクセルはなぜか97でした・・・・・

89 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 22:41:56 ]
>>88

新規ブックに

Private Sub Workbook_Open()

MsgBox "一身上の都合により退職させていただきます。" + vbCrLf + _
"僕の事は探さないで下さい。[2009/3/3]"

End Sub

90 名前:デフォルトの名無しさん [2009/03/03(火) 22:47:29 ]
解決ですな。



91 名前:デフォルトの名無しさん [2009/03/03(火) 22:49:41 ]
ざっくりと見たところ、対象xlsのC4セルでパスワードかけるんじゃね。これ。
なので、「元エクセルのC4の内容」が必要かと・・・

パス有xls触ったこと無いが・・・
デバッグで対象xls開いた後のC4が元パスになってるか見てみてくれ。



92 名前: ◆Q7C7fXiwHY mailto:sage [2009/03/03(火) 22:51:46 ]
>>84-88
シートモジュールにマクロを置いた場合、Range("C4").Valueはそのモジュールが属するシートのC4になるが
標準モジュールにマクロを置いた場合、Range("C4").Valueはアクティブシート、つまりこのコードでは
パスを掛ける対象ブックのアクティブシートのC4になる

パスを掛けたブックの内容が解らないと、具体的なパスの予測は不可能
多少なりとも内容を覚えているか予測できるなら、その値を試してみることだ

ブックを送ってくれるなら、そこらのフリーソフトより強力な強制解除を試してみても良いが、
機密書類と言うからにはそれは無理だろうし、強制解除は不正にも使えてしまうから、
強制解除方法自体を教えるのも無理だ

それに、その背景と現状でバックアップすら無いなら責任は上司の方が重いぞ

93 名前:デフォルトの名無しさん [2009/03/03(火) 22:51:49 ]
んで、解決方法だが、
Public void TaisyokuProc()みたいな処理が必要かと。

元xlsねーのか?

94 名前:謝礼男 [2009/03/03(火) 22:53:18 ]
>>91
糸口サンクス。
しかし、C4には本来のpass(仮にabc)がはいったままなんだが
開かないファイルはそのパス(abc)にはなっていないんだ。
ちなみに当初成功した分ははabcで開きます。

95 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 22:54:37 ]
OpenOfficeをダウンロードして、Excelファイルを開いてみたら?
もし、開けたら別名で保存。


96 名前:>>91 [2009/03/03(火) 22:55:30 ]
>>91
ん〜とね、

ActiveWorkbook.SaveAs Filename:=c,
FileFormat:=xlNormal, _
Password:=Range("C4").Value,

ここのrange(c4)が対象ExcelのC4内容ではないの?という意味。
つまり、対象C4で暗号化してるんではないかと・・・

97 名前:謝礼男 [2009/03/03(火) 22:56:20 ]
>>92
ありがとうございます。
91さんのおっしゃっていた事もこれ読んでちゃんと理解できました。
プライベートじゃないから 元エクセルを参照してしまったということなんですね。
自分の無知具合に唖然です。
正直元ファイルの内容はほぼわからないので、解読は不可能そうですね。

98 名前:91 [2009/03/03(火) 23:01:27 ]
グーグル先生で「excel パスワード 解除」でGigazineのやつ試してみたら?
うまくいくかもよ。がんがれ!

99 名前:デフォルトの名無しさん [2009/03/03(火) 23:07:54 ]
バイナリエディタかあらパス設定されてるワークブックを開いてみる。
そのなかからDPB=って文字列を検索してみそ。

その中のDPB=に挟まれたわけわかめの者がパス

ってのでいいんじゃないのかい????????
みなさんどうおもうよ
この惨めな男に慈悲あたえてあげようじゃないの

100 名前:デフォルトの名無しさん [2009/03/03(火) 23:33:18 ]
>>99
謝礼さんではないが、俺のExcel2000で[保存]-[ツール]のパスワードだと、DPBって無いんだが・・・
それって、マクロロックじゃまいか?
2000使ってるのは突っ込まないでくれ。軽いんだよね・・・




101 名前:デフォルトの名無しさん [2009/03/03(火) 23:43:46 ]
>>82
MAPIでググって見ればサンプルあるよ。
けど、MAPIだとOutlook系しか送信できなかったと思った。(違ったらごめん)
CDOだと送信のみOK。受信不可。
セキュリティー系の送受信するなら、BSMTP.DLL使うのが楽チン。
けれど、BSMTPやるならVBアプリ作ったほうが・・・


102 名前:デフォルトの名無しさん [2009/03/04(水) 00:02:13 ]
謝礼さん

暗号化とけないのは仕方ないでしょ。上司のBU取っとかなかったのは痛いが。
こんなんで辞職はないから大丈夫でしょ。(それこそ上司が悪い)
粘着厨といわれるからこれで退散。がんがってね!

最後にこんな感じで変数とか改行とかつけると良いかも。以上です。

'/**
' *  Excelの列番号から、A1形式の文字を返す。
' *  @param  columnNumber    Excelの列番号
' */ @return String          A1形式のExcel列番号
Private Function ColumnNumberToString(columnNumber As Integer) As String
    Dim columnString As String              '戻り値用
    Dim uBit As Integer                     '上位桁用
    Dim remain As Integer                   '余り用
   
    If columnNumber <= 26 Then                                  '列番号 <= 26 ("A" - "Z")
        columnString = Chr(columnNumber + 64)
    Else
        uBit = Int(columnNumber / 26)  '列番号 > 26 ("AA" - "ZZ")
        remain = columnNumber Mod 26  '列番号を26で割って、余りを出す
        If remain = 0 Then
            columnString = Chr(uBit + 63) & "Z 'Chr(63) = 'A'
        Else
            columnString = Chr(uBit + 64) & Chr(remain + 64)
        End If
    End If    
    ColumnNumberToString = columnString   'A1形式の列文字を返す
End Function

103 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:04:05 ]
SendKeysでOutlookを操作

104 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:54:27 ]
「そもそもパスがかかっているやつがあった」って書いてあるけど
それと自分が処理したファイルとの区別はついてるんかな?
パスのわからないファイルの更新日時は確認したの?
もともと上司がパスを設定していたのなら、謝礼男に開けなくても当然かと思う…。

105 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 21:30:16 ]
で、その後どうなったの?
報告して〜!気になるじゃん!

106 名前:82 mailto:sage [2009/03/04(水) 23:44:12 ]
>>101
サンプルは何個か見付けましたけど、これって全部なにかしらのソフトをインストールしないと
使えないんですかね?
この機能を作ってるのが、余計なソフトを入れられない会社のPCな上に
複数のPCから利用されるのを目的として作りたいんですけど。
利用するすべてのPCで何かしらインストールしないと無理なんですかね?

107 名前:101 [2009/03/04(水) 23:54:53 ]
>>82
相当昔に業務ツール作成で使っただけなので間違いがあるかもしれないが・・・

MAPI :
 特に無し。Office&OutlookExplessでOK。けど、Textの標準ソフトが秀丸とかだと動かなくなるので注意。
 それと、OutlookがPopBeforeSMTPかなんかの暗号送受信ができなかった気がする。
 MAPI対応MTUならOutlookじゃなくてもいけるはず。Beckyは無理だったと思う。
CDO:
 2000系のCOMだかで動いたかな?送信NGでXP以降NGだったから早々にあきらめた。
 .Netは違うのかな?
BSMTP:
 フリーの超有名DLL。ツールとDLLを配布すれば誰でも使える。
 このDLL自体がMTUなので、他にソフトはいらない。
 しかし、25番とかのPort制限解除が必要。(ウィルスソフトとOS ポート制限)

108 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 00:00:54 ]
>>82みたいなのってわざわざエクセルのマクロでやる必要あるんか?
ふつうにDelphiとかでアプリ作ればいいんでないの?いややり方は知らんけど
Exelファイルを添付したいとかか?


109 名前:101 [2009/03/05(木) 00:11:36 ]
個人的にはPHPで作りますかね・・・PHPは初心者ですが、簡単に作れたはず。
企業だとサーバー立てるのメンドくて無理ですね。配布の制限とか無いんですが。

まあ、Excelで集計したデータをサーバーで自動更新したいのではないかと。
サーバーAPP作って、そこにxlsを放り込むとかでもできますよね。

110 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 00:12:10 ]
>>108
操作しやすいExcelで登録した先に、スパムを送り付けたい。



111 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 02:05:57 ]
Excelって10万件ぐらいデータ入れたら重くて開くのも大変にならんか?
この程度じゃSPAM業者として成立せんだろ。2桁ぐらい少ないと思う。

Excelの操作をケータイで監視したいんじゃね?
Outlookにこだわらなければコマンドラインツールを使うとか。

112 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 02:14:28 ]
>>111
1000万件・・・

113 名前:デフォルトの名無しさん [2009/03/05(木) 07:05:36 ]
マクロを使ったWebクエリについて詳しく解説しているホームページ又は書籍を知っている人いたら教えてください。

114 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 07:55:30 ]
ところで謝礼男は生きてるのだろうか?
気になるね。

115 名前:デフォルトの名無しさん [2009/03/05(木) 12:12:01 ]
ものすごく基礎の質問で申し訳ないのですが
Editorで作ったプログラムをワークシートで使うためにはどうしたらいいのでしょうか?

116 名前:デフォルトの名無しさん [2009/03/05(木) 12:33:32 ]
>>115
VBEのこと?
ワークシートにボタン貼り付けたり、[マクロ]-[実行]でいいんじゃまいか?
違うのかな?

117 名前:デフォルトの名無しさん [2009/03/05(木) 12:50:54 ]
>>116
VBEです
ユーザーフォームでプログラムを作り、VBE上で実行はできるのですがワークシートで実行する方法がわかりません
マクロのところにも作ったプログラムは表示されてないです


118 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 12:52:44 ]
メニュー→マクロで実行できる

119 名前:デフォルトの名無しさん [2009/03/05(木) 20:38:13 ]
functionプロシージャでソルバーを使うことはできますか?
例えば
exp(x)+n*x=0   (n=1,2,3,など)
の解xを求めたいとき、nをfunctionプロシージャの引数として変化させ
ソルバーで求めたxを返したいのですが。
XP、Excel2003です。よろしくお願いします。

120 名前:デフォルトの名無しさん [2009/03/05(木) 21:05:16 ]
>>119
使ったこと無いけど、ググって見たかぎり出来ると思うよ。
教えてグーの質問見て思いました。
ttp://oshiete1.goo.ne.jp/qa1295710.html

関数の引数に対象セルの位置 or 範囲を入れればよさげだね。
後はSolverOkに引数を与えて、SolverSolveでコピペと。
マクロの記録をして、それをカスタムするのが早いと思います。

2008は駄目みたいだね。VBAが無理臭い。知らなかった。





121 名前:119 [2009/03/05(木) 22:09:13 ]
>>120さん
早速ありがとうございます。
試してみたのですが、なんかうまくいかない。。。
セルA1を =EXP(B1)+1*B1
セルC1を =test(A1,B1)
として次のプログラムを書いてみたのですが、B1の初期値を返すだけです。
Function test(y As Range, x As Range)
SolverOk SetCell:="y", MaxMinVal:=3, ValueOf:="0", ByChange:="x"
SolverSolve Userfinish:=True
test = x
End Function
できれば=EXP(B1)+1*B1もセルではなくFunctionプロシージャに記述したいのですがムリでしょうか。


122 名前:デフォルトの名無しさん [2009/03/05(木) 22:34:52 ]
>>119
引数の使い方間違ってると思う。
y As Range -> SetCell "y" では、A1:B1とかではなく、文字列"y"になる。あと、Val系引数は文字列でよいのかな?
引数をstringにするか、int x0,y0,x1,y1とかで、Range(x0 + ":" + y0)とかにしないと駄目かと。(書式とか文法は脳内変換よろ)
列番号をA1形式に変換するのは、>>102見てほしい。多分常套手段。

さっき書き忘れたけど、ソルブだっけ?はシート必須になるんじゃないかな。
何で、TempとかMacroといった作業シートが必要と思います。
さすがに関数そのものを取り込むのは無理かと。
どっかのHPで見たけど、マジでやる場合は2次方程式のルーチンを書いていたような・・・(これがソルブだよね?)




123 名前:デフォルトの名無しさん [2009/03/06(金) 00:28:08 ]
>>113
グーグル先生で[vba webクエリ]で上から10件以内でもろヒットなんだが・・・
株系がわんさか出てくるがこれじゃまいか?あまりVBAでやらないと思うが・・・

124 名前:119 [2009/03/06(金) 00:32:24 ]
>>122さん。ありがとうございます。
ちょっと煮詰まってきまして。。。
セルA1を =EXP(B1)+1*B1
としてSubプロシージャで
Sub solv()
SolverOk SetCell:="A1", MaxMinVal:=3, ValueOf:="0", ByChange:="B1"
SolverSolve Userfinish:=True
End Sub
で解を求めることは確認できたのですが(上のA1をChr(65) & Chr(49)としても大丈夫でした)、
Function test1(x)
SolverOk SetCell:="A1", MaxMinVal:=3, ValueOf:="0", ByChange:="B1"
SolverSolve Userfinish:=True
test1 = x
End Function
についてC1セルを =test1(B1)とすると
「内部エラーが発生しました。またはメモリ不足です。」
となってしまいます。
せっかく回答いただいたのですが、もうすこし考えて見ます。
ソルブはシート必須であれば最適化プログラムを自分で書かないといけないのでしょうか。

125 名前:デフォルトの名無しさん [2009/03/06(金) 01:35:21 ]
久しぶりにVBAやったら意味がわからんくて吹いたwwwCDいるしwww
引数が4個必要だから、fx組み込み関数の用には使えるのかな?ごめん。セル直内のマクロ関数作ったこと無い。
VB6の代わりにしか思ってないから・・
セル = fx(B1, B2, B3, B4)が可能なら、下記Funcの引数を変えればOkかと。

>124の最後は、循環しているから。@B1=test() Atest()かB1を読みにいく →つまり、test() B以下無限ループ。
124の引数の意味は分からんが、下記のようにやればうまくいくのでは?
使い方が良くわからんが頑張ってくれ。仕事あるので寝るよ。

'/**
' *  イチローの打率予測計算。Solverの初心者HPのを元にマクロ記録で起こす。
' */
Option Explicit

'テスト関数。
Private Sub test()
    Call TestFunc("$B$6", 3, 0.4, "$D$5")
End Sub

'Solverテスト関数。
Private Sub TestFunc( setRange As String,  maxMinval As Integer,  targetVal As Double,  changeRange As String)
    SolverOk SetCell:=setRange, _
        maxMinval:=maxMinval, _
        ValueOf:=targetVal, _
        ByChange:=changeRange
   
    SolverSolve Userfinish:=True
End Sub


126 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:42:47 ]
>>125
最小インストールかカスタムインストールでVBEを選択肢から外さない限りCDなんか使わんぞ
どうせHDDなんて有り余ってんだから男は黙ってフルインストール

127 名前:デフォルトの名無しさん [2009/03/06(金) 01:44:52 ]
>>126
Solverが追加アドインだからCD要求受けたのですわ。
基本全インスコだが、2000だからだろうか?基本VB6用でしか使わないから、アドインは良くわからん。

128 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:49:46 ]
つーか>>125じゃ使えないぞ

129 名前:デフォルトの名無しさん [2009/03/06(金) 01:54:19 ]
おいおい、俺のxp & 2000では動くぞ。
参照設定でSolverいるがなwww俺はそこで10分以上はまったwww
それに、Solver用データがシートに必要だ。
質問者さんは基本データがシートにあるから、このソースで意味は分かる。
まじで眠い。これ以上は誰かよろ

130 名前:デフォルトの名無しさん [2009/03/06(金) 01:58:13 ]
あっ、ごめん。もしかして、Privateのせいか?
外から使うならFuncをPublicでやってくれ。デバッグしかしてないから、Privateで作ってるわ。



131 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 02:21:26 ]
それだけじゃねーよ
つーか、本当にユーザー定義関数(ワークシート上から使う関数)作ったことないんだなw

132 名前:デフォルトの名無しさん [2009/03/06(金) 02:29:03 ]
>>131

(仰るとおりユーザー関数は無知です orz)

Subで作ってる理由はきちんとある。
Solverの結果がレンジの場合があるっぽいので、そういったものを単一セルで表現できるのか?
それが分かりませんでした。

なんで、質問者さんはTestFuncをPublic Functionにして利用してね。
戻り値の書き方は>>124見る限りわかるんだよね?

あとは>>131さんが教えてくれるよ。
歯磨き終わったのでおやすみなさい。

133 名前:119 [2009/03/06(金) 07:39:08 ]
みなさん寝落ちしている間にいろいろありがとうございます。
当方のやりたいイメージは以下のように方程式をfunction内で定義し
ソルバーで解いた解を返すようなプログラムなのです。
Function test(n)
y = Exp(x) + n * x
SolverOk SetCell:="y", MaxMinVal:=3, ValueOf:="0", ByChange:="x"
SolverSolve Userfinish:=True
test = x
End Function
みなさんの回答をもとにまた今晩考えてみます。

134 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 11:49:34 ]
どんだけスキル低いんだよ。125-132でFAだろjk
クレクレは帰れ



135 名前:デフォルトの名無しさん [2009/03/06(金) 15:44:31 ]
VBAのエディタって行番号を表示できないんでしょうか?
8年以上は悩んでいます。

136 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 15:53:09 ]
ないよ。俺はデフォでホイールが動かないのが悩み。

137 名前:デフォルトの名無しさん [2009/03/06(金) 15:59:36 ]
Excel VBAを勉強中なんですがちょっとつまずいでしまって。
エクセルシートに以下のように100行2列の表があるんですが、

東京 台東区
千葉 ○○町


これをFormのListBoxに表示していますが、
東京なら東京だけの情報をリスト表示したいのです。

現状はこうなっています。

UserForm_Initialize()内で
lstBox.ColumnCount = 2
lstBox.RowSource = "アドレス!A2:B103"

これを東京または千葉だけのリスト表示にするには
RowSourceをどのように記述すればいいんでしょうか?
他にいい方法などありますか・


138 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 16:27:23 ]
1 AdvancedFilter
2 1から作る
・AとBのデータ全取得
・コンボボックスでAを表示
・選択データでBを初期化

139 名前:デフォルトの名無しさん [2009/03/06(金) 17:01:26 ]
レスありがとうございます
教えていただいたことを調べてみます

140 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 17:10:23 ]
> RowSourceをどのように記述すればいいんでしょうか?
RowSourceだけではどう記述しても無理

俺だったら連想配列とクラス使って実装するが
100行くらいなら>>138でも十分だな



141 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 17:33:13 ]
>>140
んなモンにClass使うか
サブルーチンで十分

てか、
>100行くらいなら>>138でも十分だな
より、一番簡単なのが連想配列だろjk

142 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 17:43:00 ]
データ加工するなら動的配列かCollectionじゃね?
少なくとも、配列, end(xlup) end(xlleft) for ifは覚えてくれ

143 名前:デフォルトの名無しさん [2009/03/06(金) 17:56:58 ]
VBAってソートのメソッド無いよね。
○○ソートアルゴリズムでソートするってこと?

144 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 19:25:59 ]
>>143
日本語でおk。自前実装しる

145 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 19:29:34 ]
CreateObject("System.Collections.SortedList") つかえ

146 名前:143 [2009/03/06(金) 22:02:42 ]
>>145
System.Collections.SortedListは使えなかったがSystem.Collections.ArrayListが
使えた。
というか、自分の勝手な思いこみでコレを使える事を知らなかった。



キモすぎ!デブおた君の >>144

    / ̄ ̄ ̄ ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   (  人____)<日本語でおk。自前実装しる
   |./  ー◎-◎-)  \______________
   (6     (_ _) )    カタカタカタ
   | .∴ ノ  3 ノ  ______
    ゝ       ノ  .|  | ̄ ̄\ \
   /       \__|  |    | ̄ ̄|
  /  \___      |  |    |__|
  | \      |つ    |__|__/ /
  /     ̄ ̄  | ̄ ̄ ̄ ̄|  〔 ̄ ̄〕
 |       | ̄


147 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 10:39:55 ]
質問です。
単純に指定フォルダを開くモジュールを作って、プロシージャ(?)で動かしたいんですが、
以下のようにコードを書いても
「ファイルがありません」とエラーになってしまいます。
調べても書き方はあっているように思うんですが、何がいけないかお教え下さい。。。


Private Sub CommandButton1_Click()

Const pass As String = "C:\aaa"
OpenFolder (pass)

End Sub


Public Function OpenFolder(pass As String) As String

Shell "explorer" & pass, vbNormalFocus

End Function


148 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 10:46:32 ]
passじゃなくてpathな

あとは
MsgBox "explorer" & pass
でも見て見ろ
そのエラーが当然だと気付くから

つーか、この程度の確認すら出来ないってどうなのよ?

149 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 10:49:30 ]
5分ほど前にvbを始めたもんで・・・
ただこれだけの事だったとは非常に恥ずかしい。。。
サンクス

150 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 11:27:57 ]
もう一個質問。

VBとVBAって別もの?独立してるかしてないか?
エクセルからシートをフォームに見立ててボタンつけたりなんだってして、
visual basic editor開いてコード書いて・・・って普通のVBのようにモノを作ってもさ、
エクセルからしか起動できないんだよね?

普通にビルドしてexe作って単体で動かすとかはムリ?



151 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 11:57:49 ]
exe作りたければVB6買え
VBAでは当然ながらexeへのコンパイルは出来ない

多少言語が変わっても良いなら、VB.NETは無料のでexe作れる
これから始めるならVB.NETなりC#.NETなりの方がいいかもな

152 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 14:48:03 ]
vb6は店頭販売終了だからMSDN購入しかない
やっぱり無料2008落としてC#がBest
VB.NETやるならC#覚える方がのちのち楽になるよ。書き方同じだし。

153 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 14:50:41 ]
オクで正規品買えるよ
MSDNの横流しも多いが

154 名前:デフォルトの名無しさん [2009/03/07(土) 15:26:34 ]
>>146
System.Collections.ArrayListってVBAで使えるの?
.net系の定義だと思うのだが

(スレチだが、>>143の質問方法だと煽らて当然かと)

155 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 16:09:48 ]
CreateObjectしてみれば?

156 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 16:18:43 ]
参照設定の一覧の中にmscorlib.dllがある。

157 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 17:02:20 ]
>>154-156がオートメーションエラー(80131700)でNGです。誰か教えて。

2000 sp4 .net2.0
office200 sp3
参照設定にmscorlib.dll

Sub Sample1()
    Set DataList = CreateObject("System.Collections.ArrayList")
    Set DataList = Nothing
End Sub

158 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 02:28:43 ]
土曜日の仕事を金曜日にかたずけたいと思いプログラム
を考えましたが動きません。

if WeekdayName(Weekday(Date))=6 and Hour(Time) >14 then 

ActiveSheet.PageSetup.CenterHeader = "&24&B&I"+ Date +1 ’金曜日の2時以降は土曜日の日付のヘッダー
else
ActiveSheet.PageSetup.CenterHeader = "&24&B&I"+ Date ’平日は当日のヘッダー

end if
ActiveSheet.PageSetup.RightFooter = "&36&B&Uテスト"

これのどこが間違っていますか?
環境;
os xp
v 2003



159 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:14:59 ]
>>158
Debug.Print WeekdayName(Weekday(Date))

160 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:19:36 ]
>>158
Date型を文字列として足す場合は+じゃなくて&を使う



161 名前:デフォルトの名無しさん [2009/03/09(月) 21:23:07 ]
すみません教えてください。
最近会社のパソコンが新しくなったのですが
エクセル2003でコードを記入しようとすると
ツール−マクロの次が
セキュリティしか表示されません。

何か原因があるのでしょうか。

162 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:42:03 ]
>>161
alt+f11

163 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:48:59 ]
1万件Union、素人なりにがんばってみますた。うちのネットブックで6秒です。Core2のデスクトップなら2、3秒でしょう。
掲示板の行数制限とかあるんで配列の大きさとループの回数を定数にしたんで汎用性ゼロです。

Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub aaa()
 T1 = timeGetTime()
 ScreenUpdating = False
 Dim a(270) As String
 Dim si As Integer
 Dim s As String
 For i = 1 To 10000
  w = "A" & (i * 6 - 3)
  If Len(s & w) <= 255 Then
    s = s & w & ","
  Else
   a(si) = Left(s, Len(s) - 1)
   si = si + 1
   s = w & ","
  End If
 Next
 a(si) = Left(s, Len(s) - 1)
 Set r = Range(a(0))
 For i = 1 To 233 Step 29
  Set r = Union(r, Range(a(i)), Range(a(i + 1)), Range(a(i + 2)), Range(a(i + 3)), Range(a(i + 4)), Range(a(i + 5)), Range(a(i + 6)), Range(a(i + 7)), Range(a(i + 8)), Range(a(i + 9)), Range(a(i + 10)), _
      Range(a(i + 11)), Range(a(i + 12)), Range(a(i + 13)), Range(a(i + 14)), Range(a(i + 15)), Range(a(i + 16)), Range(a(i + 17)), Range(a(i + 18)), Range(a(i + 19)), Range(a(i + 20)), Range(a(i + 21)), _
      Range(a(i + 22)), Range(a(i + 23)), Range(a(i + 24)), Range(a(i + 25)), Range(a(i + 26)), Range(a(i + 27)), Range(a(i + 28)))
 Next
 Set r = Union(r, Range(a(262)), Range(a(263)), Range(a(264)), Range(a(265)), Range(a(266)), Range(a(267)), Range(a(268)), Range(a(269)), Range(a(270)))
 Cells(1, 2) = ((timeGetTime() - T1) / 1000) & "秒"
 r.Value = "うにお" '念のためテストデータ書き込み
 ScreenUpdating = True
End Sub

164 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:52:12 ]
下記のInputBoxでキャンセルしたとき
「実行時エラー'424': オブジェクトが必要です。」のエラーがでるんだけど
後続のIf文で MsgBox "NG" の処理をさせるにはどうコーディングすればいいですか?
そもそも使い方間違ってる?

Public Sub test()
  Dim c As Range
  Set c = Application.InputBox("", Type:=8)
  If c Is Nothing Then
    MsgBox "NG"
  Else
    MsgBox "OK"
  End If
End Sub

165 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:58:25 ]
on error resume next

166 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 00:07:27 ]
>>165
うまくいきました、ありがとうございます
質問なんですけど、Object型変数が空になるケースがある判定では
On Error Resume Next を事前に書いておくのが一般的なんですか?

167 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 00:31:01 ]
ふつうなんじゃね?variant で受けて

168 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 00:32:06 ]
もとい

普通なんじゃね?
variantで受けて、isobjectとかで分けても、たいして良いこと無いだろうし。

169 名前:166 mailto:sage [2009/03/10(火) 00:49:51 ]
>>168
わかりました、ありがとうございます

variantで受けて、isobjectとかで分けて〜とかもよくわからないので
もうちょい調べてみます

170 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 16:05:01 ]
Application.Cursor = xlWait
でマウスポインタが砂時計にならないのって
どういう原因が考えられるでしょうか?



171 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 17:01:30 ]
砂時計を表示するまでも無いほど短時間で終了する処理を実行した場合

172 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 20:28:06 ]
>>163
ScreenUpdating = Falseってなんや?
変数の宣言は強制せなあかん。

173 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 20:32:27 ]
Application.ScrenUpdating = False

174 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 20:51:41 ]
Application.ScrenUpdating = False は無意味だがOption Exolicit書いてないとScrenUpdating = Falseでも動くんだよなw
今回はチラチラする処理じゃないからたまたま気がつかないかも知らんが、チラチラする処理だと「何で?」となる。

175 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 21:06:33 ]
質問です。

ブックオープン時に指定フォルダのvalueを
単純にボタンのキャプションに代入して表示させようと思ったんですが、上手くいきません。

オブジェクトが不正だと言われるんですが何故でしょう。
ボタンダウンの機能として全く同じコードを記述すると問題なく動くんですが。。

176 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 21:07:29 ]

フォルダじゃなくセルでした。

177 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 21:17:59 ]
>>173
ScreenUpdating = False
だと「表示更新を止める」ではなく
ScreenUpdatingというユーザー定義変数に
Falseを代入するって動作になるって話だろ

しかも表示更新は最後の1回のみなので
表示更新止めても1回、止めなくても1回で意味無い

しかも汎用性無さ過ぎで無価値すぎて泣けてくる

178 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:56:21 ]
上のソースコードです。


Private Sub Workbook_Open()

Dim SH As Worksheet

Set SH = ThisWorkbook.Worksheets("Sheet2")
CommandButton1.Caption = SH.Range(SH.Cells(3, 2), SH.Cells(3, 2)).Value

End Sub

ThisWorkbook(コード)内に記述しています。
色々調べてはみたんですが、どうしても「CommandButton1.Caption〜」の
ところでエラーが出てしまいます。
どうかご教授願います。

179 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 00:00:39 ]
バリューじゃなく
テキストにしたら


180 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 00:07:48 ]
今度は変数が定義されていないと言われまた出来ませんでした。。。



181 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 00:10:48 ]
>>178
そのソースまんまコピペして実行したら、エラー出ずにちゃんと設定されたぞ

182 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 00:13:32 ]
>>181
一つ書き忘れていました。

sheet1にボタンがあって、
sheet2のセルから文字を読み込みたいんです。

自分はやはり同じくエラーになるんですが。。。






[ 続きを読む ] / [ 携帯版 ]

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

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