Excel VBA 質問スレ Part37 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2015/06/10(水) 16:18:49.84ID:T4wZlTyk★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Applications』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
前スレ:Excel VBA 質問スレ Part36
http://peace.2ch.net/test/read.cgi/tech/1420790342/
関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0666デフォルトの名無しさん
2016/04/07(木) 23:59:01.96ID:3kkZOGoe定型作業ではないです。
ワークシートのデータとDBから取ってきたデータ(これは配列)を見比べて
ああでもないこうでもないと分析する作業とか。
0667デフォルトの名無しさん
2016/04/08(金) 00:02:37.36ID:k7lREFlm説明する能力がないならせめてソースを貼ってくれ
いちいちめんどくさい
0668デフォルトの名無しさん
2016/04/08(金) 07:43:27.06ID:R25zKOdT1.マクロ実行→IEを開いて目的のサイト開く(マクロ終了)→手作業→IE閉じる
いつも、実行中のすべてのIEを終了してから、
新規にIEを起動すればいい
@ こういう文字は、Windowsだけで使える環境依存文字だから、使わない方がいい
0669デフォルトの名無しさん
2016/04/08(金) 08:14:53.74ID:3IMa4NeZ0670デフォルトの名無しさん
2016/04/08(金) 10:09:57.63ID:DceHVCs4まあここはシフトJISだった気がするし、VBEはちゃんとUnicode扱えなかったりするけど
0671デフォルトの名無しさん
2016/04/08(金) 10:46:37.68ID:/MznQlQGそれ言うなら "→" も環境依存だな
0672デフォルトの名無しさん
2016/04/08(金) 11:52:47.59ID:PtRIyf6mコピペすると?記号になっちゃうのも地味に不便だよなあ
0673デフォルトの名無しさん
2016/04/08(金) 12:45:37.18ID:ZegRwvsH1行から新しいデータを取得して、
古いデータは下に行く流れです。
2001行になったら2001行目のデータすべて消去したいです。
よろしくお願いいたします。
0674デフォルトの名無しさん
2016/04/08(金) 13:11:25.59ID:zXNfLtBa常に2001行はデータ消すようすれば良い
0675デフォルトの名無しさん
2016/04/08(金) 13:38:43.20ID:TR3w9Zsd消せばいいじゃん。
0676デフォルトの名無しさん
2016/04/08(金) 13:40:22.53ID:rSvxtnsq0677デフォルトの名無しさん
2016/04/08(金) 13:56:07.12ID:x4BnY1md0678デフォルトの名無しさん
2016/04/08(金) 13:57:16.57ID:W7xClskh意味わからん。
vbaでやれば自動だろ。
0679デフォルトの名無しさん
2016/04/08(金) 14:08:36.83ID:Y/PwUvtg2000行まで上書きすれば良いんじゃね
0680デフォルトの名無しさん
2016/04/08(金) 14:12:30.36ID:TR3w9Zsdだから、プログラムの最後に2000行目以降2000レコード文消すコードいれりゃいいだろ。
マクロですら出来ることだぞ。
0681デフォルトの名無しさん
2016/04/08(金) 14:17:55.04ID:zXNfLtBaだよねー
0682デフォルトの名無しさん
2016/04/08(金) 14:48:15.29ID:/MznQlQGまさか全行をコピー、1行下にペースト、1行目に新しいデータを記入するしかない?
0683デフォルトの名無しさん
2016/04/08(金) 14:56:00.49ID:x4BnY1md行挿入すれば自動的に下がるだろ
0684デフォルトの名無しさん
2016/04/08(金) 15:06:00.89ID:/MznQlQGRange("2:2000").Value = Range("1:1999").Value
これでOK
0685デフォルトの名無しさん
2016/04/08(金) 15:28:51.28ID:vR3n62A20686デフォルトの名無しさん
2016/04/08(金) 15:36:19.16ID:9oewkoZU行挿入って遅いんだよね。
0687デフォルトの名無しさん
2016/04/09(土) 15:55:00.81ID:yBM+Q3VA今カーソルのある位置は? → cells(3310.77) 3310 77 ←この数値をしりたいです。
お願いします。
0688デフォルトの名無しさん
2016/04/09(土) 16:05:29.28ID:dqL4NvwQActiveCell.Row と ActiveCell.Column
0689デフォルトの名無しさん
2016/04/09(土) 16:52:52.65ID:XGWfr4Pwググれカス
そっちの方が早いぞ
0690デフォルトの名無しさん
2016/04/09(土) 19:11:29.71ID:GDJhJcuXVBAでオブジェクトをいっぱい生成しても
Javaでいうガベージコレクションは働いてるんですか?
もしそうじゃないなら勤務中に頻繁にVBAのツール使ってるんで
メモリを無駄に消費しすぎてPCの挙動が遅くなったりするのが心配で。
0691デフォルトの名無しさん
2016/04/09(土) 19:30:45.63ID:Bs+72Bdc心配性だなあ
今不都合がないならそれでいいじゃん
0692デフォルトの名無しさん
2016/04/09(土) 19:37:18.64ID:GDJhJcuXチーム内外の同僚たちもたくさんこのツールを使ってるしこれからも使うから心配なのだ。
自分は不具合なくても他のユーザーが不具合あっても文句言わないだけというのも気の毒だしプロとしてもプライドが許さない。
わたしはそういう意識高い系のプログラマです。
0693デフォルトの名無しさん
2016/04/09(土) 19:53:00.63ID:omWqeBLWどうして意味のないウソつくの?
0694デフォルトの名無しさん
2016/04/09(土) 20:51:46.13ID:oFwBMxXqOption Explicit
Sub アクティブセルの位置を調べる()
Dim 現在位置列
Dim 現在位置行
Dim アドレス
Dim 値
'ワークシートをアクティブにする ※1
現在位置列 = ActiveCell.Column 'アクティブセルの列番号
現在位置行 = ActiveCell.Row 'アクティブセルの行番号
アドレス = ActiveCell.Address 'アクティブセルのアドレス ※2
値 = ActiveCell.Value 'アクティブセルの値
MsgBox アドレス & 値
MsgBox 現在位置列 & 現在位置行
End Sub
0695デフォルトの名無しさん
2016/04/09(土) 21:07:50.44ID:NkRGPRMb0696デフォルトの名無しさん
2016/04/09(土) 21:51:44.53ID:NkRGPRMb(例)
10.xls → 10
0697デフォルトの名無しさん
2016/04/09(土) 21:53:43.85ID:omWqeBLW0698デフォルトの名無しさん
2016/04/09(土) 22:08:20.41ID:dqL4NvwQファイル名の拡張子を消したいなら
FSO(File System Object)の GetBaseName()
又は
Left(ファイル名, InStrRev(ファイル名, ".") - 1)
単純に 後ろ4文字削除したいだけなら
Left(文字列, Len(文字列) - 4)
0699デフォルトの名無しさん
2016/04/09(土) 22:31:22.73ID:omWqeBLWそれは前から数えて4文字短かい新しい文字列を作ってるだけだろ
0701デフォルトの名無しさん
2016/04/09(土) 22:38:30.19ID:dqL4NvwQご高説ありがと ではどうしたらいいの?
"ググレかす"はなして
0702デフォルトの名無しさん
2016/04/09(土) 22:40:51.92ID:dqL4NvwQ×"ググレかす"はなして
○"ググレかす"はなしで
0703デフォルトの名無しさん
2016/04/09(土) 22:44:12.54ID:omWqeBLWク グ れ か す
0704696
2016/04/09(土) 22:56:06.66ID:TesuAEt0よって ググレかすっていってる奴がカスなんだよ
わからないのかな?そこの「ググレかす」君!
0705デフォルトの名無しさん
2016/04/09(土) 23:21:33.47ID:QOjje/I20706デフォルトの名無しさん
2016/04/10(日) 03:52:45.83ID:ExCsBl9HIEの保護モードの影響で整合性レベルが切り替わる時
CreateObject("InternetExplorer.Application")
で接続したオブジェクトが無効になる。
対策方法はいくつかあるけどVBAだけで対策するなら
GetObject("new:{D5E8041D-920F-45E9-B8FB-B1DEB82C6E5E}")
で接続すればよい。
0707デフォルトの名無しさん
2016/04/10(日) 07:45:39.42ID:Lt2F89As下のコードをworksheets(1)をactiveの状態で実行したいのですが5行目で1004エラーがでます。
worksheets(2)をactiveの状態で実行するとうまくいきますが、worksheets(1)をactiveの状態で実行したいです。
5行目の範囲指定をRange("C1:C7")かColumns(3)にするとworksheets(1) activeでもうまくいきますが、
実際のデータは数千行の可変なのでRaneg()では最終行が求められませんし、Columns()では重くなるので、cellsで範囲指定したいです。
よろしくお願いします。
Sub test()
With Worksheets(2)
.AutoFilterMode = False
.Range("A1").AutoFilter Field:=2, Criteria1:="a"
.Range(Cells(1, 3), Cells(7, 3)).Copy Worksheets(1).Cells(1, 1)
End With
End Sub
0708デフォルトの名無しさん
2016/04/10(日) 07:52:07.40ID:5ptKitBG0709デフォルトの名無しさん
2016/04/10(日) 07:52:41.10ID:Fj4/7GGtまたザバーを装ったC++erか。いい加減にしとけ。
VBAにはガベージコレクションの概念はないよ。
普通はスコープが切れればそこで参照は断ち切れるから問題ないけど、
COMでやってたりするときちんとNoting設定してあげなければいけないのはjavaやC++でも同じだろう。
ま、心配なら使い終わったObjectはNotingしとけばいい。
あとこっちはVB6で出来ることは全てスレ違いらしいからな。他所でやるのが筋だろう。
0710デフォルトの名無しさん
2016/04/10(日) 07:55:32.83ID:Lt2F89Asありがとうございます。うまくいきました。
0711デフォルトの名無しさん
2016/04/10(日) 10:19:14.00ID:KQiea6Cc意識高い系
つまり、ヴァカって事ですね。ヴァカは相手にしたくないんで、消えろ小僧
0712tasukete
2016/04/10(日) 10:33:08.30ID:1I5jwrs3■概要
「そうですねabcの次はdefですね笑」
上記文章のdefにマッチさせる正規表現文字列をご教授下さい。
■ロジック
「***笑」の「***」の中に存在する「最後の」半角英数文字を取り出したい。
■現在の正規表現文字列
0714デフォルトの名無しさん
2016/04/10(日) 11:23:33.43ID:1I5jwrs3以下で解決しました。ご回答ありがとうございます。
"([0-9a-zA-Z!-~]+)([^0-9a-zA-Z!-~]*)(笑)"
0715デフォルトの名無しさん
2016/04/10(日) 15:06:06.71ID:r0zhudqC検索文字列が見つかりませんでした。エラーの原因と対処方法を次に示します。
指定された検索適用範囲の開始点から終了点までの間に、一致する文字列がありません。
検索を続ける場合は、検索の適用範囲を広げてください。
パターン マッチング式で左かっこが指定されていません。
左かっこを指定します。
詳細については、目的の項目を選択して F1 キー (Windows) または Help キー (Macintosh) を押してください。
0716デフォルトの名無しさん
2016/04/10(日) 17:42:09.90ID:h6VSGqHpどっちにしても違ってる気がするけど
0717デフォルトの名無しさん
2016/04/10(日) 19:01:22.63ID:zU852X9x1 プロパティウィンドウを表示
2 イミディエイトウィンドウを表示
3 VBEウィンドウ最大化
した状態でVBEを閉じ、次にVBEを起動しても1,2,3の状態が保持されません。
VBEを開くたびに1,2,3をするのが面倒なのですが解決策がありましたら教えて下さい。
0719デフォルトの名無しさん
2016/04/10(日) 19:32:19.02ID:Y5yf6QHK1,2,3を自動化するツールを常駐させておく
0720デフォルトの名無しさん
2016/04/10(日) 19:38:18.50ID:zU852X9x他に方法がなければそれも検討しますが・・・
他にありませんか?
0721デフォルトの名無しさん
2016/04/10(日) 19:42:11.74ID:jDmPqXB1そもそも引数の括弧の必要性が一貫してないことに意味はあるのでしょうか
0722デフォルトの名無しさん
2016/04/10(日) 19:49:43.74ID:Fj4/7GGt厳密に言うと挙動が変わっちゃう場合があるからねぇ
括弧付ける時は前にCall付けとかないとねぇ
0723デフォルトの名無しさん
2016/04/10(日) 20:53:02.90ID:TaPFtU7EVBEを閉じない
0724デフォルトの名無しさん
2016/04/10(日) 21:05:55.36ID:fppF2dqS0725デフォルトの名無しさん
2016/04/10(日) 21:30:42.88ID:h6VSGqHpLotus 1-2-3
0726デフォルトの名無しさん
2016/04/11(月) 01:07:36.81ID:mNSepyo/マイクロソフトを買収して最優先ですぐに直すように開発チームに命令する。
0727デフォルトの名無しさん
2016/04/11(月) 01:16:39.75ID:FRetIr0G0728デフォルトの名無しさん
2016/04/11(月) 06:55:56.76ID:MF2TZXcE.Value = .Value & 3
End With
空セルでこれを実行すると、1回目→3が入る・・・・16回目→なぜか0が入る。17回目→3.33333333333333E+153という値になり
期待した結果が得られません。(期待する結果としては、3333333333333333333333333と延々と続いてほしい)
実行すると、「現在のセルの値を拾って、一文字(数字)を付け足す」というのを延々と繰り返してほしいのですが、
簡単な書き方を教えてください。
よろしくお願いします。
Excel2010です。
0729デフォルトの名無しさん
2016/04/11(月) 07:07:01.65ID:siKElAn4まずそこのセルの書式はどうなってるの?
文字列でないと当然制限は受けると思うけど
後は & 3 ってなってるところを & "3"として繰り返せば要件満たせるよね
0730デフォルトの名無しさん
2016/04/11(月) 07:29:25.01ID:c3d7+hIFtextとダブルクォート使えばいいんじゃない
0731デフォルトの名無しさん
2016/04/11(月) 08:13:16.14ID:Tjd5GnSG.Text = .Text & "3"
0732デフォルトの名無しさん
2016/04/11(月) 08:31:44.40ID:gJM7Zl86それぞれに共通のプロシージャがあるとき
それをうまく単一の場所に保存して修正の必要が発生したときに修正は一ヶ所だけにするにはどうすればいいですか?
0733デフォルトの名無しさん
2016/04/11(月) 08:44:59.34ID:8qeonQG2特定のブックのマクロをどのブックからも利用可能にするには?
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv9114.html
0734デフォルトの名無しさん
2016/04/11(月) 08:47:40.18ID:Tjd5GnSGApplication.Run
注意点はここ
http://blog.sen-i.jp/vba/excel-vba-common-module-file.html
0735デフォルトの名無しさん
2016/04/11(月) 10:44:34.46ID:liIxp6L/今は手動で最新のをインポートしなきゃいけない。
0736デフォルトの名無しさん
2016/04/11(月) 15:04:40.97ID:MF2TZXcEうっかり忘れてました・・・。
>>730
>>731
.Text = .Text & "3"
にすると、オブジェクト指定しろって文句言われてダメでしたので
文字にすることで逃げました・・・
ありがとうございましすた。
0737デフォルトの名無しさん
2016/04/11(月) 15:34:57.92ID:Tjd5GnSG.Value = .Text & "3"
かな?
0738デフォルトの名無しさん
2016/04/11(月) 19:05:18.20ID:VX+C6Bv4普通のメソッドを使っても同様の機能を持たせることができてるみたいです
わざわざプロパティープロシージャを使う理由は何でしょうか
0739デフォルトの名無しさん
2016/04/11(月) 20:05:19.94ID:qE1DLczHReadOnly のプロパティなら Functionでも代用可能だね
プロパティに値を入れる時どうする?
Public変数使う? それなら
>>普通のメソッドを使っても同様の機能を持たせることができてるみたいです
↑これすら不要になるね
さてどうしましょうか?
0740デフォルトの名無しさん
2016/04/11(月) 20:53:44.76ID:8qeonQG20741デフォルトの名無しさん
2016/04/11(月) 21:24:10.68ID:liIxp6L/いやべつに記述が簡単になるだけっすよ先輩。
0742デフォルトの名無しさん
2016/04/11(月) 22:40:03.89ID:+pegrb/D実質プロパティとメソッドで出来る事に大差はないけど
使い分けについて、.NETでの解説だけど一度読んどくと良い
プロパティとメソッドの選択
https://msdn.microsoft.com/ja-jp/library/ms229054(v=vs.80).aspx
VBAかVBでの記事も見た気がするんだがみつからん
0743デフォルトの名無しさん
2016/04/11(月) 22:51:27.02ID:yNx//VK9「メンバーが型の論理属性を表す場合は、プロパティを使用することを検討してください。」
→これはちょっと難しいね。翻訳の問題だろうか?誰か教えて!
「操作が Object.ToString method などの変換操作の場合。」
なんで?いいじゃん?
0744デフォルトの名無しさん
2016/04/12(火) 00:32:03.58ID:sXpv9NYnクラス上でPublicな変数を設定することは結合度の問題があるから避けた方が良いかな。
ましてやVBAの場合、多態性を持たせるのに継承が使えないから
インターフェースを使って処理の移譲(委託)を行うことがある。
この場合、シグネチャをインターフェース上に記述しないと使用出来るプロパティやメソッドから除外されてしまう。
標準モジュール上からならまぁいいかも知れないけど、
一応記述に一貫性を持たせると言う意味合いでプロパティやメソッドにしておいた方が良いかもしれない。
けどこれは理想論であって、実際に標準モジュール上で
例えば構造体(ユーザー定義型)とかをプロパティで
引っ張り出せるかと言うと無理だったり、
難点も色々あるのも確か。
0745デフォルトの名無しさん
2016/04/12(火) 01:16:26.34ID:lRmEmyeQ0746デフォルトの名無しさん
2016/04/12(火) 02:02:23.64ID:6wI8o2z50747デフォルトの名無しさん
2016/04/12(火) 02:59:53.21ID:k6A/HJ44>一般的に、メソッドは操作を表し、プロパティはデータを表します
って書いてある通り
オブジェクトの属性はプロパティで定義する
オブジェクトそのものの操作はメソッドで定義する
って言うのが基本
一つ目はつまり
オブジェクトの属性はプロパティで定義する
って言ってるだけ
二つ目は、型変換はオブジェクトそのものの操作で属性の変更じゃないからメソッド使えってこと
0748デフォルトの名無しさん
2016/04/12(火) 08:37:48.05ID:btagnXsu0749デフォルトの名無しさん
2016/04/12(火) 08:39:09.79ID:WtnI9BntそもそもVBAでする話じゃないわなwww
0750デフォルトの名無しさん
2016/04/12(火) 08:53:38.95ID:qfYIdiLt0751デフォルトの名無しさん
2016/04/12(火) 09:00:24.79ID:BmESo+NV冗談じゃない
0752デフォルトの名無しさん
2016/04/12(火) 09:12:16.27ID:1wVIN9qnというよりそもそもVBAerはそういう話題を嫌う。理由は3つくらいあるんじゃないか。
0753デフォルトの名無しさん
2016/04/12(火) 10:56:46.57ID:tcSQ2kyUActivesheet.Shapes.Add(何書くか細かくは忘れた).Select
としたあとに
Selection.ShapeRange.Text="アホ"
としなきゃならないみたいです。
でも単純にActivesheet.Shapes.Add(何書くか細かくは忘れた).ShapeRange.Text="アホ"
とできない理由はなぜですか?
エラーが出る。
このへんのしくみがよくわからない。
0754デフォルトの名無しさん
2016/04/12(火) 11:01:32.95ID:tcSQ2kyUActiveSheet.Shapes.AddShape(msoShapeOval, 100, 100, 100, 100).Select
Selection.Characters.Text = "うんこ"
だった。
これを
ActiveSheet.Shapes.AddShape(msoShapeOval, 100, 100, 100, 100).Characters.Text = "うんこ"
とできないのはなぜ?
0755デフォルトの名無しさん
2016/04/12(火) 11:03:19.06ID:tcSQ2kyUShapeRangeってどういうときに使うんでしょう?
このへんのこと詳しく書いてる本ってないかな?
0756デフォルトの名無しさん
2016/04/12(火) 11:05:46.41ID:tcSQ2kyUそこに書かれている文字列を取得したり書き込みしたりするのにSelectを使わないでやる方法はないのですか?
0757デフォルトの名無しさん
2016/04/12(火) 11:08:01.22ID:BmESo+NV0758デフォルトの名無しさん
2016/04/12(火) 11:14:46.74ID:DUyuWo3I0759デフォルトの名無しさん
2016/04/12(火) 12:54:34.46ID:Zq/wNYgfエラーになるのはShapeにはCharactersはないから
分けると動くのは
AddShapeが返してるオブジェクトと、Selectionが返してるオブジェクトで種類が違う
前者はShape、後者はOvalとかいう隠しタイプになってるな
一発でやる方法はしらん
0760デフォルトの名無しさん
2016/04/12(火) 14:00:20.14ID:Juix7VHFありがとうございます。
さすがくわしいかたのようですね。
そういうことはどうやってお調べしましたか?
あとSelectを使わずにこの種のShapeの文字列を自由自在にコードから操る方法ってあるでしょうか?
0761デフォルトの名無しさん
2016/04/12(火) 14:22:15.40ID:4cgDrrMQ0762デフォルトの名無しさん
2016/04/12(火) 14:52:47.07ID:Juix7VHFすばらしい!
ありがとうございます。
しかしそのコードはどうやって発見しました?
それを言っていただけないと単にすごいことができるぞという自慢だけで
後輩は育たないと思うんですよ。
0763デフォルトの名無しさん
2016/04/12(火) 14:56:33.44ID:csTZz+jGhttps://msdn.microsoft.com/ja-jp/library/office/ff193908.aspx
0764デフォルトの名無しさん
2016/04/12(火) 14:57:40.62ID:Juix7VHFActiveSheet.Shapes.AddShape(msoShapeOval, 100, 100, 100, 100).TextFrame2.TextRange.Text = "しっこ"
でも同様な効果が得られるみたい。
0765デフォルトの名無しさん
2016/04/12(火) 14:59:58.93ID:Juix7VHFSub test()
Dim s As Shape
Set s = ActiveSheet.Shapes.AddShape(msoShapeOval, 100, 100, 100, 100)
s.TextFrame.Characters.Text = "うんこ"
s.TextFrame2.TextRange.Text = "しっこ"
End Sub
のサンプルコードをF8のステップイン実行で実行させてやるとどうなるでしょうか?
■ このスレッドは過去ログ倉庫に格納されています