!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part68
http://2chb.net/r/tech/1598756127/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured >>1乙
前>>991です
スレ変わったのでわかる人お願いします
Excel関数のHyperLinkの処理を置き換え(APIHookのような処理)はどうすればできますか?
目的としてはHyperLink関数では一部のURLの表示が遅い(Excel自体のタイムアウト待ち?)ので
直接「CreateObject("WScript.Shell").Run URL文字列」の処理をさせたいのです
関数名はHyperLinkのままにしたいのでAPIHookのような処理ができればいいのですが Office田中のおじいちゃんはなぜ突然Youtubeの更新が止まったの?
他のExcel YouTuberを遠回しでディスったり他の講師を素人呼ばわりしてるから警告されたとか??
>>8
俺は見てないがもし糞みたいなコードがあるなら本人に「ここの部分はこうした方がいい」と伝えるか
正しい糞ではないコードを自分で広めるなりすればいいんじゃね >>9
サンプルにバグを見つけて伝えたことあるけど無視された
そのまま放置 質問掲示板(多分知恵袋)にVBAの質問してもちゃんと答えられる人は少ないですキリッ
なぜなら彼らはVBの上級者であってエクセル上級者では無いからです!ドヤッ
これ、マジであの人が発言したからね。
ここの住人の方が詳しいと思われ
あのExcelしか知らないのが超糞偉そうにしてるのを見るのもショーみたいで面白い。
周りに初心者がたくさんいるのだろうな。
そして小さなExcelの世界しか知らないから天狗のようになって自分が神であるかのように勘違いしてる。
Excelはすべての会社員が使っているので、会社員の頂点に立つ男!みたいな気分なんだろな。
ラーメン屋のオヤジがウチのラーメンが世界一だと言ってるようなもんだろ
ほっとけばいいのに
一応、MS本社に認められたんだよね日本人初のMVP受賞とか
間違っていたらすまそ
どーなんだろ??
あの人、あまり手の内見せないぽいから
最終的には自分で考える事が大事と良く言ってるし。
MSからマクロ作成の依頼されたことあるらしいし。
日本人初=世界一 ってのはどうかな
普通にできる人より詳しいのは認めるが
vbaでホットキーの下線を引くのってどうやるの?
captionに(&Q)って入れたらそのまま"(&Q)"って表示されてしまうんだが
>>8
まぁ一見糞だけど知りたいところをスパッと見て
取れるように組んであるみたいだね
あれを素晴らしいと見るのは初級者
糞と見るのは中級者
ああ、仕方なかったんだろうなぁと見るのが
上級者だろうね 具体的なコードもなしにそんなことを言ってみても意味なくない?
具体的に行動で示さなければ意味がないとも言えなくもないな
意味を具体的に言ってくれないと行動で示したことにならなくもないな
VBAのソースからエクセルを開き、
ある一つのセルに
メールアドレスを2つ
;でつないで入れようとしています。
動作中にデバッガで止めて見たときは
2つとも入ってるのに
処理終了後に保存したファイルを開くと
最初の一つしか入ってないです。
;以降が消えています。
保存処理はコレです。
Wb.SaveAs fullPath & "\" & newfilename, FileFormat:=xlWorkbookDefault
どうすればメールアドレスを2つとも保存できるでしょうか。
セルに手入力して保存して開きなおした場合は
2つとも残っています。
>>29
その保存処理の行にブレークポイントを仕掛けて、保存直前のセルの内容を確認した? シートに多数配置されたフォームボタンの余白を一括で変えたいんですが
これはどこのプロパティに入ってるんでしょうか?
図形ボタンならばTextFrameにありますが、
フォームコントロールボタンには無いので困っています
自己解決?
階層のかなり深いところあって正しいかどうかわからないけれど
目的のmargintopは変えられたのでよしとします
>>30
してませんでした
してみたら上書きしちゃってことが発覚
すみませんでした 2013でセキュリティがウンコとか言われずにシートにブラウザ埋め込む方法ない?
2003使えってのは無しで。
あとフォーム使えってのも無しで。
フォームをシートに埋め込めるならフォームでも良いけど。
正規表現使ったら複数あったIf文がひとつにまとまって便利だわ
>>39
どんな感じ?興味ある。
エクセルで式長いと読む気なくすから 新しく入った部署に一連の処理をまとめた動作が一時間かかるマクロがあったのですが
途中でたまにALTキーを押して動作が止まってないかみたほうが良いといわれましたが
ALTキーにそういう使い方がありますか?
コードを見ると2つのブック間での大量の転記がメインでしたがselectで行ったり来たりしてるのと
do eventsが目につくのと画面更新が停止になっていないのが気になりました
>>49
スクリーンセーバーとかで画面が消えているときに画面を表示させるってことじゃね
気になるなら言ったやつに聞けよ 途中で止まってないか確認が必要なツールってなんだそれww
SHIFTだった、ALTはメニューのショートカットが出るので固まっているかどうかわかるんだな
関数式びっしりのリスト表はINDIRECT関数でシート名を21年度にしたらまともに動かないようにしといた
俺の最後のあがき
オフィスがアップデートされてからめちゃめちゃ重くなったらしくて(多分2010以前から2016)
コードは流し見してみてもactivate、selectの連続なので書き方としてはダメなのは分かるのですが
オフィスのアップデートでマクロの処理時間に影響してるのはどの辺りかとおもってまして
転記マクロなんて本来速いはずなんだがな
数万行のVLOOKとかならともかく
メモリが足りてへんだけやろ
200x使ってたっていつのPCやねん
>>57
作り方による
初心者はセル一つ一つに入れていくような処理を普通に作ったりする >>57
コード読みのしんどくて処理を追うの断念しました >>58
VLOOKは時間かかるよ
参照先が数万行あるからね
そういう前提 >>55
ネッワークがヘボだと、ファイルの読み書きで止まるのも遅くなるのも普通にある。 >>64
ネットワークフォルダにあるファイルの読み書きという意味でよいですか? >>49
DoEventsとかScreenUpdatingの停止は多分普段コードに触れない人も操作する事を想定しているのだと思う。
より時間がかかったとしても画面に変化があった方が時間が短く感じるらしいよ。 >>65
そう。
読み込み途中で止まっちゃって、キャンセルボタンを押すと動きだしたり。
逆に、あーまた止まったと思ってキャンセル押すと、読み込みに失敗することも。(この場合止まってるのではなく遅いだけ)
ネットワーク関係ないなら、xlsがxlsxになった影響かも。
zip圧縮してるせいで、容量が大きいと遅くなる。 >>68
私は入ったばっかりのですが確かにネットワークのフォルダの挙動がおかしいと感じてはいます
フォルダに入ろうとすると権限メッセージが出て弾かれる、二回目はすんなり入れるなど
2、3年前にオフィス移転(システム的にも変更?)してから動作が不安定らしいです
こういう場合必要ファイルを一旦ローカルに保存してから処理を実行などの方が早いかもしれませんね コードの各所にdebug.printで処理名と時間出すようにしてイミディエイトウィンドウが見える状態でマクロ実行したらどこで固まってるか分かると思うけど
Debug.PrintってVBEを開かないと見えないじゃん
素人対策ならどっかのセルの数字とか色を適当に変化させた方がいいかも
Application.StatusBar がとっても便利
全体の処理数がわかるなら、残り(未処理)が何件あるかを表示すると多少イライラが解消される
途中でクリップボード使ったら
卑猥な言葉が混入しまちた!
ミスターTか。この人の経営してる会社、実態が無いと聞いたが
娘と親子でExcelのセミナー会社経営らしいが
すみません教えてください
Option Explicit
Private Sub UserForm_Initialize()
Dim r As Long
ComboBox1.ColumnCount = 2
For r = 1 To Range("A" & Rows.Count).End(xlUp).Row
ComboBox1.AddItem Range("A" & r).Value
ComboBox1.List(r - 1, 1) = r 'リストの2列目にシートの何行目かを記憶
Next
End Sub
Private Sub ComboBox1_Change()
Dim r As Long
Dim c As Integer
r = ComboBox1.List(ComboBox1.ListIndex, 1) '選択したリストの2列目(シートの何行目か)
ComboBox2.Clear
For c = 2 To Cells(r, Columns.Count).End(xlToLeft).Column
ComboBox2.AddItem Cells(r, c).Value
Next
End Sub
上記コードだとシート1のデータがコンボボックスに反映されるんですが
シート2のデータを反映したくて色々試したんですが解決できず
詳しい方がいましたら教えてください
単にRangeやCellsと書いたのではアクティブなシートしか参照しない
複数シートを使わない場合であっても単純なエラーを防ぐ意味でシートを指定したほうがいいと思いますよ
名前付きセルを参照する時、Range("名前")だけだとVBEから実行するときに
他のブックがアクティブになっていて"名前"のセルが無いエラーが出るんで
ThisWorkbook を指定したいんですが、RangeオブジェクトがSheetにしか無いんで
名前指定しているにも関わらず
ThisWorkbook.Sheets("sheet1").Range("名前")
みたいにするしか無いんですが
これシート指定の部分を任意にすることは出来ないんでしょうか?
ツリーからシートを選んでプロパティからオブジェクト名をよく見てみると良いよ。シート名とオブジェクト名が切り離されてる事に気付くから。
そしたら【オブジェクト名】.Cells([RowIndex],[ColumnIndex])とか【オブジェクト名】.Range(“名前”)とかでやってみ。
>>81
あとになって自分のコードが理解できなくなるに1ガバチョ >>79
そもそもシート1とかシート2とか何を言ってるんだ?
シート1というシート名のシートがあるなら、
Sheet("シート1")と指定すればいいだけだろうに、それがプログラム中に無いぞ。 質問です。
シート 1〜 最終シート全ての
「B列の14行目」 から
「B列の値のあるまとまりの最終セルの一つ前まで」
のセルの値をクリアしたいです。
下のコードで試してみたのですが、アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。
VBA覚え始めたばかりの完全初心者でどこが違うのか分からないです
すみませんが、教えてもらえませんでしょうか
Sub test()
G = Sheets.Count
For H = 1 To G
Sheets(H).Range(Range("B14"), Range("B14").End(xlDown).Offset(-1, 0)).ClearContents
Next
End Sub
Dim G As Integer, H As Integer
を冒頭に入れてもダメかえ?
入れてみましたがダメでした…
OptionExplicitも外してますので宣言の問題ではないようです
でも宣言はすべきですね…
そういやクリアコンテンツって
シートの選択から直は無理だったような?w
Sheet(H).Select
を行で独立させてみたら?
すみません、自己解決しました…
色々ありがとうございます。
Rangeの範囲指定の中のRangeにSheets(H).が抜けていたのが原因でした。
For Nextでシートが移ってもSheets(1)のRange範囲を参照するようになっていたようです・
あ、その罠かw
レンジレンジでやるとそこめんどくさいんだよな
Cellsのがいいと思う
あと>>91でもいけるんじゃないかな アクティブじゃないシート上の画像のサイズ変更すると想定と少しずれるんですが原因分かりますか?
サイズ変更する前にシートをアクティブにすると全て同じ大きさになるのでコードは合ってると思います
>>80
早速の回答ありがとうございます
For r = 1 To Range("A" & Rows.Count).End(xlUp).Row
↑
For r = 1 To Sheet("1" & Rows.Count).End(xlUp).Row
に変更したらいいのでしょうか?
初心者ですいません >>96
For r = 1 To Sheet1.Range("A" & Rows.Count).End(xlUp).Row >>97
ご教授ありがとうございます
初心者じみた質問で申し訳ありません!
ComboBox2.AddItem Sheet3.Range(r, c).Value
↑
Sheet3を参照できないのですがどこが間違っているのか理解できません
わかる方いましたらよろしくです >>98
早速変更したらできました!!
本当に感謝します
自分の初心者じみた凡ミスですね
ありがとうございます
こころの優しい御仁 ネタかと思って傍観していたが、久しぶりに質問スレっぽくてホッコリしたわ
一見相手を持ち上げてるようで馬鹿にしてるいつもの感じ
xlsで共用管理してた物品リストを
現場に飛ばされて激怒した仕事できないおばちゃんが
シートの保護にパスワードをかけてそのまま年末休みに入った
ネットで拾ったプロージャで
パスワードを解除した俺が神扱い
ユーザーフォーム1のボタンを押すと開始する処理をユーザーフォーム2から起動する方法ってない?
クラスに書いとかんとだめなのかな
>>116
そっか、たしかに標準モジュールに移植すれば良かったか >>117
Privateを取っ払ってただのSubにすれば、
UserForm1.ボタン_Clickで実行できる。 どなたかお教えください。
e-Gov法令検索
https://elaws.e-gov.go.jp/
というサイトでエクセルにリスト化されている法令を検索し,
ダウンロードすることを試みたいと考えております。
.Navigate でサイトを開き,
.document.getElementById("searchTextBox").Value = "法令名"
.document.getElementById("searchBtn").Click
で,該当の法令を検索させるまではできました。
その後,検索結果を見つけてURLを取得するところでつまずいております。
.document.getElementsByTagName
とかをどのように指定したらよいのでしょうか?
どうぞよろしくお願いいたします。 >>119
そよのサイトでリスト化されているもののダウンロードはエクセルには向いてないので
手作業でやったほうがいいだろう >>120
アドバイスありがとうございます。
しかしながら100件くらいあって,定期的にチェックして(法令が更新されることがあるので)ダウンロードするとなると
つらいです。
なんとかどうぞお願いします。 >>123
ちょっとやってみるから、何か一つ検索キーワード教えて
あと検索条件はデフォルトのままでいいの? >>124さん
どうもありがとうございます。
キーワードは
予防接種法
検索条件はデフォルトのままでいいです。
お願いします。 Ruby なら、curl コマンドとか、open-uri でダウンロードできる
require 'open-uri'
html = `curl http://何々`
url = "http://何々"
html = open( url )
puts html.read Windows 10 にも、curl が入った
コマンドプロンプトで、
where curl
と入力すると、
C:\Windows\System32\curl.exe
なら、
コマンドプロンプト
require
この3つをNGワードに追加。捗る。
URLを指定してダウンロードする方法の質問なんか誰もしてないのに、いきなり独り言
ルビー使いはあたおかだとよくわかる
名門校で球拾いより弱小校でエースのほうが楽しいから
まあ関係のない部活に来てたらウザがられるだけだが
初心者がもの凄いものをいきなり作ろうとしてここに質問すればできると思っているいつもの人
>>118
おおおお、そういうことかー
これなら標準モジュールに移植しなくても別のユーザーフォームから起動できるね
ありがとうございます!こういう豆知識待ってました privateの意味は豆知識ではなく一般常識ては?
ユーザーフォーム2からユーザーフォーム1
ボタンを押したようにできることが豆知識だったのよ
自分にとってはね
>>133
初心者ではなく初心者から脱却する気の無い人間が >>136
分かりにくくなるだろうな
そのフォーム1の処理の中にフォーム2の処理が混ざっていて・・・みたいな 単体で使いたい時もあるけど
ある処理の部品としても使いたいとかかな
それなら共通部品として切り出して
フォーム1から呼ぶ、2から呼ぶってしないと後々メンテで死ぬパターン
今FTPするのに諸事情あってwininetを利用してるんだけど
これってファイルのディレクトリ移動は無理?
ちなみにLINUXサーバ
例えば
/work/testdir/test.log
を
/work/movetodir/test.log
って感じで移動したい
コピーした後deleteすればいいのでコピーでもオッケー
今はスマホからならなので詳細ソースは勘弁して
試したのはFtpPutFileやFtpGetFileで
fromとtoをそれぞれファイル名やフルパスで入れ替えたりしてみたんだけど
まぁだめだった
FtpMoveFile的なものはないですか?
ちなみにBASPやWINSCPとかは規約上使用できないです
ない場合はローカルに一時的にgetした後別のディレクトリにPutすると言う力技も考え中
なんとなく自己解決
やはりFTPの仕様上Moveはダメっぽい
力技しか無いかなぁ
シートを開いたときにシート上のコンボボックスにリストを読み込ませたいんですけど、
シート上にある文字列を読み込むのではなくマクロのみで特定の文字列を読み込ませることって出来ますか?
DirectXのコンボボックス使えば一発でした……すみません……
ActiveXのコンボボックス2つを設置し、以下のようにシートのところに記述後、ComboBox1のプルダウンボタンをクリックすると、
実行時エラー "380":
Valueプロパティを設定できません。プロパティの値が無効です
と表示され、「ComboBox2.Value = "G6"」がハイライト表示になるのですが、対処法が分かりません。ご教授お願い致します。
---------------------------------------------------
Option Explicit
Private Sub ComboBox1_Change()
ComboBox2.Value = "G6"
End Sub
Private Sub ComboBox1_DropButtonClick()
ComboBox1.List = Array("A", "B", "C", "D")
End Sub
Private Sub ComboBox2_DropButtonClick()
If ComboBox1.Value = "A" Then
ComboBox2.ListFillRange = "G6:G9"
Else
ComboBox2.ListFillRange = "G6:G8"
End If
End Sub
すみません、Stylesプロパティが2 - fmStyleDropDownListだったからValueに代入できなかったんですね……
ComboBox2.ListIndex = 0 にしたら直りました。お目汚しすみません。
コンボ1→鈴木一郎
コンボ3→鈴木専務
鈴木部長
須藤係長
杉村課長
コンボ3には先頭一致で「す」を検索し絞り込みで表示したいのですがむずかしいでしょうか?あるいは漢字一文字で検索でもいいのですがMatchFound関数を使用するのではないかと思うのですが検討もつきません
Option Explicit
Private Sub ComboBox2_Change()
End Sub
Private Sub UserForm_Initialize()
Dim r As Long
ComboBox1.ColumnCount = 2
For r = 1 To Sheet3.Range("A" & Rows.Count).End(xlUp).Row
ComboBox1.AddItem Range("DB!A" & r).Value
ComboBox1.List(r - 1, 1) = r 'リストの2列目にシートの何行目かを記憶
Next
End Sub
Private Sub ComboBox1_Change()
Dim r As Long
Dim c As Integer
r = ComboBox1.List(ComboBox1.ListIndex, 1) '選択したリストの2列目(シートの何行目か)
ComboBox2.Clear
For c = 2 To Sheet3.Cells(r, Columns.Count).End(xlToLeft).Column
ComboBox2.AddItem Sheet3.Cells(r, c).Value
Next
End Sub
>>148
リスト全部チェックして一致したものを追加するなりシート上でフィルタした結果を追加するなりしたらいいんでないの 思ったんだが、そのコード自分で読み込んだり動き確認したりしてないだろう…
読み仮名でソートすればいいんでないの
エクセルの並び替えもこうなるし
お
大学(おおきいで変換)
か
だ
大学(だいで変換)
ぢ
すいません!
質問するレベルにも到達してなくて
シート上で一致させるなら簡単ですね
質問が趣味ではないのですが
業務で必要なもので初心者ながら悪戦苦闘しています
質問のしかたが悪かったと思います
ちょっと考えて質問したいと思います
前に質問した時も
誰かと勘違いされたような・・・
誰ですか?
VBAスレには
4回ぐらいしか書き込んだりしてないのですが?
どういった人と勘違いしてるんですか?
荒らしみたいな人いるんですか?
>>159
だからここには4回ぐらいしか来たことない
どういったら信じてくれるのかな
初めてだわ
荒らしと間違えられたの
どんな荒らしなの?
普通に書き込んでるつもりなんだけど?
何か気に入らなかった?
3日前ぐらいに書き込んだ時も勘違いされたけど
ホント勘弁して 荒らしと同じようなことを書くから間違われるのでは?
おかしな事言う人がいるな
でスルーしてたらいいと思うよ
今のままだと思うツボ
>>78
わからぬ。ホムペとかに時々セミナーの写真とか載ってるからそれを見て判断
性格まで瓜二つだからすぐわかるぜw 俺も前になんかの質問したときにいつものアイツって言われた事があったから逆になんでもかんでもいつものアイツって言いたがる荒らしが常駐してるもんだと思ってた
シートを開くと「オブジェクトが必要です。」だの「メソッドまたはデータメンバが見つかりません。」だのと表示されるんですけど、特に修正することもなく動作している(ように見える)んですけど、これ何が悪いんですかね?
PERSONALに余計な書き込みしちまっつてるんじゃね。
再表示させて全部消すんだ。
Personal.xlsですかね?
探しましたがそもそもファイル自体存在しないみたいです……
なんかよく分かんないんですけどエラー行で指定してたコンボボックスを消して再設置したら直りました
助言ありがとうございました
なんかコンボボックスってクセ強くないですか?
すごく弄りにくくてややこしいです
クセ強いって言うか、1クリックで2回イベント発動するのがなぁ・・
いちいちIf Flag Then Exit Sub とかいれて、
無理矢理1回しか動かないようにしてるけど、
他にいい方法ないもんかね
>>173
イベントハンドラは必ず先頭でEnableEvents=Falseするんだよ
そして時間のかかる処理はハンドラの中へ書かずに別プロシージャに飛ばす >>175
ごめん、1クリックで2回じゃなくて、
選択肢の表示で1回、選択で1回で計2回の間違い
なのでイベントOFFで逃げられない >>173
マジすか
もしかしてDropButtonClickイベントに.Clearと.AddItemを入れたら選択してもボックス内に表示されなかったりするのって原因それですかね >>178
そういうの作りながら動作確認しないの? ネットにサンプルがいくらでも転がってんだから、素直にコピペしとけばいいのに
直ぐにネットの野良コードを見て何も考えずにコピペコピペする人は決して【上級者】ではありません!(キリ
>>178
多分そう
>>179
最初はそんな罠があると思わないからな
俺は、間にMsgBox入れたら2回出たのでやっと気づいたわ 罠なんてのは理解してる人間が陥るものであってただの知識不足には何の関係もない
想定の動きしなかったら一つ一つ確認するのは最低限のことだ
プログラムは決して思った通りには動かず、書いた通りにしか動かない
思った通りに動かない時、それは思った通りに書けてない時
いや、Windows Update直後に動かなくなるとか普通にあるから
あとVBSだが、最近InputBoxで第1引数の文字が出ないことがある
どこかのファイルから文字を読み込んでるとかじゃなく、
引数に直接指定してるのに
起動しなおすと出るから間違ってはいない
>>125
検索結果はARTICLEタグの1番目から3番目迄(0番目は検索結果とは違うものに使用されてる。)。
その下のクラス名LawDownloadの下にクラス名pdfFileが幾つか見つかるが、その直ぐ下にAタグにhref=で始まるURLが見つかる。
どれもGetElements系で取得出来る。
最後はURLDownloadToFile使えば良いんじゃね? バッチでデスクトップを再起動する人もあまりいないと思うが
デスクトップを再起動するプロシージャ内でExcelをQuitすると、Excelが勝手に再起動する
という現象が起きるので一応報告しとくね
環境によるかも
最初からWin10のPCで、Excel2019
(Win8からのアプデPCで、Excel2013では起きなかったかも)
デスクトップを再起動するコマンドを実行してるのはShell関数
Shell関数は非同期のはずだが、その同一プロシージャ内では、APIのSleepで5秒待っても駄目
DoEventsも駄目
そのプロシージャを一旦抜けて、タイマーで5秒後にQuitを実行すればExcelが再起動しない
デスクトップを再起動するのは、とあるツールの強制終了で残るタスクバーアイコンをクリアするためで
そんな用事のある人も滅多にいないだろうけど(クリアしなくても問題があるわけでもないし)
Access VBAに比べるとExcel VBAは随分安定してるが
それでもゴリゴリ開発を繰り返すと、謎の実行エラーは起きるよね
ソースを全部エクスポートしてインポートし直すと直るやつ
結構有名なはずだが
謎は実在するのにないと言い張るのは、経験不足なだけ
話題の動作を確認したわけじゃないがね
あまり何もかもをまとめて処理するのはリスキー過ぎる
小分けにして段階を踏め
VDI環境でメモリ4ギガしか振られてないんだけど、グローバル変数を4つくらい作るとメモリ不足エラーが出て不安定になります。
割り当てるメモリを増やせばエラー収まりますか?
質問というか相談です
フォーム上のテキストボックスを右クリックした時、元の背景色が通常色の場合は黄色に、黄色の場合は通常色にと切替を行い、塗り潰しチェックの様な事が出来るようにした物を作りたいです
なのでMouseDown若しくはMouseUpで拾ってButton=2の場合に、テキストボックスの背景色を切り替える方向で行こうと考えました
MouseDownは1度のクリックで2度処理を行ってしまう為、MouseUPを使用しようと思いましたが、
正直押した瞬間ではなく離した時点なのが至極個人的に違和感バリバリなのでMouseDownでどうにか処理できないかと考えています
その場合、静的変数を用いて2回目かどうかの判定を行うのが良いのでしょうか
for eachでフィルターがかけられた列をコレクションし、現在のセルと一つ下のセルの値を比較しようと思ったのですが、offsetだと隠れた行の数値が参照されてしまいます。
フィルタリングして可視状態の一つ下のセルを参照するには、どうすればよいのでしょうか。
該当セルから下方向に、
VidibleがTrueなセルに当たるまで探せば
>>194
マウス離した時に実行するのがExcelに限らず一般的な動作だと思うが 行とか列のデータのある範囲を選択するメソッドありますか?
currentregionの1行だけみたいなイメージで
今思いつくのは無理くり
Range("C5").CurrentRegion.Offset(略).Resize(略〜
ないしは
Endとかで割り出してから選択する
とかなんですが
なんかもう少しスマートな書き方があれば知りたいです
説明捕捉
>>203
の表の列はAからD以上まである感じです columnsとかrowsプロパティで範囲から希望の列や行を取り出すじゃ駄目なの?
>>205
いや、rowsだと行全体が選ばれてしまうので
例えば
1行目は4列
2行目は5列
とデータの入っている列数がバラバラな場合
(値は全て入っているものとして)
それぞれ4列とか5列分ぴったりに選ぶメソッドは無いものかと
C列基準とかで選べたら一番いいけど
A1選んで「ctrl+shift+→」と同じ結果でもいいです すみません
>>205
のヒントで自己解決しました
Range("C5").EntireRow.SpecialCells(引数)
でいけました
失礼しました >>206
一発で求めるメソッドやプロパティはない
たとえば3行目だけ選択だと、たぶんこれが最短
Range([A3], [A3].End(xlToRight)).Select >>208
ありがとうございます
やっぱり1発ではないんですね
自分が書いたspecialcellも定数と数式とが混在してると
やはりUnionで繋ぐなどしかないので
煩雑になるなあと思っていたので
その書き方の方が良さそうですね Dirコマンド、
コマンドプロンプトに直書きだとローカルもネットワークも取れるのに、
VBAからWSHで取ると、ローカルしか取れないのは何故?
理由は知らないけど、コマンドプロンプトのDIRコマンドと、VBAのDir関数は別物です
あ、失礼いたしました
VBAのDirでなく、スクリプト経由なのか
1つ前のレスは撤回します
>>210
まあユーザ認証回りだとおもうけど
ちょっとコード晒してみて >>214
手動でコマンドプロンプトからネットが見えるか再確認した?
Windows Updateするとファイル共有が勝手にoffにされることがけっこうあるよ >>215
確認した
\\ネットワークにChr(34)入れて"\\ネットワーク"にしてもダメ
(↑半角だと書き込めない) >>214
[ネットワーク]の指定方法正しいか?
\\サーバ\共有名 でないと、\\サーバ だけではだめだぞ
手元で試したけど、うちではUNCパスでもネットワークドライブでもちゃんと動いた
ただし、パスワードは事前に保存済み
パスワード保存してないリソースはテストしてない ネットワークパス使ってファイルアクセス可能かまず調べる
>>218
\\サーバ\共有名って、\\サーバ\共有されてるフォルダ名?
それなら合ってる
ちなみに\\アドレスの数字\共有されてるフォルダ名ってのも試した
パスワードは、エクスプローラーから開くときにパスワード入れなくていい状態になってるから、
保存済だと思う うちではサンプルのままで問題なく共有フォルダのファイル一覧が出るからWSHのせいではないと思う
エラーコードやエラーメッセージは何も出てない?
Windowsのシェルを置き換えるとか、何かマニアックなカスタマイズしてる?
>>221
いや、サンプルのC:\"を\\〜に変えただけ
エラーも何もなく0文字で返ってくる
強いて言えば、試したのがVPN環境
後でVPNなしでどうなるか試してみるけど >>222
ホスト側のOSはWindows?双方にSMBは間違いなくフルセットで入れてある? >>223
Windows
SMBがどうとかは、IT部門じゃないからわからない(会社の) エラー(メッセージ)が出てないのはたぶん標準出力しかひらってないから
標準エラー出力になんか出てると思われ
つかここまでしてわざわざDirコマンド使う必要あるのか
何がやりたいんだ
>>226
サーバーの空き容量調べたいだけなんだけどね
方法は他にもあるけど、いちいちドライブ文字設定しなきゃいけないとか、
何かアドインみたいなの入れなきゃいけないとかあるし
Dirコマンドが一番シンプルだし、
batでテキスト出力するのは問題なくできるから、
それを直接変数に入れられないかなと思ったんだけど このスレでお世話になりまくった者だけど
金欲しさに工場部門の夜勤に今年から異動したからVBA触ることももうない
数年後間接部門に戻れるかわからんけど
いや戻れないだろうけど
スレの全員に感謝だわ
本当に色々教えてもらったし構文そのまま頂けた
本当にありがとう
>>231
製造現場になじめないで会社辞めるに1ガバチョ Dirコマンドの件で回答くれた皆さん
パスにUTF-8で文字化けする文字を含んでいたのが原因だったわ
しょうもないオチでごめんなさい&ありがとう
UTF-8からシフトJISに正しく変換できない文字かあ
葛飾区とか草薙とか色々あるよな
記号も〜とか¥とか半角スペースとかマイナスとか、よく使うのに化けるのがたくさんある
>>235
それを解決できない馬鹿が中途半端に書き込むなよ 知恵袋よかこっちの方がよほど親身なのは住人が優しくてイイ人ばかりだからでつか?
=TEXT(ROUNDDOWN(a1,1-INT(LOG(a1))),IF(1-LOG(a1)>0,"0."&REPT(0,1-INT(LOG(a1))),"0"))
をVBAで記述するとどうなるのか教えて欲しいです。よろしくお願いします。
a = [TEXT(ROUNDDOWN(a1,1-INT(LOG(a1))),IF(1-LOG(a1)>0,"0."&REPT(0,1-INT(LOG(a1))),"0"))]
>>240で解決してたけど、一応正攻法みたいな物
Sub 有効数字2桁()
Dim A1 As Double
Dim L As Integer
Dim S As String
Dim F As String
A1 = Range("A1")
L = 1 - Int(Log(A1) / Log(10#))
If L > 0 Then
F = F & "." & String(L, "0")
Else
F = "0"
End If
S = Format(WorksheetFunction.RoundDown(A1, L), F)
Debug.Print S
End Sub >>240
マジか・・
普通に書くか、いちいちWorksheetfunctionとか書いてたわ 質問です。
シートモジュール内で、
Private Sub Worksheet_Change(ByVal Target As Range)
For Each test In Range("他シートにある名前付きセルの名前")
Next test
End Sub
これで実行時エラー”1004” ’Range’メソッドは失敗しました:WorkSheetオブジェクト が出てしまうのですが、原因は何でしょうか。
Publicを取ってみたり、シートを指定しみたりしたんですが、変化ありません。
標準モジュールに記述してF5で実行した場合はエラー発生しません。
宜しくお願い致します。
>244
名前の適用範囲を変えてみたりもしたんですが、だめでした。
>>244
すみません、解決しました。
名前の適用範囲を参照範囲のシートあるいはブックにして、且つVBAでそのシート指定すればいけました。 >>243
In Rangeの範囲がそのシートだから、そこに名前付きセルはない
その範囲のあるシートがわかってるなら、In 他シート.Range("... のように指定するか
同一ブック内ならIn ThisWorkbook.Names("名前付きセルの名前").RefersToRange
とかでいけんじゃね @Set DB As CurrentDb
ASet DB As CurrentDb()
この二つに使い分ける意味はありますか?
@はカッコつけたい時
Aはキーボード打つのめんどくさい時
>>250>>251
ありがとう。教本読んだら2種類出てきたので、
何か違いはあるのかと思いまして。
同じだったのか…。 >>253
使い分ける意味がないのに同じでないのはないってどういう意味? ExcelのVBAにCurrentDbなんてないのは置いておくとしても
その文ってどっちもエラーになると思うんだが
あ、すみません…
AccessVBAのスレってあったんですね。
申し訳ない。
あと1As」 って書いちゃってたけど「=」
訂正
あと「As」って書いちゃってたけど当然「=」でした
Accessで試したけどどっちも通って同じ結果だな
俺の予想では2はデフォルトプロパティの呼び出しになると思ったんだが
引数省略したら、かっこそのものも除去されて評価されてるのかもしれん
つかその教本ってなんだ?
>>255
この例は同じ結果になってるけど、その二つはまったく同じではないよ
Accessで違いが出る例
Dim DB
Dim CurrentDb As Database
Set CurrentDb = Application.CurrentDb
Set DB = CurrentDb
MsgBox TypeName(DB)
Set DB = CurrentDb()
MsgBox TypeName(DB)
まあCurrentDbとかいう変数名は少なくともVBAではお勧めできないけどな CurrentDb自体を変数にするとか、それはもう別の話では
前提を絞らなければ、動作に違いが出るかどうかの話だから別の話じゃない
変数名の良し悪しに関してはまあ別だが
つかその教本とやらを曝せ
俺的にはデータベースのインスタンスを取得する目的で後者の書き方とかなら、そっちのほうが問題だわ
実際にはやらない無理な方法で無理矢理話を混ぜ返したいだけで、
そもそも意図を汲んでない
初心者です
オートシェイプの名前を検索して置換できるコードを教えてください
調べてもオートシェイプ内のテキスト変換しかありません
お願いします
>>264
オートシェイプの個数は
sheets("Sheet1").shapes.count
名前は
sheets("Sheet1").shapes(1).name それはすでに使ってるシェイプの名前だろう
使ってない奴から選びたいんだろう
>>265
返信ありがとうございます
下記のオートシェイプに入力されたテキストを検索して置換するコードじゃなくてオートシェイプの名前を検索して置換したいのですがどこを直せばいいのでしょうか
Sub 置換() Dim tbox As Object Dim findStr As String Dim replaceStr As String Dim count As Long Dim i As Long Dim myDocument As Worksheet findStr = InputBox("置換対象文字列") replaceStr = InputBox("置換文字") Set myDocument = Worksheets(1) myDocument.Shapes.SelectAll
For i = 1 To myDocument.Shapes.count If myDocument.Shapes(i).Type = msoGroup Then Selection.ShapeRange.Ungroup.Select For Each tbox In Selection.ShapeRange tbox.TextFrame.Characters.Text = _ Replace(tbox.TextFrame.Characters.Text, findStr, replaceStr)
Next Selection.ShapeRange.Regroup.Select Else
Set tbox = myDocument.Shapes(i).TextFrame tbox.Characters.Text = _ Replace(tbox.Characters.Text, findStr, replaceStr)
End If
Next
End Sub 質問です。よろしくお願いいたします。
VBA でスクレイピングを行っています
対象ページ:https://www.rakuten-sec.co.jp/web/market/data/rub.html ‥@
取得したい要素、 CSS セレクタで記載:document.querySelector("#cFx > table:nth-child(6) > tbody > tr:nth-child(1) > td.cell-02 > em").innerText ‥‥A
しかし、Aは google chrome では取得できて、しかもコンソールでAを指定した場合も目的の値を取得できていますが、
Aを IE11 ->F12 で表示できるコンソールに食わせても、目的の値を取得できません。
質問1:google chrome におけるページ@のCSSセレクタAは、IE11 ではどのようになるのでしょうか?‥‥B
質問2:IE11 でBを取得する方法はどのようなものでしょうか?
以上よろしくお願いいたします。 >>267
いろいろと修正箇所が多いので
https://qiita.com/Umaremin/items/b7726fa7340c7f175e77
このサイトのコードの
4行目の後に
Dim findStr As String, replaceStr As String
findStr = InputBox("置換対象文字列")
replaceStr = InputBox("置換文字")
'各Shapeに対する処理の2箇所に
shp.Name = Replace(shp.Name, findStr, replaceStr)
を追加すればうまく出来ると思う
ちなみに、理由は知らないけどリボンのページレイアウトの中のオブジェクトと選択と表示のシェイプの名前を変えずにデフォルトのままだとVBAが出す名前が英語表記になるので注意 ちょっとソースを整理
Sub 置換()
Dim tbox As Object
Dim findStr As String
Dim replaceStr As String
Dim count As Long
Dim i As Long
Dim myDocument As Worksheet
findStr = InputBox("置換対象文字列")
replaceStr = InputBox("置換文字")
Set myDocument = Worksheets(1)
myDocument.Shapes.SelectAll
For i = 1 To myDocument.Shapes.count
If myDocument.Shapes(i).Type = msoGroup Then
Selection.ShapeRange.Ungroup.Select
For Each tbox In Selection.ShapeRange
tbox.TextFrame.Characters.Text = Replace(tbox.TextFrame.Characters.Text, findStr, replaceStr)
Next
Selection.ShapeRange.Regroup.Select
Else
Set tbox = myDocument.Shapes(i).TextFrame
tbox.Characters.Text = Replace(tbox.Characters.Text, findStr, replaceStr)
End If
Next
End Sub
>>272
言われた通りにやったら出来ましたありがとうございます。
自分がやりたかったことと同じでした。
>>273さんも整理してくれてありがとうございます。 それか、
jquery.share-button.js
と書いてあるから、
jQuery で作った画面か何かの、ボタンをクリックするなどの、
人間による操作が必要なのかも?
そのサイト固有の問題かも。
それに、IE 11 はサポート切れで、多くのサイトで、まともに動かない
基本、Chrome しか動かない。
Chrome以外のブラウザは、まともに動かない
>>275,276,278
検証いただきありがとうございます
なにぶん、単に株価等をスクレイピングするためだけに年始から web スクレイピングを始めたばかりなので、難しいことはよくわかりません‥‥
やっぱり HTML5/CSS の基礎本からじっくりやるしかないでしょうか
引き続き、なにかコメントがありましたらよろしくお願いいたします‥‥
>>277
VBA で
Dim objIE As InternetExplorer
Set objIE = New InternetExplorer
objIE.navigate ur
時間待ちl
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.document
Dim elementText As String
elementText = htmlDoc.querySelector("#cFx > table:nth-child(6) > tbody > tr:nth-child(1) > td.cell-02 > em").innerText
と書いていますが、それでもやっぱり VBA は関係ないのでしょうか? スクレイピングが目的なら悪いことは言わないから大人しくpythonあたりにしとけ
今月からpythonを始めてサイトから文字を取ってきてエクセルにぶち込むくらいなら一週間で出来たな
その後のエクセルの処理はもちろんVBAだけどなw
最近のホームページはブラウザごとに動作が違うから、本などを参考にするなら同じブラウザを使わないと、
本質と無関係なところではまって時間を無駄にすることになる
あと株価なんかスクレイピングしてもまったく意味ないぞ
どんだけ大量の数字を集めたところで、それで利益が出せると思ったら大間違いだからな
そもそも自動売買に使う頻度でスクレイピングって規約確認したのか?
>>275
を修正
275は、ヘッドレスモードで動かしたので、エラーになったけど、
表示させて動かしたら、エラーにならなかった
でも、要素は取得できなかった
IE11 は、もうサポート切れじゃないの?
使わない方が良い
基本、Chrome を使うべき! 勝手に頻繁にスクレイピングしたら、業務妨害で逮捕されるよ
基本、どの会社のサービスでも、
相手と契約して、API を使わないといけない
そもそも、そのページ内に、id="cFx" が存在しない
var elems_1 = document.querySelectorAll( '#cFx' );
var elems_2 = document.querySelectorAll( '#cFx > table:nth-child(6) > tbody > tr:nth-child(1) > td.cell-02 > em' );
console.log( elems_1, elems_2 );
Chrome のF12 開発者ツールで実行しても、どちらも取得できない
Chrome のF12 開発者ツールのコンソール画面を開くと、幾つかエラーが出てる
ログインしてるとか、営業時間内とか、
何かの条件が揃わないと、
そのページ内に、id="cFx" が現れないのかも
>>286
IB証券との契約を検討中です
nyse と nasdaq 両市場の全上場株式を取得する必要はありますが、頻度は一社につき一日に一回だけでいいのが裁定取引のいいところだと思っています 初心者です。
質問をさせてください。
A列のデータをソートして、境目に改ページを適用するVBAを組みました。
その後にもう1つ動作を組み込みたいのですが、可能でしょうか?
組み込みたい動作は、
改ページの境目の1つ上のC列の内容をF1セルに都度反映させる。
イメージとしては、改ページで分けた内容ごとにタイトル行の一部を変えたい、といった感じです。
例:都道府県別に改ページをし、
東京の場合はタイトル行に東京と入れ込む。
そもそも無理なのかもしれませんが、お伺いしたく。。
長文失礼しました。
ご教示いただけますよう、お願いいたします。
>>290
面白い動画を紹介いただきありがとうございました。
しかし裁定取引では、売りと買いの両方ができないと実現は困難かと考えています
BTC を売りから入ることは、たしか、まだできなかったのではないかと思います ソルバーが全然うまくいかないし会社の人も誰もソルバー自体知らんかった
マイナーか…
ソルバーは基本原理がわかってないと、どんな計算でもできると思い込んでるとはまる
上司と折りがあわずに部署異動になったのに
その職場の連中がlineでマクロが使えんくなったとか簡単に直せるかとか聞いてきて本当にうざい
自分も覚えてないの一点張りで返してるけど
Excelの数式すらまともに使えずに開発タブもチェックしてない連中に直せんわ
連絡してくんなよ
すいません、教えてください。
Excel VBAでIEを制御しています。IEからデータをもって来てExcelに書き込んだり、
逆にExcel上のデータをIEに書き込んだり。
で、そろそろIEも駆逐されるみたいなのでEdgeとかChromeに対応させなくてはなりません。
そのままでは無理で、Web Driverとか、Selenium Basicが必要。
ここまであってますか?
で、これでEdgeとかChromeに対応した.xlsmを作ったとして、配布するとしたら、配布された側のPCにも
Web Driverとか、Selenium Basicをいれないといけないですか?
エクセル VBA マクロで良い参考書はありますか?
>>296
できると思ってんだけどなー、できないやつなのかもしれんな >>301
Excel と IE というどのPCにでも入っているもので使えるので、5年前くらいからやってます・・
今回、PCに何かインストールしないとできなくなるみたいなので、どうしようかと・・ Ruby, Selenium WebDriver, Chrome が一般的
>>305
ありがとうございます。最新のChromeベースのEdgeでは使えないことが判明しました・・
>>306
rubyというのを使う場合、実際に動かすときはxlsmファイルと別に何かプログラムを記載した
ファイルを準備し、そのファイルを実行するというイメージになるのでしょうか? 例えば、ヤフーに自動ログインするなら、
ユーザー名を入力して、ボタンをクリック、
パスワードを入力して、ボタンをクリック
以下のコードを、a.rb に書いて、ruby a.rb みたいに実行する。
パソコン内に、Ruby の実行環境を構築しないといけないけど
require "selenium-webdriver"
options = Selenium::WebDriver::Chrome::Options.new
options.add_option( :detach, true ) # ブラウザを切り離す
options.add_argument( '--start-maximized' ) # 画面最大
driver = Selenium::WebDriver.for :chrome, options: options
driver.manage.timeouts.implicit_wait = 10 # default timeout
driver.navigate.to "https://login.yahoo.co.jp/config/login_verify2?.src=ym"
element = driver.find_element(:id => "username")
element.send_key "ユーザー名"
driver.find_element(:id => "btnNext").click # ボタンをクリック
element = driver.find_element(:id => "passwd")
element.send_key "パスワード"
driver.find_element(:id => "btnSubmit").click # ボタンをクリック >>308
アホか?
WebDriver使って良いならVBAだって出来るだろwww seleniumでググるとPythonのほうが出てくると思うんだが本当にRubyのほうが一般的か?
環境のこと考えるならGASかpowershellを検討してみては?
>>307
最新のEdge (バージョン88.0.705.50 Chromium) で動いた >>313
それEdge じゃねえだろ。
今のEdgeはInternet Explorer_Server無いぞ。 できる奴はネットも本も見ない、わからない事はF1押して調べるだけ
これ定説
みんながそんな熟練者じゃないんだし
俺みたいなど初心者をここで助けてくれた人もいる
平和にいこう
そうですよねやっぱ
どこかの知恵袋と違って、ここはみんな優しく解説までしてくれる。器大きいぜ
どの方法だってバージョンアップで使えなくなる可能性はある
CSSやJavaScriptが必要なければXHRオブジェクトが無難
完全にデファクトスタンダードと言えるブラウザが今は存在しないから、VBAでスクレイピングは鬼門になりつつある
今はまだWindowsマシンには必ずIEが入ってるから、しばらくはIEでやってくのがいいんじゃないかなあ
俺が昨日、勉強したことを共有するぞ
VBAの記述の仕方は、オブジェクト.プロパティの順番だ
覚えておけよ
MsgBox でTESTと表示できたときの感動ったらなかったね!
これから、少しずつ勉強するぞ
>>305
それIEでも使うな。
よくわからんけど、F12で中が見られない子ウインドウが出るサイトとかある。 >>322
ObjectFromLresultとgetElementByで値取れるから画像じゃないと思う。
どういう仕組みのウインドウなのか知らんけど。 >>323
それで取れるならF12でも取れるんじゃね?
それかF12押してる対象が違うか。 >>325
クリックして、アクティブ&最前面にしてF12押しても何も出てこないんだよね。 >>326
エロサイトでも怒らないから、ちょっとそのサイト晒して 下記の4行で問題なくIEでURL開けたのですが、
Dim objIE As InternetExplorer
Set objIE = New InternetExplorer
objIE.Visible = True
objIE.Navigate "http://aaa.com/bbb.html"
保存する部分のプログラムがネット上で見つかりません。
hogehoge.htmlでc:\でもエクセルファイルパスでも。
開ききるまでの Do Loop とか、参照の追加とか、
他の必要な事項はわかったのですが、「保存」だけがわかりません。
お願いします。 とりあえず個人のPCでSelenium BasicとChrome Driverをダウンロードして、VBAでChromeを操作してみました。
構文の違いを理解するのにちょっと時間がかかりましたが、VBAでIE操作と同じようなことができました。
しかし、IEに比べてかなり遅いですね。。
とくにFor-nextとかFor eachとかで複数個あるClassを一個ずつ取得してくのがかなり遅い・・。
>>330
最近のWindows には、curl コマンドも入った
コマンドプロンプトで、where curl
と入力すると、
C:\Windows\System32\curl.exe
これとは別に、PowerShell にも、curl コマンドがあるけど、
これは別のコマンドのエイリアスだけど >>331
ありがとうございます。無事目的は果たせました。
ただし、2点、罠が潜んでました。解消しましたので謎解きは不要です。
1 コピペで張り付けたとき、URLを指定してる行が赤くなって、VBAに否定されました。
URL"のあとのセミコロンがお気に召さなかったようです。削ったら赤い表示は消えました。
コピペしたときに改行コードがかわった?
2 取りに行く相手が社内サーバのドメイン持ちだったのでドメイン指定したら、なんかダメで、
MACも以前そんな反応したことを思い出して、IPアドレス(192.168.*.*)で指定したら動きました。
>>334
curl について調べましたが、数か所で見た説明自体がわかりませんでした。(泣)
お手数かけました。 >>315
熟練者はそれだけ分かるのかー
そもそもvbaのマニュアルというものがないしやりたいことのプロパティやメソッドは皆どうやって調べてるのか気になる
まあ今はネットあるけどネット普及してなかった90年代はF1で調べてた? >>336
90年代はみんなマニュアル本を買ってた
中身は英語のオンラインヘルプを翻訳して印刷しただけの物なんだけど、誤植と誤訳だらけ
VBAに限らず、1冊3000円〜8000円ぐらいのぶ厚い本が大きい本屋のパソコンコーナーに並んでた こういう辞書みたいなやつ、みんな持ってた
あ、そうなのか
こうゆう辞書みたいな本はマイクロソフトから情報もらって作ってたのかなね
英語ヘルプで試行錯誤で作ってたのかね
今のExcel VBAって日本語ヘルプ付いてないの?
>>339
発売前に英語版のヘルプが入ったCDをMSから送って貰って、それを手分けして翻訳した
Officeじゃないけど翻訳のバイトしてた
>>341
あるけど、今はオンラインヘルプに飛ばされるからネット環境がないと見れない
昔のバージョンはローカル化できたけど今は無理だと思う Excelのハイパーリンクをクリックするたびに
MSのサイトにアクセス先の情報を送って
そこからリダイレクトしていたという
衝撃の事実を今日知った。
10年以上つかってて気が付かなかったよ
死ねこいつら
これ買っとけばいいみたいなど定番の本はある?
ネットでやりたいことをちょこちょこパクって繋げてるけど限界だわ
汎用性の高い一つの大掛かりなVBAを組もうとしたら圧倒的に知恵がない
ネットで調べても書き方が人それぞれだったりちゃんと整理されれなかったり
肝心の自分の目的を書いてなかったりそんなんばっかだからな。
それらの無駄とストレスを減らすために、辞書は1冊あった方がいいな。
書き方と順序が統一されてるだけでも有用。
できる大辞典は定番ではある
他の本はいらん
これにないなら諦めて他で調べればいい
vbaでIEとかChromeとか操作できるのは最近分かったけど(やったことはない)、他に操作できるアプリってどのくらいあるの??
>>351
参照設定の中に入ってるのは普通に動かせるし、
WindowsAPIとUIAutomationとSendKeysがあるから、
マウスとキーボードで動かせるようなものなら大抵。
極端な例を言うと、VBAで仮想のファミコン(エミュ)を作ってマリオ動かす人もいる。 って書いてて思ったんだけど、
IRモジュール使ってVBAでテレビとかエアコン動かせる人いる?
俺さ、VBAのソース書いてて
インテリセンスが糞だと思ってたけど
上には上があるんだなぁ
今ClassicAspとかいう昔の組んでるんだけど
HTMLとJavaScriptとVBScriptで出来てて
テキスト編集ツール使って
テキストファイルで作ってる
もちろんインテリセンスなんて全く効かない
そうなると一番怖いのが文法エラー
VBAなんかだと一発で分かるけど
最初っからコンパイル自体されないので
どこでエラーになっているか
全く分からない
>>356
vbaでエミュってエミュをvbaで起動してるってことではなく?
何をどうやったら作れるのか不思議
vbaでIoTの組み込みや操作も可能なのだろうかー 元々仕事でなんとなしに触らざるを得なくなってコピペやらその場限りのググりで生きながらえてきたんだけどちゃんと筋道立てて1から勉強したいというときに適した本やサイトはありますか?
本も当然、1冊では終わらん
入門編から順に買うことになる
>>362
慣れてきて半人前くらいになってきたな、と思うならこの本
入門レベルでは決して足りない実務に必須のスキルとは ExcelVBA 実戦のための技術 VBAって当たり前だろうけどエクセルの基本的な知識がないと使えないよね?
エクセル全然知らないから大変だな…
それじゃ役に立てる場所がないじゃん
実践で使わないと上達しないぞ
未来の開拓のため!つっても普通
「よし、エクセルを覚えるぞ」からだろそれは…
PCにエクセルをインストールしてエクセル入門の本を買うところからだな
書式とか関数とかピボットとかスイスイできるほどに覚えてからだなVBAは
でないとプログラムの意味も理解できない
エクセル初歩から覚えるなら絶対買っとけ!って書籍やサイトはありますか?
「絶対」は無い。
まあ「絶対ではないがまったり普通に」、
FOM出版のよくわかるシリーズでいいのでは。
当然最初は基礎編ね。
スレ違いだからこれ以上は然るべきところで聞くのがいいと思う。
>>369
いや、Excelの知識無くてもVBだけでExcelを動かしてる人いますぜ
その人当然ワークシート関数をろくに知らない 昭和の頃は、Excel講座に通うサラリーマンはバカにされてたけど、同時にvi使える人が達人として尊敬されてた。
どう考えてもテキストエディタより表計算のほうが技能必要だけど。
日本の成長に脅威したCIAが、たいていの問題に対して使える優秀な製品を貶し、使いどころの限られる古いテキストエディタユーザーを神扱いしたのではないか?
そもそもVBAは最後の手段であって、それを活用することは決して褒められたものじゃない
ワークシートの機能で簡単にできることを知らずにシコシコ馬鹿みたいにVBA書いてるアホは多い
結果、CIAの思惑通り、標準的な日本人はviを使いこなせるが、Excelを使いこなす日本人は少ない。
Excelを使いこなせた方が絶対便利なのに。
テキストエディタはC++やJava などでプログラム開発するためのただの道具だけどな
むしろ本格的なプログラム組むならVBAは汎用性に欠ける
最近はSheetというかExcelの外でのExcelVBAの活用方法を知りたい
Excelと他のアプリを連携するにしてもある程度の規模になるとVBAではなくてOffice add-ins(JavaScriptまたはTypeScript)やVSTO(C#)の利用をMicrosoftは推進してる
あくまでVBAはMS Officeのシステムの枠内で処理の自動化を実施するための道具
>>383
Excel 自体は存在したけど日本語版じゃないしMac用だからリーマンが講座に通うとかはありえんだろうな
アメリカのリーマンかも知れんがw 一番最初にMac版が発売されたのは昭和60年9月、ただしこの時点ではマクロは使えなかった
Windows版は昭和62年10月発売で、ここからマクロ機能が搭載された
この時代だと、viが使える人は別に尊敬されてない
そもそもほとんど知られてなかったんだから、使える人がすごいとか判断すらできなかった
知人がYouTubeで表計算なりVBを勉強したいと言っているが、同志達からみてどのチャンネルがおつつめ?
金子?ユースフル?たてばやし??
自分、YouTubeであまりExcelの参考にはしないから誰が優秀か全然わからん
知人いわく、金子ていうあんちゃんがやたら人気あると聞いてさ
でもプロではないと思うから自分なら観ない
お前ら化石みたい頭してそうだもんな、youtuberとか頑なに受け入れられないんだろうな
俺は金子見て勉強してるよ
Exportasfixedformatメソッドでpdfを出力するとき、そのファイル名にセルの値を参照してるのですが
セルの値が改行されているとエラーが出ます。
エラーを出さず改行を無視してファイル名をつけたいのですが、どうすればよいでしょうか?
改行の記号忘れたけど
あれをReplaceで消せばいいだけじゃね
vbCrとvbLfとvbNewLineを空文字化すればいけるかな?
s = Replace(Replace(Replace(Replace(s, vbCr, ""), vbLf, ""), vbCrLf, ""), vbNewLine, "")
vbNewLine は vbCr と vbLf の組み合わせか、いずれか一方だから、vbCr と vbLf だけでもいいかも
396を関数に
Private Function Getファイル名(byval s as string) As String
Getファイル名 = Replace(Replace(Replace(Replace(s, vbCr, ""), vbLf, ""), vbCrLf, ""), vbNewLine, "")
End Function
youtubeができる前に基本は覚えたから今さら見る気になれないなあ
だからどっちがどうとかも興味ない
>>399
全部空文字にするなら、置換する元のリストをArrayでくくって、lbound(配列)〜ubound(配列)でその配列の中身ループさせればいいだけじゃん
それ可読性悪すぎ 要素がもっと多いと配列にした方がメンテ性は良くなりそうだけど、4つだと微妙だなあ
個人の好みで片付けたくなる
For Each x In Array(vbCr, vbLf, vbCrLf, vbNewLine)
s = Replace(s, x, "")
Next
あとForで回すと微妙に遅くなるんで、関数化(ブラックボックス化)して大量のデータを処理するなら1本の式にまとめた方がいいかもしれない
CreateObject("VBScript.RegExp")で探すのも大差ない?
w、Wsは不用です。
あるシートの
w.Cells(1, "B")には000001234や000001234-1などの文字列が入っています。
ハイフンなしの場合は下7桁を。
ハイフンありの場合は-より左の下7桁と-以降を抜き出して
別のシート.同じ行のA列に入れたいです。
下記の処理でelse節を通る場合、
Rightしたときに前ゼロが消えちゃう(1234だけになる)んだけど
消えないようにするにはどう書けばいいですか。
(If節を通る場合は消えません)
If InStr(1, w.Cells(1, "B"), "-", vbTextCompare) >= 1 Then
Dim sNo() As String
sNo = Split(w.Cells(1, "B"), "-", , vbTextCompare)
sNo(0) = Right(sNo(0), 7)
Ws.Cells(gyo, "A") = Join(sNo, "-")
Else
Ws.Cells(gyo, "A") = Right(w.Cells(1, "B"), 7)
End If
間違えました
w、Wsは不用です。
↓
w、Wsはシートです。
>>403
>>404
なるほど勉強になるわ
いろんな書き方があるからプログラムは面白いな
スマホで打つの面倒くさいからコピペしたけど自分ならReplaceを4行に分けて一個ずつ処理してたわ >>408
Else
Ws.Cells(gyo, "A").NumberFormatLocal = "@"
Ws.Cells(gyo, "A") = Right(w.Cells(1, "B"), 7)
End If >>336
言っとくが、本気にするなよw
熟練者はネットも本も見るぞ。
ま、本に関してはVBAの本は見ないかも。 >>385
???
そうか?
VSTO廃れてるように見えるが。
情報少ないし。 >>408
単にWsのA列の表示形式が文字列じゃないだけじゃね >>392
これ面白そうだったから調べてみた。
s = worksheetfunction.clean(s)
でいけるっぽい VBAがそのうち廃止されると噂聞くけど無くなったらExcelじゃなくて良いね
キングとかジャストの安い互換ソフトで十分
それとPython
上にExcel使いこなしてる奴少ないとあるが、事務歴長いおばちゃんとか操作長けてるイメージあるけどどうなの??
ワークシートの関数とか基本的なものしか知らないな
知ってると便利そうね
>>418
小企業で事務が2人ぐらいのとこだと、速いけどたいがい変な自己流
いわゆるExcel方眼紙を素早く作って定型文書を作ってしまうとかそんなイメージ
もちろんよく勉強してる人もいるが テンキー速いのは良いね
電卓も得意そうだし
方眼紙はアカンど、あれ考えた人天才かファホどちらかだな
そういうおば様が引き継ぎにくいシートを大量生産しとるんだねうちみたいに
VBAはいつまで使えるんだろう?
あと15年は大丈夫かね
最近、Excel + Pythonとか耳にするけどVBAより何が良いんだろー?
ExcelVBAのひどさは文法よりライブラリのひどさにある
言語だけ変えてもあんまり解決しない
丸々置き換えた外部ライブラリならもっと楽にプログラムできるかもしれない
Pythonみたいな外部環境使う時は、エクセルを操作って言うより作成する時が多そう
入出力ともにエクセルならVBAの方が手っ取り早いでしょ
というかVBA使ってるのは他に開発ツールが無いからなんだよ
Pythonインストールできる環境ならそもそもVBAなんか使ってない
最近VBA描けるようになって嬉しいけどここ見てると終わってる言語みたいだな...
古い言語だからでは?
昭和の定年ジジババがどや顔で昔からプログラミングやっていたと若者にマウント取ってくるのは大抵VBAが大半
終わってる言語だけど、代わりに仕様変更がない安心感はある
諸悪の根源は仕事の効率化って名目でVBA押し売りするサイトやら講師やらだな
はよくたばれ
今VBA押してるか?
Pythonばかりステマされてる気がする
>>435
今でも使われてるしVBAしか開発環境のない職場も多いし、
いつも手作業で気合いで乗り切るって人より遥かにマシだから引き続き学習進めていいと思うよ
ただ余裕があれば自宅でPythonとかHTML+JavaScript辺り触っとくといいかも よくあるだろ。
オフィス系を主体に普通に手作業メインで事務やってるとこは。
>>434
Pythonインストールできる会社って少ないの?
なにか引っかかるの? 余計なものはインストールしちゃいけないことになってる
何で勝手にインストールするのが前提なんだよ
上に相談すればいいじゃん
それすら出来ない融通の効かない会社なら、そもそもマクロなんか絶対許さないだろ
ウチの会社は全く融通きかない
Alt+F11で上司の上司から呼び出し食らったの思い出しましたわ
>>446
上に相談で通るって、どんだけ小さい企業を想定してるんだよと >>446
お前の知ってる会社が世の中のすべてじゃないってことだよ まぁどうせ無理だろって思い込みでやってるから、
そういう状況なんだろうな
行動しないかやっても中途半端なくせに上司や会社への愚痴は一人前
そうやって思い込みで批判してるお前も思い込み仲間だな
相談するかどうかには規模は関係ない
許可されるかどうかも規模は関係ないかな
相談のしやすさだけは違うかも
会社PCでPython+Excelなんて非現実的すぎるよな
相談しても「余計なことしなくていい」で終わり
でもExcelは最初から入ってるからVBAなら無問題
未だに使われてるのはそれが最大の理由
一時期「ExcelでPython使えるようになる」みたいな話があって期待してたけど立ち消えで残念
そもそもExcel使いの中でのVB人口が少ないわな
職場によっては白い目で見られる事あるみたいだし。。。
python入ってたらpip installぐらいさせてくれるだろ
>>434
Excel関係ないならPowerShellでいいだろ
気合いるけどC#, VB.netだって使えるし >>454
えっ、ExcelにPython搭載の話は無くなったの? >>458
PowerShellは軽く調べたことあるけどそんなに便利なの?
C#とかVB.netってのは追加インストールなしでできる?
今のところうちの会社で出来そうな言語は↓
・VBA(Office)
・VBS(WSH)
・Jscript(WSH)
・JavaScript(webブラウザ)
・PowerShell VBAで簡単なアプリ開発ってできるの?
tefuくんの体脂肪測定器みたいな
いくら便利でも所詮はシェルだし
体系がわかりやすくなっても
いったん古い体系になじんでたら覚える手間増えるだけだし
劇的に安全になったり間違いが減ったり作業が減るわけじゃない
今から入る人以外やる人いるのか?
VBAは極めれば当然事務系のシステムはもちろんアクションゲームやシューディングゲームも作れる
開発効率は知らん
>>464
簡単なアプリ作るのに初心者から何年ぐらいかかるな ああ、上に書いてあるようなやつか
人によるけど半年〜1年くらいじゃね?
>>467
tefu君たいしてすごくないな
ありがとう! 昭和の頃からExcelできる=パソコンできる
パソコンできる=Excel Wordできる
この固定観念は不変だいまだに
何故なんだや?
固定観念ではなく社会に出てPC使う上で一番必要になるから
>>460
えっ!Excelにjavascript搭載?! そもそもアプリがEXCEL何だから何が搭載されようがパフォは大差無いだろうな
それならブックが超軽いとかの方が恩恵あるわ
昭和だからMS-DOSって奴か
定年して10年位の近所の爺がやたらExcelの話しだけは詳しかったわ
平成初期って今みたいにpcが普及していたイメージ無いのだがね
平成初期は家庭の普及は少ないかもしれないが学校でPCの授業はある時代
平成初期頃ならPC-9801+MS-DOS上で一太郎とロータス123の時代
FileSystemObjectのOpenTextFileで開いたファイルのポインタを最初の行に戻す方法ってありますか?
ADOのMoveFirstメソッドみたいな感じの。
Windows版Excel(もちろん英語版)が最初に発売されたのは一応昭和時代の終わり頃だよ
日本で使ってた人はほぼいなかったと思うけど
使い物になる日本語版が登場したのは平成5年の秋
Excel 95か97は持ってたはずだが…どこいったかな
Excel2000は現役?で使ってたりするw
現代のPCで動かすと爆速だから
2000て今のパソコンで動くのか知らんかった
サンクス!
Excel2000とWindows2000を勘違い
>>435
色んな言語やって適材適所。
VBAの場合、特殊な環境なのでVBAが有利だけど出来ないことも結構ある。 >>451
足らないなら作れば良いってのもある。
バイナリエディタぐらいなら2時間もあれば作れるだろ。 >>461
問題はさ、結局VBAから呼び出す形じゃピタゴラスイッチみたいになるし、外部からExcel操作するようなのは、元々VBAでやる必要のない処理なので競合にならないということ。 ワード97のイースターエッグでピンボールが遊べた重いで
エクセルは迷路だっけか
64bit対応をしてるんですが、素人なのでポインタ/ハンドルとそれ以外の区別が難しいです
GetInputStateはlongptrではなくlongで良い(実際どちらでも動くことは動きました)と思うのですが、合ってるでしょうか?
Private Declare PtrSafe Function GetInputState Lib “USER32” () As Long
(そもそも、パラメータや引数がないのに、何故型宣言が必要なのかからしてよく分からないのですが…)
>>491
そんなことがわからない馬鹿はAPI使うなよ ど素人の質問で大変申し訳ないのだけど、教えていただけないでしょうか。
Sub test()
Dim s As Worksheet
Set s = Worksheets.Add
Debug.Print "ActiveSheet.CodeName : " & ActiveSheet.CodeName
Debug.Print "s : " & s.CodeName
End Sub
というコードで、ワークシートを1枚追加してそのワークシートのコード名を取得しようとしたところ、
VBEを開いているときは問題なくコード名を取得できるのですが、
VBEを開かずに開発タブからマクロを実行させると、ActiveSheet.CodeName も s もブランクとなり、コード名を取得できません。
(VBEを開いた状態であれば、開発タブから実行させても取得できる)
何か追加で設定しなければならないことなどあるのでしょうか?
Excelのバージョンは 2019MSO(16.0.13530.20418)32ビット です。
Debug.PrintじゃなくMsgBoxにしても無理?
>>495
MsgBoxにしてみましたが、変わらずブランクのままでした… >>492
>>493
ありがとうございました
他人のコードを意味も分からず流用してました
戻り値なんですね >>497
これまじかー
イベントを起動するシート判定に使おうと思ってたから痛いな
配布する前でよかったのが救いか >>497
ありがとうございます!
おかげさまで解決しました!
ものによってはVBE閉じていると取得できないということもあるんですね…勉強になりました… 497は既存のオブジェクトは大丈夫みたいだな
良かった
VBAでIoT、たとえば防犯カメラを特定の時間稼働させることできる?
複数のユーザーフォームをボタンと紐付された関数ごと
別のフォームのマルチページの一つのページとして統合したいんだけど
どうやったらいい?
コントロールのコピーしたら関数まっさらになってしまう
すまん
問題はオブジェクト名にあった
コントロールをコピーして貼り付けるとコピー元とは無関係に
左上から連番でオブジェクト名が新規に付けられてしまう
それで元のコードとの相関性がグチャグチャに
他のフォームからコピーするとオブジェクト名の重複が発生するから
しょうがないとは思うが…
複数フォームを一つのフォーム内ページで管理出来たらコンパクトでいいと思ったが甘かったか
ボタンのオブジェクト名をマクロで変更するにはどうしたらよいかわかる?
仕事で使っちゃあいるが
ほぼ趣味だな
一度も仕事としてコーディングしたことはないな
VBAで何か生活の役にたつアイデアある?
家計簿しかり、体脂肪計しかり。他には?
扱いたいデータ次第でしょ
スマートメーターとか
デジタル温湿度計とか
インプットのデータが多様であればあるほど
得られる成果の種類も増えるというもの
素人質問
VBSで正規表現の(肯|否)定(先|後)読みが出来ないっぽいんだけど
気のせい?
VBAを生活に役立てるとかいう発想が的外れすぎる
Officeでやりたいことを実現する為のものってことすら理解してない
そんなの正規表現じゃないからできないよ
もちろん一番肝心なVBAにとってのね
俺はVBAで彼女できたし宝くじも当たった
死んだばあちゃんまで生き返って超ハッピーだわ
>>532
最近、感染者数を少なく発表して緊急事態事態宣言の効果だと思わせてるように感じるわ
でもそれで皆が緊張感を持てば本当に少なくなるわ >>532
なんだEXCELのおかげで減ったのかw 感染者数、重症者数、検査数の計算に100パーセントExcel使ってるだろう
役所の資料落としたら実数入ってることあったけど
関数での計算結果を貼り付けた訳じゃなかったのか
まぁ役所なら只管電卓叩くのはありそうだけど
国家公務員ですがVBAとADO(+SQL)でAccessや業務システムからデータ引っこ抜いて統計資料作ったりしてます
前任者は紙に印刷して正の字書いたり交通調査で使うカウンターみたいので数えてました
他にも色々業務楽にしましたが報告すると人が減らされるので、
隠しておいて余った時間に資格試験の勉強とかしてます
手作業が当たり前の公務員の職場環境で
マクロ使うとめっちゃ時間余るわな
結局>>545もやってる仕事は
効率化なぞしてない無能公務員のままってことなんだから VBAによる小手先の自動化により無駄な業務の整理や業務フローの見直し、システム改善などの本質的な業務改善のモチベーションが失われ、
結果的に業務効率を下げているというのはVBAあるある
>>545
周りのひとはvbaやマクロの存在を知らない
業務ではほぼエクセルを使用
そんな企業に転職したい 一般事務になるね
マクロできて当然の職場よりは時給下がると思う
結局そういうアナログな企業は、効率化か進まないしそんな脳みそじゃ事業の収益性も低い。よって給料も少ない。
そりゃそうだ
VBA出来て作業効率高い方が給料も高いわな
ただ単純に考えればVBAを
生業にしている奴より
VBAを補佐的に使って実際にはJavaや
C++、C#、Ruby等で大きなシステムを
作れる奴の方が給料は高い
下を見てもきりがないが
上を見てもきりがないのだよ
>>547
抜本的な改革は現場じゃできないです
国家公務員なんで法律や規則、本省が定めた通達や事務連絡、業務システム等を使うことは義務付けられていて、
特段の定めのない部分を各自の裁量の範囲内で工夫するしかない
そしてその範疇ですらある程度の規模の改革をしようとすると根強いアナログ派に今の業務を変える必要がないと反対されます 政治家が無理矢理変えてあげないとダメなままってことだね。
しかもいい方向に変えようとすると文句を言うほどの無能の二乗。
政治家の改革に公務員は文句を言ってはならないという法律を作らないとな。
予算分捕るためのシステム構築だからいざ運用しようとすると結局人を介しての無駄な作業になってる
Open、put といったバイナリーファイル作成するコマンド類使ってファイル書き出したら、
破損しているとメッセージが出る。
それでも修復して開くと元ファイルと同じような感じなのですが、破損されないやり方ってありますか?ちなみにWordやエクセル形式でなってます。
民営化勧めた結果だろ
国が技術に直接投資できる機会が減っただけ
>>553
東証一部上場のnot ITな技術職だけど
周りびっくりするほどマクロ使える人居ないよ
スクリプトの存在知ってる人で10人に一人くらい
年齢層高くてWindowsupdateも怖いってな感じな
アナログ昭和な雰囲気が色濃く残る
でも儲かってんだからあんまり気にしないって感じでな >>566
よその会社がどんなだろうとわしらに関係ないし HashiCorp の時価総額は5,000億円、GitHub は8,000億円で、
Shopify は15兆円で、
Airbnb は10兆円で、米ホテル大手3社の合計を超える
Ruby on Rails だと、社員1,000人で、1兆円ぐらい行く。
他の言語の10倍ぐらい高い感じ
前レスにあったVBAでChromeのWEB操作って安定するの?
今流行りのRPAってVBAのsendkeyみたいなもんなのかなー
>>575
全然違うw
VBAでも同じことが出来るがSendkeys使うのは、かなりレベルが低い。
普通はUIAutomationか古くからのウィンドウハンドルにコントロール毎の個別メッセージ投げる方法。 UIAutomationはじめてきいたよ
検索したら結構すごいな
ありがとうだよ
他の言語にはできてVBAにはできないことって何がある?
>>585
言語も色々あるから、VBA「だけ」にできないことってのは思いつかない
VBA「にも」できない、ならexe化とか色々あるけど >>585
Object指向言語で言うところの継承。
VBAにもインターフェース継承と言うものはあるが、
あれはObject指向言語の委譲に当たるので別物。 >>585
全く出来ないわけじゃ無いけど、実質無理なのはマルチスレッド。
マルチプロセスなら出来るけど。 ブックを閉じるときに、全部のシートでA4、A6、A18、A20、A22のいずれかのセルに値が入っていたら、
シート名の先頭に"済"をつけて、シートを最後尾に移動するマクロを作りたいのですが、Worksheets(ws).Name = "済" & Worksheets(ws).Nameの所で
「実行時エラー13・型が一致しません」になります
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
For Each ws In Worksheets
ws.Activate
If ws.Cells(4, 1) Like "" And _
ws.Cells(6, 1) Like "" And _
ws.Cells(18, 1) Like "" And _
ws.Cells(20, 1) Like "" And _
ws.Cells(30, 1) Like "" Then
Else
Worksheets(ws).Name = "済" & Worksheets(ws).Name
ws.Move After:=Sheets(Sheets.Count)
End If
Next ws
Application.Quit
ThisWorkbook.Close savechanges:=True
End Sub
そりゃ一致しないw
Worksheets(ws).Nameじゃなくて、ws.nameでいけるよ
>>594
エラーになってる行以外は正しいからちょっとした勘違いじゃね?
それよりFor Each ... In WorkSheets のループ中にシートの移動とかして大丈夫なんだっけ? Like ""じゃなくて.Value <> ""にしてElse消した方が分かりやすいとは思う
まあその辺は好みか
>>596
> Like ""じゃなくて.Value <> ""にしてElse消した方が
And を Or にするのを忘れてるぞ… 可読性無視
For Each ws In Worksheets
with ws
.Activate
If .Cells(4, 1) & .Cells(6, 1) & .Cells(18, 1) & .Cells(20, 1) & .Cells(30, 1) <> "" then
.Name = "済" & .Name
.Move After:=Sheets(Sheets.Count)
End If
End with
Next
最近はexcel vbaを淘汰しようとkintoneとかゆうのが台頭してきたな
>>600
大体今までの経験則から言うと
ノンプログラミングというのは
ろくなことがない。
無理に纏めようとして
歪みが生じて
結局ぐちゃぐちゃになるのがオチ Select文で求めない条件を並べるのもおすすめ
Select Case Empty
Case ws.Cells(4, 1).Value
....
Case ws.Cells(30, 1).Value
Case Else
Worksheets(ws).Name = "済" & Worksheets(ws).Name
End Select
Case節で分けなくてもカンマで条件を繋げても問題ない
短絡評価にもなる
sagasu= Dir(ThisWorkbook.Path & ”作業ファイル*20210209*”)
Worksbooks.Open(以下略)
みたいな感じで自動でファイルを探してきて開くマクロを作りたいのですが、20210209の部分が常に変わるので、
変数=hizuke(yymmdd、str)を定義したのでこれをDir関数にワイルドカードつきで組み込みたいのですができませんか?
初歩的かもしれませんが検索しても見つからなくて、、、
>>604
sagasu= Dir(ThisWorkbook.Path & "作業ファイル*" & 変数 & "*")
あと、hizukeって関数は自作しなくてもFormatというのがある >>605
やってみたらできた
ありがとうございます!! 良かったよ
プロだらけだったらヤバいスレになるw
趣味と後学のために少しずつやっていたら好きになってきた。
仕事で使う機会あまりないわ
マクロを10個くらいリボンに登録したらVBEがアドインだらけになってワロタ
どうやらxmlを作って一つのアドインとしてまとめて登録するのがセオリーみたいだな
>>611
ええええええええええええええええええええええええ
ちょっと驚愕のニュースだ つまりもうマクロを四苦八苦して作る必要はないんだな!?
重さが気になる
便利だけど重くて出来るだけ避けるような関数にならないか
>>611
よくわからんけどVBA使わなくてもユーザー定義関数が書けるようになったのか?
でもそれだけじゃチューリング完全じゃないよね?
誰が説明してくれ… >>620
ああ、なるほど名前の一種として関数定義ができるのか
再起を使えばチューリング完全にもなりそうだし、これいいな
ただ、また「(俺が見て)わけのわからん機能は使うな」とか老害に言われるんだろうなw Lambdaがファーストクラスオブジェクトなら以下のようなscheme風の無限ループも書ける
((lambda (x) (x x)) (lambda (x) (x x)))
VBAの時代は終わるかも
>>611
その lambda とやらは、不動点コンビネータを記述できるのですか? セキュリティでVBA禁止にしても、開いた瞬間に固まるブックが簡単に作れてしまうのかな
意図せず無限ループになったらデバッグが大変そう
へー
EXCELでLinqやラムダ式が書けるようになるのか
Linqやラムダ式は.Netでも便利だけど
開発者をふるいに掛けているものの一つだから
理解出来ない脱落者はEXCELやVBAの
開発ですら役立たずの烙印を押される
そんなときが来るなんて夢にも思って無かったな
あ、なんだ
VBAで使えたりLinqが使えるようになる訳では無いのか
あいつら基本レイトバインディングだからトレースするとき慣れてないと分かり辛いんだよな
良かったなお前ら
>>628
> セキュリティでVBA禁止にしても、開いた瞬間に固まるブックが簡単に作れてしまうのかな
今でもあるけど計算回数の上限決めて打ち切るでしょ >>611
どんだけ凄いの?
だれか40歳にもわかるように説明して >>633
例えば、A1, B1, C1セルの中身をカンマで繋いでD1に格納したい
その際セルが空なら"[空だよーん]"ってしたいとするでしょ
今までは
D1: =TEXTJOIN(", ", FALSE, IF(A1 = "", "[空だよーん]", A1), IF(B1 = "", "[空だよーん]", B1), IF(C1 = "", "[空だよーん]", C1))
って似たようなIF式を何度も書く必要があったけどLAMBDA使えたら
f: =LAMBDA(x, IF(x = "", "[空だよーん]", x))
って定義しておけば
D1: =TEXTJOIN(", ", FALSE, f(A1), f(B1), f(C1))
って書ける
さらに課長に"[空だよーん]"とかふざけんな、"[空でございます]"にしろって言われてもLAMBDAの1箇所を直すだけで済む >>633
40のお前がバレンタインデーでチョコ貰えるくらい凄い ただの関数定義じゃないか
それで十分だった気はするが
VBAに影響ほとんどなさそう
一発でピボ集計とかシート挿入とかに関係ないし
と言うかラムダ式書けるなら、ついでにセル内でも数式の改行とインデントができるようにしてくれればよかったのにな
Excel職人のIFだらけの数式を読むのがまずキツイんだは
セルで分ければいいんだけど一つの数式にまとめられるのがすごいと思ってるからな
まあ自分もそうだったけど
単に複数セル使うのが嫌なだけってのが多いように見える
まとめて印刷とか名前を付けて保存みたいな手作業を置き換えるVBAはなくならないかな
>>639
> セル内でも数式の改行とインデントができるようにしてくれればよかったのにな
それ昔からできるぞ…
営業の要ミーティング恐い((((;゚Д゚)))))))
>>639
普通にやってるけど。
読むのキツイんだろ。 んー? 今までセル内の数式って受身の動きだったけど
それ実装すれば自発的に動けるようになるってこと?
>>643
まじか、しらんかったわ
勝手にスペース削られたりするもんだと思ってたわ。。 >>648
自発的には動かないよ
今まではVBAでしかユーザー定義関数は作れなかったけどVBA使わなくても作れるって言うだけ
ただマクロを有効にする必要がないから実務としてはそれなりに意味はある >>649
まあ俺もつい1年ぐらい前に知ったんだけどw それよりかパイプライン演算子を実装して欲しい
ラムダ関数はその足掛かりな気もするけど
EXCELって意外と古いの使ってたりするから受け渡しがどうかな
>>654
ああごめん
表示形式以外の書式ね
色とかフォントとか罫線とか もしかして >>653 は
データの「表示形式」だけでなくて
フォントや横位置/縦位置、塗りつぶし、罫線なんかの戻り値が欲しいのかしら? VBAはSelectのCaseで、False,Empty,Nullあたりが同一判定されて、個々に行えないのがクソ
>>661
VarTypeも知らない僕はアホです
っていうカミングアウトか? DIR関数を利用して以下のりようなロジックを見たのですが、
foldercheck = (Dir(wrkpath, vbDirectory) <> "")
()の中のロジックはどのような技法なんでしょうか
if Dir(wrkpath, vbDirectory) <> " then
フォルダへの書き込みのアクセス権をチェックするようなサンプルないですかね。
イメージとしてはフォームのフォルダ選択ボタンを押して選んだフォルダが書き込みできなければ選んだ時点でそういうメッセージを出したい。このあとアウトプットフォイルを書き込む際にエラーが出る前に
>>666
まじめにやるならGetFileSecurityとGetAclInformationを使う
もっと簡単にやりたかったら、ダミーのファイルを1つ作ってみてOn Errorでエラーになったかどうか判定 FSOのGetFileでフォルダーを取得して
Attlibutesプロパティ見ればいいんでないかな
>>668訂正
GetFile → GetFolder
だった >>668
いいわけないだろw
そもそもフォルダのR属性は他の用途に使われている >>662
いや、それだと0と1がIntegerとしか返ってこないし、
TrueとFalseもBooleanとしか返ってこないから判定できないだろ。バカかお前? CSV形式で保存する前に、Serial値の表示形式をyyyy/m/dにマクロから変更して
保存してからその後開くと、"1/1/2020"とか意味分からんStr型になっちゃうんだけど、
誰か分かるひといる?
csvを取り込むソフトがどうしてもこの表示形式に変更しないと、うまく取り込めない謎仕様なんだ。
ちなみに、いったん保存してから開いてやってもダメだった。
(もちろん、手作業で開いて表示形式変更したらバグらないんだけど・・・)
rngObj.NumberFormatLocal = "yyyy/m/d"
>>672
型を判定してから値を判定すりゃいいだけだろ
応用力ないのか? 整数の1と小数の1.0だと値(バイナリ)が違うって知ったら狂いそうだな
>>674
いま手元にExcelないから確認できないけど
rngObj.NumberFormat = "yyyy/m/d"
か
book.SaveAs …, Local:=True
に、してみたらどうかな 2021/2/15 6:43
みたいに、時間が入ったセルの、
日付の部分
だけ変えたいんですがやり方がわからないです
セルの日付(2021/2/15)を変数で定義して、新たな日付(2021/2/16)の変数も定義して
replace(セルの位置,セルの日付,新たな日付)
で入れ替えようとすると型が合わないって出てしまうのですが
どうすればいいでしょうか?
>>678
もしかして変数で定義してる型がDateだったり? CStr(Format(a,″yyyy/m/d“))
すいません自己解決しました
変数の定義がおなしかったみたいです
遅くなりましたが、結局Dummyファイルの書き込みにしました。アドバイス頂いた方ありがとうございました。
スミマセン、セルの特殊な機能だと思うのですが、
セルにポインタを合わせると、セルの外側右下に小さな▼が出現、
▼を押すとセルの下に小さなウィンドウが展開し、羅列された文字や数字を選択できる。
上記機能の名称とは何なのか、
どこでイジれるのか、作成できるのか等わからず困ってしまいました。
機能が生きているセルもありましたため、
新規で作成せずともその機能をコピーしようともしましたが方法わからず。
お詳しい方いらっしゃいましたら
お力添え願いたいです。
失礼します。
VBAとは関係なく
「セルの入力規則」から「リスト」を選択してあとは適宜
詳細は上記キーワードで検索して
教えていただけると助かります。
VBAでIEからExcelに文章を写したいです。
アクティブなIEからカーソルで範囲指定して、その内容を写すことは可能なのでしょうか?
例えば、ヤフーで気になる記事の内容だけをコピペといった感じです。
気になるものだけなので、検索を入れ込む必要はないです。
IEとYahoo起動まではできるのですが、その先が分かりません。
よろしくお願いいたします。
気になる記事の条件は?
それを自分で判断するなら>>688が正解だと思うが >>686
ありがとうございますm(_ _)m
トライします。 クリップボードを監視して、新しいデータがコピーされるたびに保存してくれるアプリとか使えばいいんじゃない?
いちいちウィンドウを切り替えたりペーストしなくていいやつあるだろ
>>686
機能が生きているセルを上記指南で解析し、
貼り付けで解決しました!
助かりました。
ありがとうございました! 最終列までコピーをしたいんですがエラーを繰り返しなかなか実現できません…
例えばA3セルがデータの始まりでA7セルが最終列の場合、以下の文になるかと思いますRange(“A3:A7”).copy
ただ、半年に一度最終列が一列追加になるので、メンテナンスしなくていいように上の文のA7の部分が最終列になるようにしたいです
この場合何かいい方法はあるでしょうか
オーソドックスなのはこれだけど、物凄い珍回答を聞いてみたいわ
Range("A3:A" & Cells(Rows.Count, 1).End(xlUp).Row).Copy
>>696
last_row = Sheet1.UsedRange.Row + Sheet1.UsedRange.Rows.Count - 1
last_col = Sheet1.UsedRange.Column + Sheet1.UsedRange.Columns.Count - 1
Debug.Print "A3:" & Sheet1.Cells(last_row, last_col).Address(RowAbsolute:=False, ColumnAbsolute:=False)
こんなん? >>690
ありがとうございます❗
探してたものに出会えました。
ググってはみたんですが、このサイトには巡り会えなかったので、本当に助かります。
やってみたら、思う結果になりました。
ありがとうございました。 行じゃなく列です
最終列が半年に一回追加になるのです…
>>697
ごめんなさい、最終列の話だったのでA3セルからD3セルをコピーする場合、以下になるんでした
Range(“A3:D3).copy
今はD3が最終列ですが、半年後にはD3が最終列になるイメージです 何度も間違えてすみません…
今はD3が最終列ですが半年後にはE3が最終列になるの間違いでした
Range("A3").CurrentRegion.Copy
ColLst = Sheet1.Сells(3,Columns.Count).End(xIToLeft).Column
Range(Sheet1.Cells(3,1),Sheet1.Сells(3,ColLst))
みたいにケツのColumnIndexを可変化させりゃええ
指定範囲より右側にコメントが入るのであれば別の方法を考える必要があるけど
UsedRangeだって使うの怖ない?
どっかにドットあるだけども持ってかれる
これってやり方は何通りかあるけど、
どの状況でも使える完璧なのが無いよな
一見よさげなUsedRange.Find法とかも、
検索と置換の状態が変わっちゃうし
ちゃんとやりたい場合列のヘッダの名前の有無を確認とか意味解析するしかないよ
vbaしかつかえないうんちなんだけど、ダイアログに変数名入れたら、その名前を反映させた定型コード作ってくれるような支援ソフトないの?
たとえば、Dim var: var= xとかFor i=LBound(arr) to UBound(arr)とか。いちいちめんどい。
cliborはつかってる。スレチだったらすまそ。
それこそ自分で作れよ
自分だけにに都合よく自動化したいならそれしかないだろ
最終列の取得をしてコピーしたいと申した者です
具体的には2シート目以降のC8セルから最終列までコピペしたくこのような文を書いてました
Maxcol = Worksheets(1).Range(“C8”).End(XlToRight).Column
For i = 2 To Worksheets.Count
Worksheets(i) = Range(Cells(8,3), Cells(8, Maxcol)).Copy
Worksheet(1).Cells(Maxrow,1).PasteSpecial Paste:=xlPasteValues
Maxrow = Maxrow + 1
Next i
上には書いていませんがMaxRowで最終行していて、1シート目の最終行にペーストするイメージです
このとき以下の箇所でエラーになりました
Worksheets(i) = Range(Cells(8,3), Cells(8, Maxcol)).Copy
>>713
やっぱVbaだと厳しいか、、、別言語だとこんなのあるんだな!ありがとう。 解決しました…
Rangeの中にCellsを入れる際はCellsの方にもワークシート名を記載してあげなければいけなかったんですね…
お騒がせしました
>>717
まあ、
Sheet.Cells(開始行, 開始列).Resize(行数, 列数)
もしくは
Sheet.Cells(開始行, 開始列).Resize(終了行 - 開始行 + 1, 終了列 - 開始列 + 1)
ってやるだけだし >>714
これで動くのか
それならまあいいけども コンパイルしたときに「ユーザー定義型は使用できません」といったようなエラーが出るのですが、
エラー箇所が選択されず特定できません。
ググってみたのですが「関数を一個ずつ切り貼りしながらコンパイル」的な記事しかなく、
結構大きなプロジェクトファイルになってしまっていて現実的ではありません。
原因って何が考えられますでしょうか。
情報が少なすぎるだろ
で、ユーザー定義型を使ったの?
>>720
VBAでは珍しいかも知れないけど
VBSではよくある話
実行前コンパイルの概念がないからね
別に1関数単位で抜かなくても
纏めてごっそり抜いてみて
エラーが発生しなくなったら
残った部分には原因がなくて
抜いた部分に原因があるんで
まずそうやって切り分ける
抜いた部分から半分くらい戻してやって
またエラーが起きないか確認するのを
繰り返して行く内に
原因の可能性がある範囲はどんどん狭まるんで
そうやって確認して行く 原因として考えられるのは
ない型を指定した場合なので
型宣言の書き間違えとかかな
>>721
使ってます。
また、クラスモジュールやライブラリも沢山使ってます。
以前なら間違っている名前の箇所が選択されるので、直ぐに原因が特定できたのですが・・・
>>722
今、出来る範囲でモジュールを解放・インポートを繰り返して検証して見たのですが、
フォームモジュールのいくつかが原因の様で、これらを抜くとコンパイル(実行前コンパイル)が成功します。
ただ、その原因と思われるモジュール内の全てのコードを削除しても同じエラー発生します。
意味が分かりません・・・ フォーム内のエラーはフォーム呼び出しコードが選択されるから、F8の手押し連打で進めて行けばエラー箇所で止まるんじゃね
いつもの人っぽいけど、クラスモジュールでエラー止める設定すれば分かるかもしれん
>>726
シートに書くとエラーの場所がわからないから標準モジュールに書け、
なんて書いてるサイトがあって、その解決策しばらく気づかなかったわ DimとかConstとかでタイプミス
SubやFunctionの宣言部でもよくある
Visual StudioでVB.netプロジェクトを作ってコピペで発見できる場合もある
>>725,726
実行時例外じゃないです。
>>728
>>724の通り、発生元と思われるモジュール内コードを全て削除しても発生し、
モジュール自体を解放すると発生しなくなるため悩んでいます。
私も一個づつ調べたいのですが、もはや調べ方も分からない状況です・・・。
>>729
宣言文のタイプミスでも、通常はエラーが発生すれば原因箇所が選択(反転)されると思いますが、
今回はそのエラー箇所の選択がなく困っています。
vscodeですがVB.netプロジェクトへのコピペもやってみましたが、
関係のないエラーや注意が大量発生して特定困難でした。
というか互換性ないと聞いたのですが・・・ お礼言うの忘れてました。
沢山回答ありがとうございます。
些細な事柄でも気になる点があればレス欲しいです。
一応質問内容をまとめます
・エラーが発生しているのはコンパイル時です
・通常あるエラー発生箇所の選択がされません(この「発生個所が選択されないという現象」自体の原因も調べています)
・原因と思われるクラスモジュールを解放すると発生しなくなります
・しかし、そのモジュール内のコードを消すだけでは引き続き発生します
なるほど
つまりVBAのコード側の問題ではないと
詳しい状況が分からんから何とも言えんけど
考えられる状況としては
・ファイルがぶっ壊れてる
・フォーム側に使ってるバージョンにそぐわないオブジェクトが設定されている
・使ってるバージョンにそぐわないAPIとかが使用されている
・何か変な参照設定切ってそれを使ってる
とかじゃない?
クラスとかライブラリ(何をもってライブラリと言ってるのかは分からんけど)使ってて
結構大きなプロジェクトファイル使ってると言うなら
元々動いてたものだったと思うんだけど
今改修を掛けているものが同じ環境下(EXCELのバージョンとか使ってるならランタイムとかが同じ)
で動くか確認した方がいいんじゃないかと思うよ
>>731
クラスモジュールを開放したあと、同名のクラスモジュールを空で新規追加したらどうなるの?
そのクラスモジュールの名前は何? >>724
インポートとかすると改行や全角空白、タブ、eofとかがおかしいのが入ることあるよ ぶっちゃけ原因不明でコードを新規ブックにそのままコピペしたら動いたってのは何度かあった
理由がわからんだけだったのかもしれないけど
怪しい辺りを切り取り貼り付けで直るパターンもあった
エクスポートして新規ブックでインポートしてどうなるか試せ
そのクラスモジュールとやらをどっかに張ればなんかわかるかもしれん
帳票でひな形ファイルにDBからのデータを張り付ける際に
ひな形ファイルに前もって用意している一覧より件数が多くなり
一覧部を増やす際って存在している行を必要分コピペしたら処理が重く遅くなりますか?
範囲指定して行の高さや罫線その他書式を作成していくのが普通ですかね
1件ずつコピペしてたら遅くなる可能性があるけど
必要な行数を計算してコピペ1回なら問題にはならんのじゃないかな
すげえ基本的な話だけど
2003と2019じゃソースを書き換えないと使えないのはわかるけど
2015と2019は使えるの?
書き換えないといけないところが分かるなんてすごい実力者だね
持ってないバージョンで動かないかもとか考えなくてもよくね
逆に、2019だけで動くようにしろと言われてもできる気がしない
わざと追加されたワークシート関数を使うみたいな、手段と目的を逆転させるのは無しで
そんなに言語仕様って変わってたっけ?
VBAの言語仕様なんて、64ビット対応しか変わってないだろ
EXCELのアプリケーションモデルは多少の変化はあったかもしれんが
2019未満は切り捨てるためにわざと2019仕様に変更とか
わからん
古いのいつまでも使われると新しいの売れないからかな
>>747-748
動かなくなる原因は言語仕様だけじゃないよ
2007 辺りでグラフ周りがかなり変更されてソースに手を入れる羽目になったとかある VB長けてる人ってExcelの機能関数に疎い人多いね
田中に聞けば?
Worksheetfunction使うのでそれはない。
2019欲しいけど
いまクソ高いんだよな
昔は10000ぐらいで買えたよな?
64bitで未定プログレスバー使うにはどうすればいいの?
原本となるシートでマクロが動いて欲しくないからマクロを搭載した別ブックのシートにコピーしようとしてるのだけど、activeXコントロールのコピーで詰んでいる。
selectAllすると位置がずれる、ネットで見かけるfor each x in sheets.Shapes方式だと「rangeクラスのTopプロパティを設定できません」とか出る(原因分からないうえ、同じものが複数コピーされてたりする)
Clickメソッド使ってるからシート自体に記述しなくちゃならない状態(原本にマクロを搭載できない理由でもある)
原本をコピーした新しいシートにマクロを転写する方法か、activeXコントロールをうまくコピーする方法などをどなたか分かれば教えてください。
よろしくお願いします
デザインモードじゃないから梃子でも動かないって意味か?
>>762
ブックを別名で保存してからそっちを開いたら?
コントロールの状態や中身まで含めた完全なコピーが簡単にできるよ >>760
わいはコントロールやめてユーザーフォームで自作した >>762
原本はそのままで動くように作っといて、原本をコピーするマクロは原本とは別ファイルにするのが良いんじゃね >>764
新しくシートをコピーしたらシートにプログラムが何も書かれてない状態になります(原本に記述されていないから)
シートにシートをコピーしたらコントロールが消えてしまいます(コントロールのコピーに躓いている)
>>766>>768
フールプルーフの観点で原本にプログラムを直接書きづらいんですよね。このツールを使うのも原本を更新するのも私じゃないので…
>>767
フォームなら別のブックにコピーできるし使いたいんですが要件的に使えないんですよね
最初はフォームで動作するものを作ったんですが、いちいちウィンドウが開くのめんどくさいと一蹴されました
あくまでシートにマクロをコピーする方法か、activeXコントロールの綺麗なコピーの方法を探しています。 >>769
出来るけど、セキュリティ的に大問題アリ。
マクロウイルスのやりたいことと一緒だからな。 質問です。
VBAでウィンドウの幅によってレイアウトが変化するページを取り込む方法で詰まっています。
例えば、下記のURLのテーブル「5」をExcelに取り込みたいとします。
しかし、このページはウィンドウの幅を狭くすると「自動レイアウト」になります。
https://www.nankankeiba.com/uma_info/2014104006.do
本当はPC固定レイアウトで取り込みたいのですが、下のVBAだと自動レイアウトの方で取り込まれてしまうのですが
どうしたらよろしいでしょうか。
VBA
PC固定のレイアウトで取り込みたいけど、取り込むとこうなる
>>773
列や行の関係でPC固定で取り込めるようにしたいのですが、クエリで何か設定などあるのでしょうか >>774
よくわからんが内容は正しく取得できているんだから、表示用のシート作って
そっちに2行を1行にまとめて表示させるマクロ書けばいいんじゃね >>775
実は最近サイトがスマホ用に「自動レイアウト」に対応してリニューアルしたので
もともと作ってあった表示用シートが連れてしまうために「PC固定レイアウト」にしたいのです… URLの後ろに何か引数入れればいいんだろうけど、javascript読めんからわからん。
Web系のスレで聞くか、ここでやるんだったらDOM解析してgetElementsByTagNameとかで取得するしかない。
>>777
やっぱりweb系のプログラミング知識がないと無理っぽいですかね
自分はさっぱりなので、そっち系でも聞いてみます。 ってそれExcel2013?
2019だとどちらも見えていて、
Table4が自動でTable5が固定になっている。
もし2019が使えるなら、QueryTables.Addじゃなくて、
Queries.Addでやってみるといい。
>>779
わあああ!できました!!!
自分のだと、テーブル5だと自動で、テーブル6が固定でした!!
固定と自動でテーブルずらすだけで良かったんですね。
本当に助かりました;;感謝! なるほどー
URLの違いじゃなくてテーブル数が増えていてテーブルの変更でレイアウトを別々で読み取っていたんですね
今後も参考になる知識でめっちゃタメになりました!
いやーID:Ydjbk0QN0さんの着眼点のおかげで助かりました。感動です
XMLを取得したあと、要素を取得するためにgetElementByIdを使用する方法は無いでしょうか?
XMLでは仕様上IDの規定が無いのでこのメソッドは無いようですが、
対象にしているデータはIDが重複していない(タグ名は重複)ことが分かっています
やったことないけどXMLをブラウザーで開いて取得とか
>>783
単なる属性値だからxpathで属性検索すればいいんじゃね? >>785
ごめんなさいこれで出来ました
コーディングミスしてただけだったようで… テーブルを使った列転記について質問です。
オートフィルターを使って、
特定条件に合致する列のみを別シートに転記するvbaを作成しています。
検索条件が1件でもヒットすれば、うまく動くのですが、
検索条件の結果が0件の場合、なぜかテーブル内にある全ての列がコピーされてしまいます。
解決方法をご教示いただけたら幸いです。
With Range("A3").ListObject
.Range.AutoFilter 1, "佐藤"
.Range.AutoFilter 2,"2020"
.Range.AutoFilter 3, "土地"
.ListColumns(4).DataBodyRange.Copy Sheets(2).Range("B12")
.ListColumns(5).DataBodyRange.Copy Sheets(2).Range("D12")
.ListColumns(6).DataBodyRange.Copy Sheets(2).Range("C12")
End With
Countifsで、1件以上の時 と
条件分岐させるのが読み返してわかりやすくなるんでね
前回の表示が残っているならメッセージボックスとか出すといいかも
(1)A1〜A100セルにそれぞれ0001.txt〜0100.txtという文字列が格納されている
(2)ファイルサーバ上(\\share\txt)に(1)の名前と対応する実際のテキストファイルが格納されている
→この場合、B1〜B100セルの中に(1)と対応する(2)のテキストファイルの中身を自動で入力させたいのですが、どのようにすれば可能でしょうか。。
A1セルに書かれたファイル名を読み取る
そのファイル名を開く
B1セルから書き込む
を繰り返せばいいと思います
>>791
どうでもいいがB1〜B7へは入力じゃなくて出力って言った方がいい >>720ですが、解決というか悪化したので一から作り直すことにしました。
原因と思われていたフォームモジュールを解放しても常時コンパイルエラーが発生するようになりました。
思い切って順に全て解放しながらコンパイルしてみたところシートを含めた全てのモジュールを
削除して新規シート一枚の状態でも発生する始末です。
>>733
試してみたところ、使用できない文字を使った時と同じ「不正なオブジェクト名」だと怒られます。
(もし重複なら「既に〜使われています」)
コンパイルエラーの原因にある「ユーザー定義型」というのはフォームのモジュール名の事だったのかも・・・
ちなみに原因らしいフォームのモジュール名を変えても同様のコンパイルエラーは発生し、
その新しいモジュール名でも同じ症状が出るようになります。
>>732
>>何をもってライブラリと言ってるのかは分からん
すみません。参照設定にあるCOMコンポーネントの事です。
APIはSleepしか読み込んでおらず、
コントロールもリストボックスとコマンドボタンとオプションボタンのみです。
元の環境で実行も出来ませんでしたが、
テストで色んなモジュールの解放してインポート、モジュール名変更して戻すを繰り返していると、
プロジェクトのコンパイルは同じエラーがでるが、(環境問わず)実行は可能という状態になりました。
コンパイルのテストしかしていなかったのでどのタイミングで実行可能になったのかは分かりませんが、
引き続き調べてみます。 >>733
レスに追加です
名前の変更では「不正なオブジェクト名」と出ますが、その名前でのインポートは成功します。
インポート出来れば自由にフォーム名を変更したり戻したりできました。
>>735
見てみましたが、特に変わりはないようです。
>>738
フォームモジュール以外を全部移したところコンパイルが通りました。
同じフォームを作って再発すると怖いので、
フォームに有ったコントロールはシート上に再現して、とりあえずこれで運用してみることにしました。 シートの中身を初期化しようと、範囲選択してClearcontentしたら処理が滅茶苦茶重くて
他のどの処理よりも一番重いまであります
セルの中身をクリアして真っ新にしたいんですが、軽くなる方法とか削除するのに他のいい方法は何かありますか?
場合によってはシートごと削除&同じ名前のシート作成orテンプレで用意していたシートをコピー
>>800
Clearcontentsじゃなくて単に「削除」に時間が掛かってるだけ説。
どうしようもないExcelのバグ、俺もこの前株シミュレーター作ってて直面した。
たかだが3万行×1列消すのに10分掛かる糞仕様。
どういうわけかD列とE列に入っているがD列を消してからだとE列が、E列を消してからだとD列がそうなる。
2007と2013入れてたがどちらでも同じ結果。スプレッドシートでならサクっと消せた。 質問させてください
業務用PCのためDsoFramerのインストールを容易には出来ない環境で、ユーザーフォームにワークシートを表示するシステムを作成するのは厳しいでしょうか
レスありがとうございます
画面更新は勿論切ってます
ただ初期化したいだけなのにアホみたいに時間が掛かるので、同じ使用のシートを作る処理にする事も検討します
変数に入れてから消すとか、同じ選択範囲の配列(空白)ぶっこんでみてもだめかな
一気に何万行も消さずに100行ずつとか小分けしたら軽くなったりしないのかな
ClearContentsで重かったことなんてないなあ。
めんどくさくてVBAじゃなくマクロで作って選択範囲小分けのまま放置してるからかな?
>>800
ふーん
範囲指定して消したらどう?
後、最近のEXCELはひょっとして
セルの内容が変わったら
再計算しているかも知れないから
一応自動計算も切ってみたら?
セル値が変わった時のイベント拾って
何かやってるとかいうオチだったら
問題外だけど スレが見つからなかったのでこちらで失礼します
C8の値が$100にならない理由を教えて下さい
関数変わっちゃうけど代案を出すなら
VLOOKUP(B8,B1:C5,2,FALSE)
とかどう?
LOOKUPって近似値を検索する関数だから文字列探そうとすると上手くいかない事が多かった気がする
だから面倒臭くなってVLOOKUP,HLOOKUPを使うように癖をつけた記憶がある
これ思い出したわ
>>810
C8 が "もり " みたいに空白入ってるとかじゃね? 検査範囲の値は昇順にしてください
そうでなければ正しい値はえられません
並んでないときはVLOOKUPやHLOOKUPを使ってください
という旨のことをヘルプに書いてある。
LookupにもVLookupやHLookupみたいに検索方法のオプションあればいいのにね
まあMSとしてはExcel最新版にしてXLookup使ってねって言うことなんだろうな
初期化で若干重たいのは取り敢えず諦めることにして、外部のCSVをクエリテーブルで読み込んでから
Refleshでシートに書き込んでるのですが、この書き込む前の段階で、クエリテーブル上で不要な列のデータを削除する事って可能でしょうか?
不要なデータが大量に混ざっているので、全部まとめてシートに書き込むとやはり重たいので軽量化したいのですが……
lookup系よりindexmatch使うことが多いな
lindexmatch使いアピールしてはじめて自称excel上級者として一人前
昔はユーザー定義関数作ったけど、今はXLOOKUPがある。
IindexMatchなんぞ使わず、
列をボーンとコピー挿入してVLOOKしてこそ一人前
実際に使ってないような質問をして答えさせて悦に入る人
webページからデータをとってきてセルに格納するマクロを書いています
msxml2.xmlhttpというのを使うとページの内容をgetすることができるのですが、これはどうやらieを利用しているようです
ieはいつなくなるかわからないので他の方法があれば今のうちから変えておきたいのですが、vbaで使える方法で他にどういうのがあるか教えてください
IEはなくなるのにVBAは大丈夫だと思う理由は?
言語もPythonとかにしてBeautifulSoupやSeleniumでも使った方がよい
無くなったときのビジネスインパクトはIEよりもVBAの方が遥かに小さいから、MSがどっちか先に切るとしたらVBAだろう
最悪VBAは切られてもExcelのバージョンを塩漬けにして運用できなくはないしな
>>830
まあそのうちpythonに移行するんでしょうけど、今は慣れない言語を一から勉強してる暇はないので
それで、あなたはvbaでやる他の方法を示せないということでよろしいですか?
>>831
どうかな、じゃなくてどうやるのか教えてください >>833
なんだただの馬鹿か
煽って聞きだそうとしてもこのスレはいつものあいつで耐性ができた人ばかりだから無理 >>836
答えられないならレスしなくていいよ
無能に用はないから 馬鹿は自分が相手にしてるのはただ一人だけと思い込む
保存して閉じる処理をしても、ファイルは閉じてもExcelはとじません
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'処理
Application.DisplayAlerts = False
Application.Quit
ThisWorkbook.Close savechanges:=True
Application.DisplayAlerts = True
End Sub
これでもダメでした
Application.Quit
ThisWorkbook.Close savechanges:=True
>>849
Application.Quit
ThisWorkbook.Close savechanges:=True
ActiveWindow.Close
これもダメでした Application.Quit
Application.DisplayAlerts = False
ThisWorkbook.Close savechanges:=True
Application.DisplayAlerts = True
Application.DisplayAlerts = False
If Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close
Application.DisplayAlerts = True
End If
とかどう?
>>848
何でセーブする前にEXCELのアプリケーション閉じようとしてるの? >>851
>>852
ダメでした。
ほかのファイルでは問題なくExcelが終了するのですが
Private Sub Workbook_BeforeClose(Cancel As Boolean)
を使うマクロのときだけ、閉じなくなるような気がします。関係ありますかね? わざわざセーブメッセージ叩き潰して
ブック捕まえたまんまにして
アプリケーション閉じようとしてるんだから
わざと閉じられないようにしているようにしか見えない
>>854
BeforeCloseにApplication.Quit記述してイミディエイトからThisWorkbook.Closeを実行してみたけど問題なく閉じたから何か別の物が干渉してる可能性があるかなぁ >>855
当初はこれでしたが、ググったら、Application.Quitを上に書くらしいです
ThisWorkbook.Close savechanges:=True
Application.Quit
>>856
Application.Quit
ThisWorkbook.Close savechanges:=True
だけでも同じでした
>>857
他に保存する方法を教えてください
>>858
自分でも試してみましたが、確かにちゃんと閉じますね。他の干渉を疑ってみます。
>>859
2019です Application.EnableEvents = true
を頭に付けてみるとか
そこでやるべきことは ThisWorkbook.Save だけだと思うんだが
コマンドプロンプトでtaskkill /f /im excel.exe
Quitは最後では
変なExcelプロセスが残ってないか確認した方がいいのでは
VBEでVBAを使って出来たものがマクロであってる?
本屋にVBAの本とマクロの本があるけど同じことと思っておk?
「VBEで作ったものはマクロ」
これは合ってる
「VBAとマクロは同じことを言っている」
マクロにはVBAtで作られたもの以外に
4.0マクロと言うものが有ってだな・・・
まぁ、あまり気にしなくても良いかもしんないけど
マクロ
スクリプト
関数
これらはプログラムのひとかたまり
厳密に区別しずらいけどそれぞれ
ニュアンスの違いはある
>>865
VBEはエディタ。Excelの場合はVBAとマクロは同じ意味で使われる。ExcelマクロがExcel VBAのコードで表現されるため。 >>866
まだ表紙なのに理解半分かw
>>867
4.0マクロネットで見て使ったこと1回だけあるけど関数みたいなやつだった記憶。
>>868
スクリプトも便利そうですよね。
デスクトップかっこ良くするフリーソフトに自由にスクリプト使えますって書いてあって挫折した。。
>>869
出来たもんがマクロでVBAが設計図でVBEが紙と鉛筆か。
みんなありがと、ネットにも解説サイトあるけど違うとこ見ちゃうから本買ってくるわ。ノシ そういえばvbaをjsで書ける世界まだなんだっけ?
gasみたいな感じで書けないかな
WScriptのJScriptでExcel使えるだろ
微妙に違う気がするなあ
VBAはプログラミング言語の名前(の略称)。単語と文法が書いてあるだけの辞書みたいなもん
その言語で書かれた物がマクロで、むしろ設計図はこっちが近い
VBEはマクロの作成を手助けするツール、紙と鉛筆って考え方はだいたい合ってる
で、マクロの中でも結果を一組だけ呼び出し元に返すように作られてるのが関数
機能とワークシート関数とか全くわからん
操作なんてVBAで良いじゃん
周りでもそういった人いるしさ
本来、Excelの操作の自動化を目的にしたVBAマクロなのに元の機能そのものが全く分からんとか本末転倒にも程がある
作成依頼です
一定範囲内において、選択されたセルすべてに、書式設定で取り消し線を付けたいです
たとえば、D5からD20の範囲内で、そこ以外の範囲が選択されていた場合はエラーを返す
範囲内なら、選択されたセル(単一、複数、飛び石あり)すべてに、一括で取り消し線を追加
というような感じです
飛び石状態で複数が選択された場合に、上手く処理できなくて相談させていただきました
よろしくお願い致します
>>879
選択範囲をまとめて見るんじゃなくて、選択されたセル一つ一つについて既定の範囲内にあるか条件判断をし、エラーかそうでないか
エラーでなく全てのセルが範囲内なら一つ一つのセルに取り消し線を追加
とすれば普通にできるでしょ
横着しようとしてるからいけないんじゃないの VBEは赤ペン先生?全部じゃないけど間違いをすぐ教えてくれる
>>879
For Eachでセルを1個ずつ処理するんだよ
For Each、セルアドレスチェック、1つでもD5-D20じゃなかったらエラー
エラーがなかったらもう一度For Each、各セルに取り消し線
みたいな流れ ピボットグラフのスライサー内の選択を変えた時にマクロが動くようにしたいです
イメージ的にはワークシートイベントです
例︰スライサーの日付を変更時にグラフの色を塗る
選択変更の検知方法を教えてください
よろしくお願いします
外枠でも大差ないと思う
Selectionの上下左右に罫線を引くだけ
>>879
If Intersect(Selection, Range("D5:D20")).Count <> Selection.Count Then
MsgBox "エラー"
Else
Selection.Font.Strikethrough = True
End If だってさ、先輩がExcelなんか全部マクロで動かせば良いって言われたからさ。。。
ワークシートの関数とかそんなもん覚えなくて良いと言われたからさ。
だからVBAしか知らない。
今凄く関数とか機能を覚えるために苦労してる。
>>891
無理してやる必要ないのに、何のために覚えるの? vlookupはなんであんな変なインターフェースなんですか
screenupdapingを非表示にした状態でcalculationを自動にしたら、ちゃんと計算やってくれますか?
>>898
updatingが表示になったときに計算されるのか、非表示中に計算されてるのかがわからないのです。 ExcelからVBAが完全になくなるより先にMSが先になくなりそうじゃない?
>>899
対象セルのvalue値を処理中に
debug.printで書き出すなり
どこかのセルに突っ込むなり
トレースして確認するなりすればいいじゃん
まず聞く前にググる癖をつけないと
いつまで経っても誰かに聞かないと
何も出来なくなるよ >>903
わかりました。てか式の値見ればすぐわかりますね。やってみます 今日水曜日なのにweekdayName(weekday(Date))で木曜日と出るのは仕様?
Dateは2021/03/10
weekday(Date)は4
と出ることは確認済み
weekdayとweekdayNameで週始めを日曜とするか月曜とするかで差が出てるんだろうからweekdaynameをvbSundayにすることで解決はするけど、何かが原因でここに違いが出てるなら修正したいので仕様かどうか知りたい
Weekdayの規定値がvbSundayで、WeekdayNameの規定値がvbUseSystemDayOfWeek。
どっちかに合わせた方がいいと思う。
やっぱり>>885の方法はないですかね
諦めてマクロボタンで更新します
ありがとうございました >>907
なるほど、自分のwindowsカレンダーの開始日が月曜になってるからなのか
なんで既定値が違うんだろうという疑問は残りつつも納得、ありがとうございました 正確にはVBAエキスパートか。
見過されがちだけど、試験対策本は非常によくまとまっている。
買う前に周辺の図書館を回れば、vba本が見つかるかもしれない
650頁を超える「Excel VBA逆引き辞典パーフェクト」を最初から通して読む
VBの、何かあの電話帳より分厚いの有るじゃん
叩かれると85ポイントくらいダメージを受けそうな感じのアレ
マジレスすると、あれで勉強したわ
まじレスすると他人のおすすめの本は買っただけで満足して読まない可能性が高い
>>910
出来るだけ薄い奴がいいよ
少なくとも一週間で読み切れそうな奴
細かい部分は結局ググる事になるから手っ取り早く基礎だけ学べるのがいい
プログラミングの勉強は書き方を学ぶというより、
「ググる方法、ググって出てきた内容を理解できる最低限の知識」を身に着ける方に重きを置いた方がいい >>910
現在の知識レベルによって薦める本は変わってくるけどなーんも知らないと言うのならVBAの絵本でいいんじゃなかろか
>>919の人も言ってるけど基本、ネットで調べることになるんでどちらかというと
自分が知りたいことを調べられる単語をすぐに思い浮かべる力と
それを理解する力の方が自分的には重要な気がする
後、理解出来なければ取り敢えず書いてみてこねくり回すことも大事
本当に基本的なことさえ分かっていれば、
その内クラスやAPI、コールバックとかにぶつかることがあってもネットで調べることが出来れば
自分が然るべき理解力をつけた際に理解出来るようになる。 メルカリなどでたくさん買って、好きなのを使えばいいよ。
Excel VBAは自己流が多いと思うけど、体系的に学習するならマイクロソフトのVBAエキスパート本だろうな。
小手先のテクニックより
複雑怪奇なExcelの挙動の中身がどうなってんのか
詳細に説明してほしいわ
謎挙動がおおすぎる
>>924
あまり使われていないVBAの機能を使うとすぐにバグにはまる。 vbの構文がダサすぎるのが嫌
綺麗に書いても汚らしく見える Dim asとかキモいんだよ
VBAのコードのフォントを HGP行書体 (日本語) とかにしてみたら?
ACCESSのレポートではかけたのですが
VBAで規定の先よりも細い線を書くことはできませんか?
コントロールのボタンが押す度徐々に小さくなったり消えたり動き回ったり
配列返す関数をUboundに渡すとメモリリークしたり、
フォームをモーダル表示中にシートをアクティブにすると何故かシートを操作できたり、
インターフェースを実装するクラス自体をインターフェースに出来てしまう上に、それをするとバグったり、
いくらでも上げられるだろ
特にフィルタ関連は変なのが多い
specialcells(xlcelltypevisible)とかcopyメソッドとか
作成依頼なんですがお願いできますでしょうか
A列に数字(No.)
B列に文字列(名前)の3000行ほどの表があります。
A列の数字は重複している箇所があり、
A列が他の行と重複している場合B列の文字を全て繋げてC列に書き出したいのですが可能でしょうか。
サンプル
A列 B列 C列
11111 A子 A子
11112 B子 B子
11113 C子 C子・D子・E子
11113 D子 C子・D子・E子
11113 E子 C子・D子・E子
11114 F子 F子
11114 F子 F子
11115 E子 E子
ただし、サンプルのように
A列が重複してもB列の文字列が同じだった場合は『F子・F子』とならずに『F子』のままで、
重複しないA子、B子もそのままにしたいのです。
Aが列の数字は最大で20ほど重複している場合があります。
ずっと手作業でやってて挫けそうなんでお願いします!!
>>932
Sub Macro1()
rr = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To rr
n = Cells(i, 1)
s = Cells(i, 2)
t = s & "・"
For j = 1 To i - 1
If Cells(j, 1) = n Then
w = Cells(j, 2)
If InStr(t, w) = 0 Then
t = t & w & "・"
End If
End If
Next
t = t & s & "・"
For j = i + 1 To rr
If Cells(j, 1) = n Then
w = Cells(j, 2)
If InStr(t, w) = 0 Then
t = t & w & "・"
End If
End If
Next
t = Left(t, Len(t) - 1)
t = Right(t, Len(t) - 1 - Len(s))
Cells(i, 3) = t
Next
End Sub >>933
どひゃ〜!!!!
しゅ、しゅごいぃいいい!
ありがとうございます!ありがとうございます!本当にありがとう! それ、例えば百合さんと百合子さんがいた時にバグらない?
こういうのは辞書に登録してitemsプロパティをjoin関数に渡すのが鉄板だと思う
最近ならvba使わずにfilter関数とunique関数でも同じことできるから、もしかしたらこっちの方が楽かも
百合・百合子バグ修正
Sub Macro1()
rr = Cells(Rows.Count, 1).End(xlUp).Row
For r = 1 To rr
n = Cells(r, 1)
s = Cells(r, 2)
t = "・" & s & "・"
For i = 1 To r - 1
If Cells(i, 1) = n Then
w = Cells(i, 2)
If InStr(t, "・" & w & "・") = 0 Then
t = t & w & "・"
End If
End If
Next
t = t & s & "・"
For i = r + 1 To rr
If Cells(i, 1) = n Then
w = Cells(i, 2)
If InStr(t, "・" & w & "・") = 0 Then
t = t & w & "・"
End If
End If
Next
t = Left(t, Len(t) - 1)
t = Right(t, Len(t) - Len(s) - 2)
Cells(r, 3) = t
Next
End Sub
百合・D・ルフィバグ修正
Sub Macro2()
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
rr = Cells(Rows.Count, 1).End(xlUp).Row
For r = 1 To rr
For i = 1 To rr
If Cells(i, 1) = Cells(r, 1) Then
s = Cells(i, 2)
If Not d.exists(s) Then d.Add (s), 0
End If
Next
Cells(r, 3) = Join(d.keys, "・")
d.RemoveAll
Next
End Sub
>>932
Ruby で、CSV ファイルでやってみた
require 'csv'
tmp_hash = { }
result_ary = CSV.read( "input.csv" ) # 2次元配列
result_ary.each do | row | # 1行ずつ処理する
if tmp_hash.has_key? row[ 0 ] # 既に、その数字が存在すれば
# 文字列が存在しない時だけ、その文字列を追加する
tmp_hash[ row[ 0 ] ][ row[ 1 ] ] = true unless
tmp_hash[ row[ 0 ] ].has_key? row[ 1 ]
else
tmp_hash[ row[ 0 ] ] = { row[ 1 ] => true }
end
end
# p tmp_hash
# {"11111"=>{"A子"=>true}, "11112"=>{"B子"=>true},
# "11113"=>{"C子"=>true, "D子"=>true, "E子"=>true},
# "11114"=>{"F子"=>true}, "11115"=>{"E子"=>true}}
result_ary.each do | row | # 1行ずつ処理する
# その行の3列目に、キーを結合した文字列を追加する
row.push tmp_hash[ row[ 0 ] ].keys.join( "・" )
end
csv_str = result_ary.map( &:to_csv ).join # 2次元配列を、CSV 文字列に変換する
print csv_str >>940
度々ありがとうございます!
最初ヤツでも今の所大丈夫そうでしたが、今後はこちらを使わせていただきます!
他の方もありがとうございます! >>942
rubyスレだと相手にもされないからわざわざ違うスレに来てるかわいそうな人だよ >>945
現代だとどう書くの?
ランキングによると結が人気あるらしいから結A、結B、結Cか そんなこと言ったら、なぜ日本人なのか、なぜ人類なのか
手作業でAからFカップを調べる作業にVBA使うとか
お前ら男として終わってるわマジで
わざと間違えるっていう2chから続く伝統芸
>>933
いきなりCellsで始まるのはいただけないなw
できればブックから始める習慣を付けて欲しい。 >>957 なおした
Option Explicit
Sub VBA69_932()
Dim A_number As Long, B_name As String, C_list As Object
Dim last_row As Long, row_loop As Long, search_loop As Long
Set C_list = CreateObject("Scripting.Dictionary")
With ThisWorkbook.ActiveSheet
last_row = .Range("A" & Rows.Count).End(xlUp).Row
For row_loop = 1 To last_row
C_list.RemoveAll
A_number = .Range("A" & row_loop)
For search_loop = 1 To last_row
If .Range("A" & search_loop) = A_number Then
B_name = .Range("B" & search_loop)
If Not C_list.exists(B_name) Then
C_list.Add (B_name), 0
End If
End If
Next
.Range("C" & row_loop) = Join(C_list.keys, "・")
Next
End With
End Sub >>933
謎の変数名を多用するのやめてくれ。見る気が一瞬で失せる。
ネスト深くするのも罪悪感感じてくれ >>960 なおした
Option Explicit
Sub VBA69_932_a()
Dim This As Worksheet
Dim table() As Variant
Dim A_number As Long, B_name As String, C_list As Object
Dim last_row As Long, row_loop As Long, search_loop As Long
Set C_list = CreateObject("Scripting.Dictionary")
Set This = ThisWorkbook.ActiveSheet
last_row = This.Range("A" & Rows.Count).End(xlUp).Row
ReDim table(last_row - 1, 2)
table = This.Range("A1:C" & last_row)
For row_loop = 1 To last_row
A_number = table(row_loop, 1)
C_list.RemoveAll
For search_loop = 1 To last_row
If table(search_loop, 1) = A_number Then
B_name = table(search_loop, 2)
If Not C_list.exists(B_name) Then
C_list.Add (B_name), 0
End If
End If
Next
table(row_loop, 3) = Join(C_list.keys, "・")
Next
This.Range("A1:C" & last_row) = table
End Sub 変数にABCなんてのを使ってる時点でセンスゼロ
後で見て全くわからないバグの温床にしかならない
>>964
うーん
頭ごなしに糞というつもりはないけど
そうだね、もし改善点を挙げるとすれば・・・
まぁ聞き流して良いけどね。
・変数名は一貫性を持たせて、一見して何を意味しているのか分かるようにすること。
例えば頭の1文字が大文字だったり小文字しているのをキャメル形式に統一するとか。
・ActiveSheetは極力使わない。
キチンとした意味を持っているならそれでいいけど、フォームやツールバーから呼ばれることやそのように改修される可能性も考慮してどのシートを使うか明示的に指定する方が良い。
もちろんその際はシート名が変更されてしまうことを考慮して
シート名ではなくシートオブジェクト名を使用する。
・単一責任原則を踏襲する。
一つの関数またはメソッドに、一つの役割のみ持たせて一つの関数またはメソッドが増長になることを防ぐ。
とは言ってもこれは何を一つの役割とするかを決めるセンスが必要で、
これを上手く作れれば「糞」からひとつ脱却出来る。
後は趣味の問題だけど
・Withを使わないことに慣れる。
VBA → VB.Net → C#に移行したとき、Withが無いから慣れておくとちょっと楽。
・CreateObjectは使い所を考える。
CreateObjectはバージョンを考慮せずに済んだりする反面、
メソッドやプロパティのインテリセンスが効かなくなるため、タイプミスをし易くなるという欠点がある。
参照で繋ぐか、CreateObjectで作成するかは
一考した方が良い。
尚、本来Variant型は何でも入ってしまう危険な型なので
使わない方がいいと言いたいところだけど
EXCELのRangeオブジェクトとあまりに相性が良いから使うなとは言えない。 >>967
940が一番何をしてるのか分かりやすい
これにシート銘柄をしっかり記述すればよいのでは? >>964
ついでにもう一つ言っておくと、
ディクショナリやコレクションの要素数は1バイトで扱える数、つまり1から数えて256まで。
着眼点は良かったけど、3000行を考慮すると
オーバーフローで落ちる可能性があるよ。 >>956
ちがう
金星(まぁず)ちゃんというDQNネームがあった ディクショナリは重複確認用で3000データをまるまる格納する訳じゃないだろ
>>977
>ディクショナリやコレクションの要素数は1バイトで扱える数、つまり1から数えて256まで。
初耳 経験からくる誤った思い込みだろうね。
1バイト単位の区切りというのは、8ビットパソコン時代からExcelが存在していれば、可能性としてあるが、16ビットパソコンから作っているのに1バイトという制限はありえない。
>>985
論点ずらしだな。単純に初期のExcelの時代だとメモリ節約で1バイトにしただけで、足りないと判断されたものは、のちに2バイト、4バイト単位に変更されている。 改善点とか言って挙げてる内容は偏ってて微妙だし知識も無いのに態度だけ上からだし昔の人はすごいなぁ
>>985
例えば列の幅が255文字なのは別に1バイトで管理してるわけじゃなくて上限を設定してるだけだろ
そう言うのはExcelに限った話じゃないよ >>941
11111,A子
11112,B子
Ruby で、こういうCSV ファイルを処理した場合、
辞書は、こうなる。
値のtrue に意味はない
{"11111"=>{"A子"=>true}, "11112"=>{"B子"=>true},
"11113"=>{"C子"=>true, "D子"=>true, "E子"=>true},
"11114"=>{"F子"=>true}, "11115"=>{"E子"=>true}}
F子は、重複しない ただし、このファイルを、1パスでは処理できない
11113,C子
11113,D子
11113,E子
"11113"=>{"C子"=>true, "D子"=>true, "E子"=>true},
C子 を読み込んだ時点で、その行よりも後ろにある、
D子・E子 の情報を取得できないから
だから、>>941
では、データ配列を2回読んでいる >>964
64bit版の時はlonglongで宣言するようにしないとエラーになる可能性があるよ そんな考えならプログラミングやめたほうが良いんじゃない
何でもかんでもLongLong使うのが正解だとでも思ってるの?
>>993 はデタラメを言っているな。妄想なのかな。 他の言語や環境の仕様とごっちゃになってるんだろうな。
Excel VBAで32ビットと64ビットで、よく使われるデータ型に大きい違いがあるなんて聞いたことがない。
LongLong は 64bit 環境でないとサポートされないとか LongPtr のビットサイズやバリアント型の文字列の付加サイズが 32bit と 64bit 環境で違うとかはあるけどまあ些細といえば些細な話だわな
そもそも現状最大行数が Long 型で扱えるのに >>991 が何を心配してるのか興味ある 64ビットというのも何の組み合わせを言っているのかもわからない。
それにしてもここはマイクロソフトのサポートの人がいないか?
この中途半端さが日本マイクロソフト風なんだが。
組み合わせ?
単に64bit Excelかどうかだけじゃね?
lud20210605082125ca
このスレへの固定リンク: http://5chb.net/r/tech/1607786543/ヒント:5chスレのurlに
http://xxxx.5ch
b.net/xxxx のように
bを入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像
↓「Excel VBA 質問スレ Part69 ->画像>9枚 」を見た人も見ています:
・Excel VBA 質問スレ Part68
・Excel VBA 質問スレ Part50
・Excel VBA 質問スレ Part67
・Excel VBA 質問スレ Part47
・Excel VBA 質問スレ Part64
・Excel VBA 質問スレ Part60
・Excel VBA 質問スレ Part65
・Excel VBA 質問スレ Part62
・Excel VBA 質問スレ Part37
・Excel Python 質問スレ
・【FFBE】 FINAL FANTASY BRAVE EXVIUS 質問スレ7
・【FFBE】 FINAL FANTASY BRAVE EXVIUS 質問スレ6
・Voyage Century 質問スレッド Part2
・幻想神域 -Innocent World- 質問スレ Part14
・ReplaceStr.txt活用、質問スレッド Part1
・シノアリス質問スレ【SINoALICE】 Part3
・ツクールVX Ace 初心者救済、質問スレ Part.4
・JaneXeno質問スレ10
・疾風西遊記 質問スレ1
・gdi++.dll 質問スレ 1px
・DELL SC4x0 T10x 質問スレ Part1
・【FM】Football Manager 質問スレ 34
・OutlookExpress質問スレッド Ver.13
・【PoE】 Path of Exile 質問スレ part23
・【PoE】 Path of Exile 質問スレ part20
・【PoE】 Path of Exile 質問スレ part15
・【PoE】 Path of Exile 質問スレ part26
・【PoE】 Path of Exile 質問スレ part23
・【PoE】 Path of Exile 質問スレ part28
・【FM】Football Manager 質問スレ32
・【FF14】FINAL FANTASY XIV 質問スレ106
・【PoE】 Path of Exile 質問スレ part42
・【PoE】 Path of Exile 質問スレ part18
・【FF14】FINAL FANTASY XIV 質問スレ103
・【海外通販】AliExpress初心者質問スレ 6
・FL Studio 初心者&質問スレ Step 26
・【海外通販】AliExpress初心者質問スレ 17
・【海外通販】AliExpress初心者質問スレ 16
・FL Studio 初心者&質問スレ Step 25
・【FF15】FINAL FANTASY XV 質問スレ No.3
・【FF14】FINAL FANTASY XIV 質問スレ128
・【FF14】FINAL FANTASY XIV 質問スレ135
・【PoE】 Path of Exile 質問スレ part27
・【FF14】FINAL FANTASY XIV 質問スレ176
・【海外通販】AliExpress初心者質問スレ 13
・【FF14】FINAL FANTASY XIV 質問スレ154
・【FF14】FINAL FANTASY XIV 質問スレ108
・【FF14】FINAL FANTASY XIV 質問スレ174
・【PoE】 Path of Exile 質問スレ part45
・【FF14】FINAL FANTASY XIV 質問スレ153
・【FF14】FINAL FANTASY XIV 質問スレ148
・【FF14】FINAL FANTASY XIV 質問スレ139
・【FF14】FINAL FANTASY XIV 質問スレ129
・【FF14】FINAL FANTASY XIV 質問スレ124
・【FF14】FINAL FANTASY XIV 質問スレ134
・【PoE】 Path of Exile 質問スレ part33
・【FF14】FINAL FANTASY XIV 質問スレ102
・【FF14】FINAL FANTASY XIV 質問スレ136
・【FF14】FINAL FANTASY XIV 質問スレ146
・【FF14】FINAL FANTASY XIV 質問スレ132
・【FF14】FINAL FANTASY XIV 質問スレ133
・【FF14】FINAL FANTASY XIV 質問スレ125
・ギター初心者スレ 85●雑談相談質問● ワッチョイ有
・ギター初心者スレ 81●雑談相談質問● ワッチョイ有
・Le Ciel Bleu ル・シエル・ブルー 質問スレ Part13
・【海外通販】AliExpress初心者質問スレ14【ワッチョイ】
00:57:45 up 52 days, 2:01, 0 users, load average: 7.48, 7.72, 9.64
in 1.0581140518188 sec
@1.0581140518188@0b7 on 030614
|