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


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

Excel VBA質問スレ Part8



1 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 23:16:33 ]
ExcelのVBAに関する質問スレです

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

★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)

426 名前:デフォルトの名無しさん [2008/10/05(日) 20:02:14 ]
ググったのですが適切な単語が思いつかなかったので質問させてください。
関数を自作しようと思ったのですが、
その関数が代入されるセルのオブジェクトを取得することは可能でしょうか?
入門サイトを一通り見たのですが、そのような記述が見つかりませんでした・・・。
可能であれば関連するキーワードか、簡単な実装方法など教えていただけるとうれしいです。

427 名前:デフォルトの名無しさん [2008/10/05(日) 20:02:53 ]
よろしくお願いします。

OS:XP、Excel2003

Module5で、Public Sub AAA() という関数を作成して
Module1で使おうとすると「名前が適切ではありません」というエラーが出ます。
Module1に関数を作成して、Module5使うことは出来ています。
これは、モジュール名の順番みたいなものが関係しているのでしょうか?


428 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 20:30:01 ]
質問です。(WinXP,Excel2003)
マルチスレッドで処理をしたいのですがうまくいきません。
以下のテストコード(スレッド系関数の宣言は省略)で、セルへの書き込み自体は問題なく出来るのですが、
エクセル終了時や保存時等ににエクセル自体が落ちてしまいます。
どこが問題なのでしょうか?ご教示お願いします。

'----モジュール------
Public Const STILL_ACTIVE As Long = 259
Public Function testThread(ByVal n As Long) As Long
  Dim i
  For i = 1 To 10
    Sheet1.Cells(1, n) = i
    DoEvents
  Next i
  testThread = 0
End Function
'----シート------
Private Sub test_Click()
  Dim hThd, idThd, dwExCode As Long
  hThd = CreateThread(0&, 0&, AddressOf testThread, 1, 0&, idThd)
  Do
    DoEvents
    If (GetExitCodeThread(hThd, dwExCode)) Then
      If (dwExCode <> STILL_ACTIVE) Then Exit Do
    End If
  Loop While True
  CloseHandle hThd
End Sub

429 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:11:43 ]
>>425
は、はぁ、、そんなかんじかと思いますがそれは記録マクロでできる作業なのでしょうか……
あまりな初級な質問ですみません

430 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:36:03 ]
作ってくださいとちゃんと言えよ、アホ

431 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:37:46 ]
>>428
ド素人がVBAでマルチスレッドを使おうとするのが問題

432 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:21:52 ]
は、はぁ、、例えばコードを書いてもらう事を作るといいますか?
作ってください!お願いします(^人^)
でももしかして記録マクロでもできる人はできるのかと思ったり(自分では無理ですが)……

何か自分の知らない簡単な方法があるような気がしてならなかったり?

433 名前:デフォルトの名無しさん [2008/10/05(日) 22:32:39 ]
コード書いてもらう事は、作る事に他ならないが・・・。
作るって、何を作る事だと思う?

と言うか、作成依頼はスレ違い。

自分でやって、分からない事を聞くようにしておくれ。

434 名前:425 mailto:sage [2008/10/05(日) 22:39:17 ]
>432
このスレのbPの
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
は見てなかったようですね。

自分は明日の夕方以降ならなんとか対応できると思いますが、急ぐんだったら
この件のやりとりの部分 を印刷でもして職場でVBAのわかる人に見せてください。
マクロの記録だけではほとんどできません。条件分岐とか繰り返しとかファイル処理とかいろいろ
あります。
あるフォルダの中のディレクトリ一覧を取得して印刷する部分だけでも↓みたいになります。
www.excel.studio-kazu.jp/mag2/backnumber/mm20041012.html



435 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:39:41 ]
皮肉もわからないとかw

436 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:44:42 ]
dirなりなんなりでファイルをリストアップして、オープンしてfindしてrange.valueに代入してセーブしてクローズする
ってだけの簡単なことなんだけど、細かいところが不明なんで丸々作るめんどくさいのでパス。

437 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:46:49 ]
>>425でわかんないなら、もうこのスレ向きの話題じゃなくなった。

438 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:47:20 ]
マァマー(´・ω・`)

439 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:08:07 ]
>>434
エクセルの学校の添付を有難うございました

私自身は忘れているとはいえ?ベーシックくらいは少し学んだのですが全く身についていないようですorz
手でやると、1回なら簡単な作業なのに文章にするとこんなにややこしくなるとは!!
ちょっとこの週末は時間がなかったのですが確かに自分であれこれ試してみたいと思います
会社では現在は時間が全くありませんがそのうち手薄になれば挑戦してみます!

440 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:30:16 ]
昔かじった言語でも、1年経つとほとんど動かせなくなるんだよね。
以前仕事で、とあるScript言語で食ってたんだけど、1年経ったら全部忘れてた。

441 名前:デフォルトの名無しさん [2008/10/05(日) 23:32:35 ]
>>426は自己解決しました。(というかバグが別の場所にあることが分かった)
で、もう一つ質問させてください。
自作関数の演算結果を複数のセルに表示したいのですが、
Function func()
func = 1
ActiveCell.Offset(1).Value = 2
End Function
こうやるとこけてしまいます。
funcの返り値でなくActiveCell.Valueに代入すると循環参照で怒られます。
どうにか解決する方法はないのでしょうか?

442 名前:427 [2008/10/05(日) 23:38:12 ]
>>427
お願いします。

443 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:54:28 ]
>>427,>>442
Module5に作成してModule1で呼ぶのも
Module1に作成してModule5で呼ぶのも
問題なく出来ている

つまり「Module5に作成してModule1で呼ぶ」こと以外に問題があるということだ
ちょっとした自分のミスに気付かず、首を捻り続けたりソフトを疑ったりなんてよくあることだ

まずは新規ブックを作成して、標準モジュールを5個挿入し
Module5にPublic Sub AAA()
Module1にAAAの呼び出しプロシージャだけ書いて実行してみろ
それでダメならExcelもしくはOfficeはたまたWindowsを再インストールした方がいい
これで問題なく実行できるなら、自分のミスに気付いてないだけだ

444 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:10:32 ]
>>440
プロの人でさえ1年で!?

なんとか頑張ってみますと書いたものの、あの業務量を思うと頑張る暇などとてもなくゆーうつ・・・

はぁー、、楽したい。。



445 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:44:55 ]
>>441
ttp://support.microsoft.com/kb/170787/ja

446 名前:441 mailto:sage [2008/10/06(月) 02:03:42 ]
>>445
こんな・・・制限が・・・あった・・・なん・・・て・・・orz
VBAなんか大っ嫌いだうわあぁぁん
ありがとうございました。本当に助かりました。

447 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:41:53 ]
厨ばっか湧いて来やがるのはなぜだ

448 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 05:32:26 ]
なんかゴネてる人さあ、、、
まずは、A6にvlookup入れて値コピーで上書きするマクロでも作ったら?
ファイル開いたり保存するのは取り敢えず手動としても、目視手作業で
入力してるよりよっぽど楽になると思う。
そこから徐々に、自動でできる部分を増やしてけばいいんじゃねーの?
あんたがVBA習得するまで仕事が待っててくれるならいいけどさ、
なんも出来ねーくせに余計なことばか考えて、自分で仕事増やしてるだけじゃね?

449 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 09:12:10 ]
>>444
月100時間勉強するのを三ヶ月位続ければ、あとは楽になるよ

450 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 19:17:30 ]
皆様お疲れ様です
>>448
それはいい考えだと、本日早速セルA6にA4を見て予め用意した表から拾って来てくれ頼む!を打ち込んだところ………
後ろにもう一枚嫌なシートがあってなんと式がセルA6にそのまま表示されてしまうていたらく
後ろのシートとなんかリンク?が貼ってあるかのような得体のしれなさでもう素直にFIND窓で目視で探しました
件数も15件くらいでしたし
他の仕事があまりに立て込んでてそのシート間の関係さえ検討できないほどの忙しさなのです

もうフラフラです
皆様も季節柄お体気をつけて!

451 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 19:30:13 ]
えーと、このスレはVBAでプログラミングする人の為のスレだから、
Excelの使い方はよそで聞いて&愚痴ってくれ。

452 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 20:24:01 ]
記録マクロで挑戦したんですよ〜 一月100時間3ヶ月をいつか夢見て……

453 名前:434 mailto:sage [2008/10/06(月) 20:52:44 ]
>408,〜,452
作ってみました。長いので2件に分けます。
' DEBUG と書かれた行はテストのためにマクロを記録しているブックのアクティブシートに
処理対象ブックのフルパス、12桁の番号、FINDで求めた9桁の番号を表示させるためのもので、
丸々1行消しても動くと思うけど、こちらでは試してません。
例外処理は入れてません。フォルダーのパスとか検索範囲とかもプログラムで直接指定してますが、
マクロを記録しているブックに設定できるようにするとメンテがラクですね。
詳しい方には添削してもらえるとありがたいです。
Option Explicit
Dim BK_M As Excel.Workbook, TATE As Long ' DEBUG
Dim BK_I As Excel.Workbook, BK_O As Excel.Workbook
Dim SEARCH_PATH As String, FILE_NAME As String

Sub prog_408()
Set BK_M = ActiveWorkbook ' DEBUG
' 参照するだけとなるブックのフルパスやファイル名は適当に変えてください。
Workbooks.Open Filename:="D:\TEST_FOLDER\PRODUCT\PRODUCT.xls"
Set BK_I = Workbooks("PRODUCT.xls")

TATE = 3 ' DEBUG
' 変更対象となる10〜40個のブックが記録されているフォルダです。
' このフォルダにはメールで送られてくるという処理対象だけのブックを置いておくこと。
SEARCH_PATH = "D:\TEST_FOLDER\"
FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal)
Do While FILE_NAME <> Empty ' 繰り返し
  Call PROC_1
Loop
BK_I.Close
Set BK_I = Nothing
Set BK_M = Nothing ' DEBUG
End Sub

454 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 20:53:51 ]
続きです。
Private Sub PROC_1()
Dim WK_PATH As String, BANGO_12 As String, BANGO_9 As String
Dim c As Excel.Range

WK_PATH = SEARCH_PATH & FILE_NAME
Workbooks.Open Filename:=WK_PATH
Set BK_O = Workbooks(FILE_NAME)
With BK_M.Worksheets(1)        ' DEBUG
  .Cells(TATE, 1).Value = WK_PATH  ' DEBUG A列に処理対象ブックのフルパスを書き込む
  BANGO_12 = BK_O.Worksheets(1).Range("A4").Value
  .Cells(TATE, 2).Value = BANGO_12 ' DEBUG B列に「12桁の番号」を書き込む
End With ' DEBUG
' 次行のA2:A41は実際のデータの開始位置と考え得る最大の範囲を指定してください。
Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues)
If c Is Nothing Then
  BANGO_9 = ""
Else
  BANGO_9 = c.Offset(0, 1).Value ' ←ここで9桁の番号が求められました
End If
BK_O.Worksheets(1).Range("A6").Value = BANGO_9 ' ←やりたいこと はこの部分です
BK_M.Worksheets(1).Cells(TATE, 3).Value = BANGO_9 ' DEBUG C列に「9桁の番号」を書き込む
BK_O.Close
Set BK_O = Nothing

TATE = TATE + 1 ' DEBUG
FILE_NAME = Dir()
End Sub



455 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 21:37:47 ]
y様に頼めば全て解決

はい次の方

456 名前:448 mailto:sage [2008/10/06(月) 21:40:19 ]
今までさんざんシートは1枚だと言ってたのは嘘か。
もうあきれて物も言えん、、、

457 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 10:54:20 ]
マンマー(´・ω・`)

458 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 22:39:19 ]
408,410,411,413,415,418,421,424,429,432,439,450,452の人はもういなくなったのかな?


459 名前:デフォルトの名無しさん [2008/10/07(火) 22:54:35 ]
初心者でおじゃまします。

:= ←これはどういう時に使うものですか?

本見てもよくわかりませんでした('A`)

460 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 23:59:42 ]
>459
詳しい人がいないようなので、未熟ながら小生がヒントを。
上の454のマクロに2カ所使ってありますが、いずれもメソッドのパラメータを指定してますね。
Workbooks.Open Filename:=WK_PATH
 →Openメソッドでフォルダのパスを指定(Openには読みとりモードも指定できますが、この場合は
  記載してないので規定値ということ)
Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues)
 →Findメソッドで値検索を指定

VBAのエディタの画面でsortメソッドのHELPを見てください。10個以上のパラメータを指定できます。
省略できるものもあるので、どのパラメータをどのように指定するかをメソッドの行の中に(見た目は
改行されていてもひとつながりなら1行とみなす)続けて書くときに必要となるものです。

こういう説明でわかりますか?

461 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 00:02:45 ]
一般に名前付き引数と呼ばれている。

462 名前:460 mailto:sage [2008/10/08(水) 00:12:19 ]
一部訂正
→Openメソッドでフォルダのパスを指定 じゃなくて、
→Openメソッドでファイルのフルパスを指定 だった。

463 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:17:17 ]
>>453-454さん
お時間を割いて頂きたいへん有難うございました
ノートに早速書き写したところなんと2頁にも及ぶなんて!(記録マクロと大違い)
段落が判らないので近い内ネカフェに印刷しに行けたら、と思っています
本当にありがとうございました
また、余りの忙しさにお礼が遅れすみませんでした



あの後記録マクロに成功し開けたり閉じたり繰り返したりができないものの、VLOOKでショートキーを使い保存までこぎつけました
目視と比べとても楽ちんでした
ところがご指摘のとおり後ろにマクロ用?のようなシートがついているせいか?セルの表示が尋常でなく無理矢理値貼付けで乗り切ったのです
その後9桁の数字が入力されたブックをマクロに通す作業がありましたので

464 名前:sage [2008/10/08(水) 21:22:35 ]
今度マクロを使って集計表を作ることになったのですが
その中でVBAという物を使うということで質問をしに来ました。

内容は集計ボタンを押すと
同フォルダ内に配置されてるエクセルのファイル名を読み取って
事前に用意されている集計表の中に概要をコピーするというものです。
集計対象のエクセルは毎週作成され、「ファイル名称(作成日付)」で作られていき
数ヶ月に一度集計ボタンを実行します。

VBA、というかプログラムは全くのド素人ですが、
どういった文法?で作れば良いかなにかヒントだけでも教えて頂ければと思いこのスレに来ました。
皆さんどうか知恵をお貸し頂けないでしょうか、宜しくお願いします。



465 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:36:56 ]
1ブックずつ再度開けて自分のマクロのみ消去するのが面倒くさく、VBAの方を開き自分のショートキーのモジュールを解放しました
間違えて人の(どのブックにも3〜5個はある)は解放してないとは思うのですが、その後マクロの消えたブックになったりならなかったり
挙句いつもきちんと実行(9桁の番号が入ったブック達を通す)できていたマクロがデバッグ

とりあえず慌てたものの優先事を片付け、再度初めからメール添付を保存しなおし今度はマクロを使わず手入力し、
手順のマクロを実行すると……………デバッグ

解放がいけなかったのでしょうか
記録マクロがいけなかったのでしょうか
黄色い行には"後ろのシートをアクティブにetc…"となっています。勿論このマクロは私が実行した記録マクロと違いえらい長く書いてある別の仕事の為のマクロです(抽出とまとめ)

466 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:41:57 ]
>>464
 >>1★5

ここは右も左も解らない奴が来るところじゃない
どういう処理がしたくて、どういうコードを書いたが、どの部分で躓いてるのかを
具体的に質問できるレベルになってから出直すか
急ぎや勉強が嫌なら、金払ってVBAコード書いてくれるところに依頼しろ

車を運転するには免許が居るように、便利な物を利用するにはそれに応じた資格(スキル)が要る
その資格無しに利便性を求めるなら、車でもタクシー使ったり運転手雇ったりするように
金使って解決しろ

467 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:48:54 ]
指定されたフォルダ中のエクセルファイルの一覧を取得する処理は、
453、454の中に書かれていますよ。
あと、434で紹介されたurlも参考になると思います。
文法云々ということであれば、エクセルVBAの入門書を入手するか、
ウェブの初心者向けサイトを調べてみてください。
それから、このスレのbPをよく読んでください。


468 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:54:43 ]
例えばデバッグの黄色い行を削除したりすればうまくいくのでしょうか

その場合保存さえしなければ誰かが作成された、いつもは健全に働くモジュールを壊す事にはなりませんよね?
いつもエラーなど発生しないのに私が要らないマクロを被せたせいで何かがどうかなったのでしょうか
自分のだけ解放しても他のマクロに影響があるのでしょうか


それだけではないのです
今日は昼飯時に453さんの回答に気づきお礼をカキコするつもりが横に置いていた鞄に散歩中の犬がしっこをかけたのです!
こんな目に遭う人がいますでしょうか

仕事もテンパリは続き少々のアルコールでは何にもなりません
皆様もこの寒暖の激しさにはお気をつけ下さい

469 名前:453,454 mailto:sage [2008/10/08(水) 22:11:56 ]
>465
まだ、私が453〜454に書いたものは実行していないと思いますが、念のため書いておきます。
上記マクロは新規ブックの標準モジュールに書いてください。(ファイル名は任意ですが、
以下の説明ではマクロブックと呼びます)
あなたが仕事で扱うブックには絶対に書かないでください。
エクセルを起動したらマクロブックを開き、ツール−マクロ−編集− prog_408 を選びます。
マクロ文中のフォルダ指定とかセル範囲などを実際のものに変更したうえで、いったん保存。
そのうえでprog_408を実行してみてください。
なお、私はWindowsXp、Excel2003で試しています。

ここまで書いたところで、468を見たので追加
465で書いてある「自分のショートキーのモジュールを解放」が気になる。そのモジュールにはあなたの
マクロだけしか書いてなかったのかな? 本当に「自分のだけ」のモジュールでしょうか?
ひとつのモジュールには複数のマクロが記録されるんですよ。
壊れてしまったものは、現場で対応してもらうしかないと思います。

470 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 22:56:33 ]
なんなの、最近の流れ

471 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 23:34:46 ]
スレbP−★5を読まない初心者ばっかり。


472 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 00:01:02 ]
469さん、ご丁寧にありがとうございました
モジュールが単独だったか複数かという事ですが、珍しくうまくいった為解放する前にモジュールを表示させて自分の記録マクロを印刷しました
そこには15行程度の構文が書かれていたのみですので下の方にもあったか?となるとおそらくなかったような……

なお記録する前に保存先を作業中のブックよりもう一つ深い範囲に適用する、を選択したと思います
これがいけなかったのかもしれません

あぁ楽をするのも大変ですね……
お先にお休みさせて頂きます。ありがとうございました。。

473 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 07:42:16 ]
過去スレですね?
現在PC環境にありませんが是非訪ねてみたいと思います! 晴れた今日も良い一日を!!

474 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 08:47:46 ]
>>473
>>1の★5のことだ・・・
マジでテンプラ読めないやつ増えてるのか?



475 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 09:51:50 ]
そりゃ犬もションベンかけるわ

476 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 10:17:49 ]
>>465
どのブックにもVBAモジュールがある…だと?
あんた、「1ブックにはそれぞれ1シートしかないから、全シートを
一旦まとめて、後でまたバラして保存すれば…」なんて書いてたよな。
それでどういうことになるのかわかってるのか?

あんたみたいなのは下手なことに手を出すな。
気づかない内に絶対まわりに迷惑かけてるから。
後始末する側の身にもなれ。

477 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 11:00:15 ]
2chで相談する前にそのブック配布したやつに相談するのが先だろ・・・
他にVBAとか入ってるなら下手したら変数名とかかぶるし

478 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 11:17:51 ]
VBAを勉強する前に、「仕事のやり方」から勉強するべき

479 名前:デフォルトの名無しさん [2008/10/09(木) 18:06:20 ]
Excel2000でメニュー(データ>並べ替え)で現在のソート状態が表示されますが
この値をVBAで取得する方法があれば教えて下さい。orz


480 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 21:21:37 ]
2chねらならVBEオブジェクトくらい使ったことあるよな

481 名前:デフォルトの名無しさん [2008/10/11(土) 03:49:58 ]
フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。
【モジュール】
Private Foo As Integer
public sub Bar(Baz As Integer)
Foo = Baz
End Sub

【フォーム】
Private Sub TextBox1_Change()
On Error Goto Err
If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then
Call Bar(TextBox1.Text)
Else
TextBox1.Text = ""
End If
Err:
If Err.Number <> 0 Then
MsgBox Err.Description
End If
End Sub


482 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:15:22 ]
いったんエラー処理はずしてどの行でエラーか書いてくれよ
まあfooかbazに入れてる値がまずいんだろう

483 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:46:33 ]
472です。その節はお世話になりました
犬に聖水をかけられた鞄は無事洗濯いたしました

ところで9桁の番号を取得した後に'抽出とりまとめ'の長いコードの最初でデバッグが出始めた話でしたが
なんと手順を間違えていたらしい事が昨日判明しました
そのとりまとめ用の長いコードを実行するにはエクセルを全部閉じておいて、マクロブックを先に開いた後
例の9桁番号を取得したブックたちを開かなければならなかったのが、9桁の事で頭いっぱいでそちらを先に開いていたのです

恐らくこれが原因だったようです。まだ1回しか成功していませんがこの、全部閉じとけよ!はどのコードだったのでしょう?
しかもそこで黄色になる訳ではないのですね??
もっと丁寧なデバッグ説明表示ならいいのに……

484 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:59:35 ]
なお、1枚だけだと思っていたのにシートがもう一枚あるもののマクロの組んであるブックはごく一部だけで全ブックではありません
ほんとに単純なシートなので高度なコード?ではないようです
デバッグが出てヒィヒィ言っていたマクロブックも長いコードながら実行できない間は手作業でカバーできるものではありました
けれど実行できればそれはそれでたいへん楽です!

なんとか仕事が手薄な時間を作り出し教えて頂いたコードに挑戦できる日がくるのを夢みて…



485 名前:469 mailto:sage [2008/10/11(土) 10:09:56 ]
>483,484

「全部閉じとけよ!はどのコードだったのでしょう?」への回答→そんなコードはない。
まさか、最大42ものブックを開いたところでマクロを実行させるつもりだったのか?
[42=マクロブック+(2列×40行のデータのブック)+メールで送られる40ブック]

FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal)
Do While FILE_NAME <> Empty ' 繰り返し
  Call PROC_1
Loop

WK_PATH = SEARCH_PATH & FILE_NAME
Workbooks.Open Filename:=WK_PATH
Set BK_O = Workbooks(FILE_NAME)

BK_O.Close
FILE_NAME = Dir()
でファイル一覧からひとつずつ開いて転記してクローズしている。
ちなみに、マクロを実行すると変更を保存するかどうかのダイアログが表示されるはず。
その際A4セルの12桁の番号に対応した9桁の番号がA6セルに入っているので確認できる。


486 名前:481 [2008/10/11(土) 12:15:07 ]
フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。
【モジュール】
Private Foo As Integer
public sub Bar(Baz As Integer)
Foo = Baz
End Sub

【フォーム】
Private Sub TextBox1_Change()
On Error Goto Err
If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then
Call Bar(TextBox1.Text)
Else
TextBox1.Text = ""
End If
Err:
If Err.Number <> 0 Then
● MsgBox Err.Description 'テキストボックスにキーボードから値を入力したとき、ここでエラーが出る。
End If
End Sub


487 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 12:45:27 ]
ByRef渡しでもVBAの方でうまくやってくれたっけ?

488 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 14:52:03 ]
>>486
だからOn Error外せって

489 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:23:17 ]
>>485
>>483-484は、まだおまいの作ったコードは実行してないと思う
ネカフェで印刷して会社へ持って行って、見ながら手打ちしてからだから、
来年ぐらいじゃないかな

490 名前:479 [2008/10/11(土) 17:48:11 ]
キーワードを変えてググってみても見つけられなかった。
VBAからソートプロパティを取得する方法は無いのでしょうか?


491 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 18:52:51 ]
>>486

テキストボックスの値を関数に渡す前にVal()で数値に
変換したら。

492 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 19:03:24 ]
>>490
> キーワードを変えてググってみても見つけられなかった。
> VBAからソートプロパティを取得する方法は無いのでしょうか?
>

ソートの設定のこと?
これならマクロの記録でできるけど。
Range.Sort Key1:= ・・・・ Order1:= ・・・・

493 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 19:10:50 ]
>492
これまでの書き込みから、ソートの「設定」ではなく「設定内容の参照」のようです。
なので、今まで回答がない。詳しい人の目にとまるまで回答はないかも。


494 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 20:58:41 ]
>>479
単純にセルの値取得すればいいだけじゃないの??



495 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 23:01:15 ]
OS: WindowsXP
Excel: 2007

チャートの目盛線のスタイルを「破線」にしたいと思っていますが、
以下のようなコードを実行しても、「長破線」になってしまいます。

ActiveChart.Axes(xlCategory).MajorGridlines.Border.LineStyle = xlDash

LineStyleの値として設定できる値(xlDash, xlDashDot, xlDashDotDotなど)を
すべて試しましたが、やはり破線にはなりませんでした。
今は、手動で「目盛線の書式設定」→「線のスタイル」→「実線/点線」から、破線に設定しています。
VBAからは、チャートの目盛り線のスタイルを破線にはできないのでしょうか?

496 名前:デフォルトの名無しさん [2008/10/12(日) 00:38:29 ]
エクセル2002 ウインドウズxp で質問!

@列を選択
AダイアログBoxに文字を入れ検索
B検索にヒットしたセルの左のセルに*を入力

具体例
@’D列・F列を選択
A’ダイアログBOXに検索したい文字 イロハ を入力
B’ イロハニホ が入力されてるセルD1の左C1と
  アイロノカニ が入力されてるセルF3の左E3に*を入力

この作業のうちAとB(例はA’B’)をマクロで効率化したいと思っています。
詳しい方、コードを教えて下さい m( )m

この板を知る前に総合相談所にカキコしてしまったことをご容赦願います。

497 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 05:46:19 ]
置換でいいじゃんd

498 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 07:07:43 ]
>>496
先に総合相談所にも謝って来いよ

499 名前:479 [2008/10/12(日) 13:44:23 ]
>>493
おっしゃる通り、ソートの設定状態を参照したいのです。

Excelの並べ替えメニューに現在のソート状態が表示されるので、何処かに
ソート状態を保持している筈なのです。
これを取得する方法が分かりません。


500 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 16:54:02 ]
>499
で、(直前に行われたであろう手動による)ソートの各種設定を参照してナニしようとしてるんですか?

501 名前:デフォルトの名無しさん [2008/10/12(日) 17:29:28 ]
>>500
シートAにデータがあり、
シートBがアクティブ時にはシートAの選択データからシートBを編集します
シートCがアクティブ時にはシートAの選択データからシートCを編集します
シートBやシートCを編集する時のシートAのソート条件が異なるので
編集できるかどうかを判断するためにソート状態を知りたいのです。

実際には、プログラム用ブックと上記のデータ用ブックに分かれていて
プログラム用ブック側でデータブックのイベントを拾って汎用的に処理
しています。


502 名前:500 mailto:sage [2008/10/12(日) 19:23:34 ]
>501
シートAは手動でソートするんですか? シートAのソートをマクロで実行して、
その際のパラメータをデータブックに記録しておけばどうですか?
シートAのソートのパターンをいくつかつくっておいてマクロ実行時選ぶように
したらいいのでは?

503 名前:デフォルトの名無しさん [2008/10/12(日) 22:26:40 ]
シートA(B&Cも)は別ブック(任意のデータブック)ですので、単独で開いて
ソートされる事も想定が必要です。

プログラムブックからデータブックを開いて、データブックに定義されている
内容によりデータブックのアクティブシートを編集しています。
データブック側にはVBAコード等の記述は不要であり、プログラムブック側に
VBAコードを記述し、データブックのイベントを拾ってデータブックの編集を
行っています。
データブックは任意のxlsファイルが指定できます。


504 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 23:42:02 ]
誰か早く無理だって言ってやれよ



505 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:01:29 ]
無理です

506 名前:503 [2008/10/13(月) 00:02:44 ]
自分も最初は無理だと思っていたのですが、メニューで現在のソート状態が表示
(Excel2000)されている事に気付いたので、取得する方法がある筈と考えた次第
です。
Excel2007を一寸見たら、現在のソート状態は表示されないみたいですね。
諦めかな...

507 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:27:16 ]
無理かどうかは知らんけど、Excelが覚えてるからといって、それを取得できる公開I/Fがあるとは限らない。

508 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:35:54 ]
二つのセルを比較して降順か昇順かしらべることはできるんじゃないの?

509 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:46:52 ]
無理です

510 名前:デフォルトの名無しさん [2008/10/13(月) 01:40:17 ]
ExcelVBAの関数のコールグラフを作成してくれるツールってある?
ちなみにDoxygen+VBFilterは関数の中は全く解析してくんなかった。


511 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:36:23 ]
フォルダにある複数の報告書のファイル名を変更したいのですが
方法を知っている方おられませんか?

報告書(Aさん)→済_報告書(Aさん)
報告書(Bさん)→済_報告書(Bさん)
報告書(Cさん)→済_報告書(Cさん)

上記のように
()内の名前が変わってもファイル名を

報告書()→済_報告書()

と変更できる方法を探しています。

何か良い方法を知っている方がいれば教えて頂けないでしょうか?
お願いします。


512 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 15:12:43 ]
ファイル名を fileName As String とすると、
まず fileName LIKE "報告書(*)" で想定した書式であることを確認した後、
fileName = "済_報告書(" & Mid(fileName,5,Len(fileName)-(4+1)) & ")"
って感じ?

513 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 16:40:36 ]
>>511
スレ違い
ファイル名変更ぐらいならRENコマンドでできる。

514 名前:512 mailto:sage [2008/10/13(月) 17:50:21 ]
この条件だと、wsh使わないと一寸厳しいとは思う。
というか、何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
違うの? >>511



515 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:51:55 ]
>>1

516 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:58:06 ]
>>511
Name ステートメント

517 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:15:55 ]
>>514さん
返信遅くなってすみません
レス有難うございます。

>>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。
最初は>>516さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が
ネックになって上手くいきませんでした。

>>513>>515さん
スレ違いでしたか、すみませんでした。

518 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 20:08:55 ]
>>506
xlsファイルフォーマットが公開されているので(英語)、
解析してソート部分の設定を読み出すコード書いたら。

519 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:24:53 ]
何がわからないのかわからなかった

520 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:42:57 ]
なんでわかってもらえないのかがわからない

521 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:54:48 ]
なんでわかってもらえると思えるのかがわからない

522 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 10:15:24 ]
>>506
ヘルプには「シートごとに保存される」
とは書いてあるがどうやって取り出すか書いてないな・・・

ところでそもそも「ソートの設定」で見ようとするのは危なくないか?
コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う
ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う

523 名前:500,502 mailto:sage [2008/10/14(火) 13:13:28 ]
>506
522に1票
>シートBやシートCを編集する時のシートAのソート条件が異なるので
>編集できるかどうかを判断するためにソート状態を知りたいのです。
とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか?
ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?

524 名前:506 [2008/10/14(火) 13:22:48 ]
基本的には保存しない前提で考えていたので、コピペは考えていませんでした。
出直します。orz




525 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 16:26:52 ]
なんで強制的にソートしちゃいけないのかな
Aが一定の条件でソートされてないとBやCの編集ができないのに、
ソートは人まかせってのが不思議
永遠にソートしてくれなかったらどうするんだろう

ソートされてるかどうかを何かのフラグとして扱うつもりなら、
それこそそんなの信用できないんじゃないの
気まぐれでソートして見てみただけかも知れないし

526 名前:デフォルトの名無しさん [2008/10/14(火) 16:57:54 ]
私の勘違いだと思うのですが、どうしても分からないのでお尋ねいたします。
文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの
があるようです。具体的な例をあげると、
"ad-02-mb.html"
"ad-02.html"
の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと
なります。マッチング処理ができなくて困っています。解決方法を
お教えください。







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

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

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