◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:Excel VBA 質問スレ Part63 ->画像>2枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1568630099/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
!extend:checked:vvvvv:1000:512
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part62
http://2chb.net/r/tech/1561303297/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
糞レスで埋めるなら前スレのCSVファイルをQueryTablesで読むサンプル残しとく超参考になった 967 デフォルトの名無しさん (ワッチョイ 1fce-Nl8y) sage ▼ New! 2019/09/13(金) 00:48:49.27 ID:VS8vqVEc0 [1回目] 文字列として読み込めば0は消えない あとLineInputよりクエリのがずっと速い サンプル Sub CSVread() With Worksheets("Sheet1") '読み込むシート With .QueryTables.Add(Connection:="TEXT;C:\tmp\test.csv", Destination:=.Range("A1")) 'ファイル名とセル位置 .TextFilePlatform = 932 '文字コード指定 .TextFileCommaDelimiter = True 'カンマ区切り指定 .RefreshStyle = xlOverwriteCells 'セルに上書き .TextFileColumnDataTypes = Array(xlTextFormat, xlTextFormat, xlTextFormat) '各列を文字列に指定 .Refresh 'シートに読み込んで表示 .Delete 'クエリを切断 End With End With End Sub
LongLong型に定数値として4,294,967,296を与えておきたいのですがLongの範囲を超えているせいか、必ず後ろに#が付いてしまいます 用途としては強引にunsigned Long的に使う為のオフセットなのですが#を付けない方法はありますか?
前スレの最後でセルに色をつけるコードを作って頂いた者です。職場で試してみましたが思い描いた通りに動いてくれました!これを機に自分で作れるように勉強したいと思います。作って下さった方、本当にありがとうございました…!
スレチなのは分かってるけど詳しい人がここにしかいなさそうだから、もし知っていたら教えてほしい ブックに保存されたクエリをOLAP等で使い回すためにODCファイルとしてエクスポートしたいんだが、「既存の接続」コマンドからクエリのプロパティを開いても「接続のエクスポート」のボタンが無効になっていてうまくエクスポート出来ない どうしたらうまくエクスポートできるのか知りたい
すみません。 エラーが分からず・・・教えてください。 下記コードで、”型が一致しません”というエラーが出ています。 Dim Ringi1 As Worksheet ThisWorkbook.Activate Set Ringi1 = Workbooks(Range("B6")).Worksheet("Sheet1") ←エラー ThisworkbookのB6には”テストファイル.xlsx”が入っています。 よろしくお願いします。
>>17 Worksheet(Range("B6"))じゃなくてWorksheets(Range("B6").Value)でしょう
あとRange("B6")はどのシートのB6セルなのかな?
この書き方だとThisWorkbookがActivateされたときにアクティブになってるシートのB6セルが参照されてしまうので、ちゃんとシートを指定して書いたらどうかな
例えばThisWorkbookの一番目のシートのB6セルにファイル名が書かれている前提ならこうなる
Dim Ringi1 As Worksheet
ThisWorkbook.Activate
Set Ringi1 = Application.Workbooks(ThisWorkbook.Worksheets(1).Range("B6").Value).Worksheets("Sheet1")
ブックAのシート1〜iまでのA1セルの数字を合計した数字をブックBのA1セルに転記したいのですが、どう書けばいいでしょうか?
VBAのエディタに未だに慣れない・・・visual studioみたいな至れり尽くせりな開発環境があればなぁ
>>24 アドオン入れるなり作るなりするとマシになる
>>18 コードをヒントにして、成功しました!
ありがとうございました。
めっちゃお優しいですね!!
>>23 初めてなので許してください
そして教えてください
>>28 ならマルチポスト放置してないで一つに絞ろう
すみません。 考えてもわからないので教えてください。 Dim Wb2 As Workbook Set Wb2 = Workbooks(Range("B7").Value) エラーメッセージ:インデックスが有効範囲にありません。 B7セルには<テストファイル.xlsx>が入っているとします。 Workbookにワークブック名を入れようとしているのですが、 なぜエラーなのでしょうか・・・?
SetするWorkbooksは、ファイルが開いていないといけなかったんですね。 自己解決しました。 失礼しました。
>>39 dドライブ直下にあるとして
Set Wb2 = Workbooks.open ("d:¥" & Range("B7").Value)
なら自動的にファイルを開いてオブジェクト扱いになる
>>40 そんな書き方もあるんですね!
勉強になります。
(私のコードは無駄が多そう・・・。)
VBAからIEを操作してhtmlで書かれたデータを取りに行くコードを書いています ターゲットのサイトでは、一度に20件のデータしか表示されず 一番下までスクロールするたびに20件ずつ追加されます(データは全200件です) htmlでは、20件のデータの下に「::after」と書かれており、スクロールが一番下に近づくと 新たな20件がロードされ、その下に「::after」が現れます 質問ですが、一度に200件全てのデータを取るためにはIEでスクロールさせる必要があるように思いますが その場合、SendKeysを使って、SendKeys "{PGDN}" のようにするしかないのでしょうか? それとも他に、何か良い方法があるようでしたらアドバイスをいただきたくお願い申し上げます
querytables.addでCSVファイルをエクセルシートに貼り付けたとき、グループ化で非表示にされている部分に正しく貼り付けられるのはいいのですが、グループ化非表示から表示状態にされてしまいます。 非表示部分に貼り付けつつ、非表示のままにするにはどうしたらいいでしょうか? 貼り付け先シートの元々の表示・非表示状態はそのままにしたいんですがよい方法はありますか?
>>45 ページの作りによる。
例えばあなたは20件ずつなどと言っているけど、URLの入力など次第で200件全部表示できるかもしれない。
スクロールが必要かも分からないがSendkeysなんて使うのは子供と考えて良い。
>>47 >>49
レスありがとうございます。
私もSendKeysは使いたくなかったので質問した次第です
> ページの作りによる。
ターゲットサイトは、dアニメのランキングのページです。
https://anime.dmkt-sp.jp/animestore/CR/CR00000013_001 ここからランキングのデータを抜き出して来ようと思ってますが、20件ずつしか表示されず…
何かいい方法はないでしょうかねぇ
うちの会社に、元SEでVBAバリバリ書ける、という人が 入ってきたんですが、色々Excel作業の自動化をお願いするために 現行の作業手順をお見せしたら、「ここの、Excel関数を使っているところは 意味が分からないので、関数の使い方から説明してください。」といわれ、 VLOOKUPとは、からお話ししないといけないそうで、もう自分でVBA 書こうかと思ってしまいます。 はじめはこういうもので、すぐ慣れてくれるんでしょうか? 「SEの資格」を持っている、という触れ込みの、部長の知り合いなので扱いは 要注意なのです。はぁ。
経歴詐称があった場合、解雇はできるのか 結論から言うと、解雇できる場合もあればできない場合もあります。 一口に経歴詐称といっても、軽微なものから重大なものまであり、全てのケースで解雇が可能とすることは合理的ではないからです。 解雇ができるケースは、「重要な経歴」を詐称されたときに限られます(重要な経歴とは何を指すのかは下記で説明します)。 職歴に関する経歴詐称 職歴を詐称していた場合は、採用後の仕事の内容、賃金に直接影響を及ぼすもののため、重要な経歴を詐称していると判断される可能性が高いと言えます。 判例では、グラバス事件(東京地判平成16年12月17日 労判889号52頁)があり、プログラミング能力がなかったにも関わらず、あたかもスキルがあるかのように経歴書に記載。 採用面接でもそのように説明して、ソフトウェア会社に採用されたが、経歴詐称を理由とする懲戒解雇が認められたという事例があります。
そもそも触れ込みから嘘だったのかまで疑ったらキリがないから、そこんとこは何とも言えないけど、 元SEが本当なら、少なくともVB(VBAじゃなく)は書けるけど、普通のオフィスワークはあんましてこなかった、とかじゃないの? そんな感じのSEさんと一緒に仕事したことはある。ちょっと教えてあげたらあっという間に習得したけど。 でもやっぱ利用頻度の低い関数(LOOKUP系)や若干特殊な使い方(SUMPRODUCTを複数条件の判定や抽出に使うとか)には苦慮してた。
>>52 バリバリ書けるSEならExcelの基本的な関数ぐらい自分で調べられるものだがそれすらできないのはバリバリ具合すら怪しい予感
>>52 バリバリのエンジニアがVBA使う仕事に応募なんてしません
>>52 そもそも謎の「SEの資格」とか言ってるお前も似たようなもんだろ…
知らないことを知らないと言えるやつはまだ大丈夫だわ ホントにやばいやつってのはな・・・
もちろんできますよ大丈夫です(やべっ何もわからん どうしよー)
>>50 スクロールしないで取得したかったんだが解析面倒で断念。
スクロールはSendkeysではなく、HTMLWindow2のscrollToなどを使う。
https://pastebin.com/V7S3XW71 VBAって必要になったら都度気合いで調べながら書いて、しばらく書かない間に忘れてまた必要になったらまた調べて覚え直すってことを繰り返してる気がする
>>52 VBA使いでExcel関数を使わない人もいるからな。
俺はどっちも使うけど両方同時に使うのは避けることが多い。
>>59 簡単にそんなこと言うと、その時点でバレるぞ。
普通は分かってたら詳細や、かつてその技術でハマッた体験談を語るもんだ。
>>60 > スクロールしないで取得したかったんだが解析面倒で断念。
>
https://pastebin.com/V7S3XW71 おお、わざわざここまで!
大変お手数をおかけすることとなってしまい、申し訳ないやら嬉しいやら…ありがとうございます!!
> スクロールはSendkeysではなく、HTMLWindow2のscrollToなどを使う。
最近、ネットのブログなどを参考に
見よう見まねでExcelのVBAとIE操作を両方一緒に始めたのですが…
ループで200項目取り出すまでの条件の書き方、スクロールの書き方、すごく参考になります!
ランキングデータの取り出し方…、ここまでシンプルに書けるものなんですね!!
恥ずかしながら、まだオブジェクトとかコレクションとかアイテムとかがごっちゃになってて頭で整理できておらず
文法エラー(?)の嵐に悩まされつつコードを書いてる段階で…"ChildNodes"とかもまだ使ったことないです…
本当に感謝です。
凄く基本的な質問だと思うのですが、 Range("A1".Offset(0,12)).Activate はだめで、 Range("A1").Offset(0,12).Activate が正しいのはなんでなのでしょうか?
>>68 VBAでそのへんを正しく理解するのはまず不可能だしその必要もないから、定型句だと思って暗記しなさい
ちゃんと理解したかったらJavaのようなきちんとしたオブジェクト指向言語を学ぶことをお勧めする
>>68 一番目の式の方は、"A1".Offset(0, 12)という表現がVBAの構文上無効で何も値を返さない式になっている
なので、参照先のセル範囲の名前をバリアント型の引数として要求しているRangeプロパティ式の評価に失敗してしまい、Rangeオブジェクトの取得にも失敗する
文字列や数値のリテラルに.(任意の値)と続けて何らかのオブジェクトにアクセスしようとしても、そもそもそのようなアクセスルールが定義されていないので当然失敗する
反対にRange("A1").Offset(0,12)の方は構文上無効な表現がなく、RangeオブジェクトのメンバのOffsetプロパティ式を正しく用いているので、Offsetプロパティを介してA1セルから12列分座標移動したセルを取得することができる
VBAのリテラルはメンバを持たないから 他言語だと型変換とかあるんだけど
リテラルがそのままstring型オブジェクトとして使える言語だとメンバアクセスできて楽だよね
VBEは静的に型判定できるリテラルくらいハイライト表示対応してくれと思う
イミディエイトとローカルのウインドウ、上下にドッキングしてしまったのだけど、左右にドッキングするようにはどうすればいいのだろう…
>>80 ドラックすれば良いんじゃない?
位置調整は難しい場合があるけどウィンドウ枠の表示が変わった時に離すとドッキングするから試行錯誤してみれば良い。
>>80 移動させる時に判定のシビアなガイド枠みたいなのが出るから置きたい位置にハマるまで頑張る
VBAの代わりにPython実行環境を取り込む動きがあるらしいね もしそうなったらVBA界隈の閉塞感も変わるかな
まじ? エクセルやってる一般社員様がpython始めたらどうなるんだろ
Pythonエンジン搭載は色んな理由で見送られたはず
Python搭載は見送られて代わりにJavaScriptが搭載されるという記事をどこかで見かけましたが。
どなたか
>>46 わかるかたお願いします。
>>90 >>89 >>未だにこういう馬鹿がいるのか
jsだったらgasと同じような感じになるのかな gasはそもそもスプレッドシート自体の機能が物足りないからイマイチだったんだけど
これからJSエンジンが実装されるならTypeScriptベースで型付け強制になるだろうな
.ClearContents と .Value="" では実行後のセルの状態は異なりますか?
何も載らないよ Excel自体クラウド上で使うようになってきてるから マクロみたい使うならJavaScriptなのかもね
最近はExcel操作のためにVBAを使うのはもうなんか最後の手段って感じがする PowerQuery(M言語)、PowerPivot(DAX)、JavaScript、Python、PowerShellのどれかで書く方が楽だしメンテも簡単
趣味が大がかりになってきて使う材料の管理が煩雑になってきたのでExcelを使って管理しようかなと考えています 工程が1,2,3…とあって、それぞれの工程で使う部材は今のところ重複はなく(今後どうなるかわからない)部材毎に色違いやグレード違い等の派生品があり、 用途としては工程毎に使う部材を別シートにリストアップしたり、規定量を割ったものをピックアップ 部材の管理番号を振るとき 番号は工程や派生に関わらず一列で一意の連番 3列で工程ー工程内の部材を連番ー派生を枝番 工程に関わらず部材毎に連番ー派生品を枝番 マクロを組むときこれらのうちどうするのがよい構造になるでしょうか?
確かにvlookup関数もCで作ったほうが処理速度速いですし
>>102 情報取得とかテーブル加工とかならVBAよりQueryTable)PowerPivotの方がよっぽど速いし型安全にデータ処理できる
数万行以上のデータのリレーション構築とテーブル加工をVBAやWorkshhet関数で実現するとか正気の沙汰じゃないぞ
なんか齢50近くになると新しい言語?を知らない…power query?power pivot? …後で調べてみないと…
>>106 MSが仕様公開して言語レファレンスまで作ってる
開発&実行環境はExcelのPowerQueryに付いてるので特に余分なものは要らない
>>99 一番目の方法でまず一意のIDを持つ部材のマスタを作った方が良い
その上で、派生関係や使用工程は列を分けて部材マスタの属性値として管理する
そうすれば各使用工程で使う部材を抽出するビューが漏れなく簡単に作れるし、部材データの追加も容易
何故他のやり方が良くないかというと、使用工程や派生関係を管理番号で構造的に表そうとしても、一対一の親子関係から外れる複合的な派生関係の表現が難しいし、複数の工程にまたがって使用する部材が登場した場合の付番がとても困難だから
>>110 データ活用のシナリオの説明もある程度書いてくれてるし、3パターンの中からオススメを選んで教えてくれと言われてるんだから根拠を示しながら回答するのはOKだろ
> 馬鹿と言いたいだけの馬鹿
>>112 の悪口はやめなよ
今、困っていることがあり教えてください。 Excelをオープンした時に、入力規則のリストが設定されているセルに VBAでリストにある文字列を張り付けるとリストが解除されてしまい困っています。 ただ、Excelを既にオープンしている状態であれば、VBAで文字列を張り付けてもリストは解除されません。 Excelをオープンした際の文字列貼り付けでもリストを解除しない方法、何かないでしょうか。
>>114 試してないから自信はないけど配列に文字列の値を格納してからコピー先セルに一括代入してみたらどうかね
計算方法の自動手動を切り替えるとか doeventsを挟むとか 入力規則を消去して再度設定してみるとか
>>115 適当な配列を用意して、1要素に代入したい文字列を格納した後、該当セルにコピーしたが駄目でした。
もしかして、一括代入の意味の捉え方誤っていますでしょうか?
>>116 計算方法を手動にしてもdoevent挟んでも駄目でした。
入力規則の再設定は大丈夫でしたが、再設定しか駄目なんですかね。
再設定で目的が果たせるならそれでいいんじゃないの 気に入らないかもしれないけど
>>118 目的は達成できるのですが、どうしてそんなことが
起きているのか気持ち悪さが残ってしまって・・・
ひとまずリスト再設定で回避してみようと思います。
皆さん、ありがとうございました。
ウォッチ式で入力規則が無効になった瞬間を捕まえたらどのステップで問題が起きてるか分かるよ あとApplication.EnableEvents=False の状態で入力規則が無効化する症状が同じように出るかどうかを確かめると良いかも 副作用あるから気を付けた方がいいけどね
Worksheetの表示を縮小したときに名前をつけた範囲名が青文字で表示されますが あれを縮小表示なしに表示するメソッドとかないですかね? なければ諦めて作ろうと思って、、
以前の勤務表の作成についての質問をしたものです。 指定範囲に対して条件を参照して自動で勤務を組むにはどのようなコードが使えますか。
そこまでくると質問というより代わりに作ってって感じな気がする
任意のフォルダを開きたいくて、そのファイルのパスが A1に書いてあるときにどんなコード書いたらできますか?だれか教えてください。お願いします🥺
え?w
>>124 見たいな糞簡単なの作って15万???
うそやろwwwww
>>128 フォルダのフルパスがA1セルに入っているなら、
Shell Range("A1").Value, vbNormalFocus
と書けばとりあえずフォルダを開くことはできる
開いたフォルダの中のファイルを選んで何らかの操作をしたいならファイルそのものを掴む別の工夫が必要
.Findで検索するマクロ作ってるけど死にそう 全シート検索で結合セル気にしないでいい方法ないですか 一致したの全部もれなくとるだけなのに なんでこんな大変なんですか
初回検索と次項目の検索が別メソッド 検索したあとに問答無用で一周して戻ってくる謎仕様 結合セル最初に見つけたら2週目で見つけられなくて死亡 最初から検索しようとしたら最初の次のセルから開始という超絶理不尽仕様 最終セル開始点にしようとしたら最終セルが結合セルで死亡
あるシートから10000行程クリップボードにコピーして別シートに行挿入する事を10回程度繰り返すマクロがメモリ不足で停止してしまいます。 エクセルは32bitですがメモリ使用量は2.5GB程度、使用率は80%程度なので余裕はあります。 コピー&挿入だけでこんなにメモリ食うのは想定外だったのですが何か良い対策ありませんか? クリップボードを使ってる理由は書式もコピーしたいからです。
>>137 結合セルがない場合で、書式が行列で統一的に構造化されている(=手動でランダムに設定された書式がない)場合の話だけど、セルの値のコピーはクエリテーブルを使い、セル書式はスタイルとして登録しておいて値をコピーしたあとにテーブル単位で適用するようにする
それができないなら常套手段的な対策として、描画停止、セルの自動計算の無効化、一度のコピー行数の抑制、コピーする情報の量の削減(列を減らす、セルに入れる値の文字列長に上限をつける等)をやるしかない
>>135 検索対象のセル範囲でループを回して、MergeAreaプロパティから取得できる結合範囲の第一セルの値に対してInStr関数でチェックをかけるほうが簡単に実装できる
一度触った第一セルをDictionaryに突っ込んでおけば重複回避の処理も簡単に書けるし
>>137 想定して最初から設計しなおした方がいいんじゃね
>>137 一度に全部やらず少しずつやるとか、挿入やめて別シートに貼り付けていくとか
100才。 きんは100才100才。ぎんも100才100才。 もう死んじゃいましたけど。
100才くらいなら健康でも1年後にもまだ生きてる生存率は50%くらいだよな。 そろそろ死神のお迎えがくるかな。
直せるものもろくに直さず 超絶くそのまま世界で最も使われる言語の一つになってしまったVBAに いろいろ思うところがある 俺らがああしろこうしろと習ってることってどこまで本当なのか
人の言うことなんか信用するな 学校で教えることなんて、諸説あるうちの一つを紹介してるだけ 自分で直接見聞きしたことが真実に一番近い
>>138 >>141-142 細かくコピペするよう変えたのですが、今度はメモリを3.5GBくらい使い始めました。
さすがにおかしいので調べた結果、コピー元のシートの1つがバグってたようです。
現在はメモリ使用量が250MB程度に収まりました。
ありがとうございました。
質問させてください。 シート上に簡単なHTMLを表示させたいのですが、そのようなコントロールはありますでしょうか? 必要なタグは、br font(color属性のみ) bold div(改行の代わり)くらいです。 目的としては、WEBデータベースに登録されているリッチテキストフィールドをダウンロードして表示することになります。 危ないタグはWEBサービス側で排除されていると思います。
>>152 Microsoft Web Browserコントロールというのがあります
ただしHTMLの設定や変更にはVBAが必要です
>>152 簡単なHTMLと簡単でないHTMLの違いがわからん
MSはC#とかTSとか素性のよい言語開発してるのにどうしてマクロは頑なにVBAのみなのか…
企業ユーザーは既存資産が動く事が大事 新しい事は求めていない
>>157 それならそれでいいんだけどMarshall.ComReleaseが面倒すぎる
""とclearcontentsって別物だったんだな。 一部書籍で扱いが同じだったが新刊書で違いが明らかになった。
>>161 何を入れてクリアしてるかを聞いてるのでは
ClearContentsでクリアするとValueプロパティの中身が型未定義のEmpty値になるってことか?
>>161 この2つで異なる結果を返す関数、演算は何ですか?
並べ替え、重複削除、ピボットテーブル、COUNTA関数
違うかなぁ? typenameは、どちらもEmptyだし。並び替えにも影響しないみたいだけど、、
""のTypeNameはvbStringじゃないの?
特定フォルダの中のファイル名を取得したくて、A1にファイルパスが書いてあってあったとき Dim fname As String fname = "DirSample.xlsx" の"DirSample.xlsx"の部分をA1のパスにしたいのですが、どうやった良いですか?
fname = range("a1").value & "¥DirSample.xlsx"
>>164 =type(a1)
書式を文字列にしてからやってみ
>>5 このQueryTablesなんですけど、セル内改行を含むCSVを読み込むにはどうしたらいいですかね?
改行コードをいじってみたりしたけど駄目でした
>>171 CSVで「セル内改行」?
意味が分からん
>>172 Excel セル内改行 csv
でググっておいで
>>171 Excelのセル内改行コードとテキストファイルの改行コードは違う
>>171 CSVのパーサーを自分で書けばいいです
>>171 QueryTableをコード内でAddするんじゃなくて、予めPowerQueryでセル内改行の処理を埋め込んだ接続を作っておいて、コード実行時にデータの読み込みとテーブル出力だけすればいいんじゃないの
>>174 セル内改行をLFにしたり色々試したんですけど駄目でした
結局一時ファイルを作って開いてからコピペという泥臭い処理に…
>>176 PowerQueryですか
調べてみます
VBAある表のデータで行と列が一致する列の値を返すコードを書きたいのですがどうしたらいいでしょうか? 行だけならVLOOKUPで行けると思うのですが列になるとどうしてラいいのかわかりません。 該当するセルの値を返したいです。
rangeをfor eachで巡回すればいいんじゃないの
>>179 行と列が一致するってどういうこと?
行インデックスと列インデックスが一緒ってこと?
それとも、行と列を特定するための条件が個別にあって、それらの条件を満たすってこと?
>>177 コピペするならファイル作らなくてもクリップボードに送ってテキスト取り出し貼ればセル内改行も反映される
>>179 何がしたいのか知らないけどVLOOKUPの横版ならHLOOKUP
>>181 後者です。
シートに参照する表がありユーザーフォームで作った入力表がコンボボックスとなり
一つ目のコンボボックスが行とリンクしていて、二つめのコンボボックスが列と連動して言いて
行と列の一致した値をテキストボックスに表示させたい。
一つだけならVLOOOKUPでできるのですが表となると私の力だと全く思い浮かびません。
力といってもちょっと基本がわかって参考書とインターネットの中から使えそうなコード
を引っ張ってきて使えるように修正するくらいで一から工程を考え出す事は難しいです。
ワークシートのchangeプロシージャで A1:F5 A6:E6 A7:I105 に変更が加わったとき Range("F6") = Date をさせたいのだけど If Intersect(Target, Union(Range("A1:F5"), Range("A6:E6"), Range("A7:I105"))) Is Nothing Then ではうまくいきません。どなたか教えてください。 あと、セルに文字を入力するとき、対象となるセルを選択し、文字を入力したら、別のセルに入力途中の文字が表示され、Enterをおしたら対象となるセルに反映されました。 これもどうしたら普通通りになりますか?
>>183 しいて言うならVLOOKUPとHLOOKUPの合わせる感じ?
>>185 うまくいきませんとは?
一部だけ反応?反応の範囲が逆?
>>186 関数でできないからVBAでやろうとしてるだけなら関数でできる
表がA1:D5だった場合、
=VLOOKUP(列の条件,A1:D5,MATCH(行の条件,A1:D1))
Ruby では、2次元配列[ 行 ][ 列 ]で、そのセルを指せる。 ただし、行列のインデックスは、0 から始まる require 'csv' str = <<"EOT" 1,a,x 2,b,y EOT p table = CSV.parse( str ) #=> [["1", "a", "x"], ["2", "b", "y"]] p table[ 1 ][ 2 ] #=> "y"
>>184 重複無しなら、コンボボックスの値が行、列の並びと
同じになるように設定して
listindexを取得
offsetで値を取るとか
見出し行の値をkeyにしてrowを取り出すdictionaryを作る 列も同じ様に配列を作る で、コンボボックスで選択した値で配列から行列番号を取り出す
>>177 まず考えるべきはバイナリエディタで該当ファイルを開いて、どういう構造になってるのかを確認することだよ。
>186 change自体が動きません >193 マジッスカ!どこに入れたらいいですか?
〉〉184です。教えてもらった通りVLOOKUPとマッチ関数で作ってみたのですが うまく言いません。通常のエクセルの状態ではやりたいように動作したのですができればVBAで動作できるようにしたいです、 Sub 行と列() Dim tateya As String Dim gouki As String Dim gouki2 As String Dim siriaru As String Dim test As Worksheet Set test = Worksheets("テスト") tateya = test.Range("a1") gouki = test.Range("a2") haihhun = "-" gouki2 = tateya & haihhun & gouki '号機 Dim siri As Worksheet Set siri = Worksheets("シリアル管理") Dim hanni_seru As Variant '範囲指定はバリアント型を使用する事 hanni_seru = siri.Range("D1:L39") 'VLOOKUP(列の条件,A1:D5,MATCH(行の条件,A1:D1)) siriaru = WorksheetFunction.VLookup(gouki2, hanni_seru, WorksheetFunction.Match("H1", "D1:L1")) MsgBox siriaru End Sub
>>196 たぶんMatchの行条件がおかしいけど、どんな問題が起きてるのか分からないから何とも言えない
それから、haihhunとかsiriaruとかhanni_seruとか変数の名前がちょっと酷い
HyphenとかSerialとかとかCellとか英語をきちんと使う意識を持つのが上達の近道だと思う
別モジュールに書いたprivate subをcallする方法ってありませんか? publicにするしか無いでしょうか
〉〉196です。 変数名もそんなルールが? なんとなく日本語はよくないなーと思って自分で分かるローマ字で表記しようと思ったんですが、後ダメな理由がマッチ関数にワークシート指定してないからかと推察。後で試します。
無理に英語やローマ字にするくらいなら日本語でいいと思うけど あとrangeだけじゃなくてcellsも覚えれば目的達成するんじゃないか cellsのrowとcolumnで行と列を取得出来るからね
>>199 ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
Publicにするのが嫌なら、呼び出したいPrivate Subが定義されたモジュールにコールバック用の引数付きでPublic Subを定義して、呼び出したい任意のPrivate Subを引数で指定して呼び出せるようにする
それも嫌ならクラスを作ってPrivate Subをメソッド化する
どちらもコーディングや保守の工数は大して変わらない
>>202 >ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
まさにこれです!privateにしなくても出来たんですね、勉強になりました。ありがとうございました
他の方法も勉強になりました
>>200 決まった名前ルールは無い
人それぞれに拘りがあるだけ
たぶんみんなに共通する拘りは分かり易さ
他人が見て混乱しないか、半年後に自分が見てすぐに理解できるか
>>200 ありがとうございます。
コメントつけまくって分かるようにしてます。
まぁ詳しい人が見たらめっちゃくちゃで分かりにくいと思うのですが、
自分用で自分が分かればいいので動くようにして少しづつ改良していきます。
多分、めっちゃ不具合あります。
データベースから原本のシートに転記する場合表内でのループは可能ですか? 但し、実際に転記する表の上下に題名や表題があります。 例えば1行から20行での表があり繰り返すデータが21行目なったら2ページめの1行目 にするという事は可能でしょうか? 出来なさそうなのでリストボックスで見やすく作ろうかと思ったのですが、印刷用でも 作成したいのでできるのであればご教授お願いします。 上だけなら、forの頭を指定して10番目ならfor i = 10TO 最終行 で行けると思うのですが表の最後の指定がわかりません。 forをネストすればできそうですが、それでも20番目でおわる形にする感じ? 21行目を2ページ目の1行目を指定するのは難しそう
>>206 21行目になったら次の改ページ位置を貼り付け先にする
または上下の題名をヘッダフッタに指定して改ページを気にせず貼り付ける
たまにpowershellの話題出るから聞きたいんだけどpowershellってUWSC見たいなことできるの?
特化してるUWSCみたいに簡単ではないけど がんばればできる
頑張れば何でもできるだろうな。 VBSではWindowsAPIが使えない! → 裏でこっそりエクセル起動すれば使えるじゃん。 VBAではjavascriptが使えない! → ExecuteThisJavaScript使えば出来るじゃん。 殆ど屁理屈だけど。
ジョジョ、逆に考えるんだ、『vbaの下に便利APIのExcelやAccessが付いているのさ』と考えるんだ
>>211 >>212 >>213 出来るぜ。
−応ここVBAのスレだから言うけどVBAでも全部できる。
今流行りのRPAがやってることは全部出来る。
ただ、VBSでWindowsAPIは苦肉の策というか、敬遠したい気持ちもある。 まっ、VBSが最適な話なら結局使うけどね。 VBAでJavaScriptも同様だね。 こっちの方が敬遠したい。 まずはVBAだけで何とかならないかを考える。
>>216 まじかー
vbaでやれるっていうことはwinapiを使うって事だよね?
スクリーン上の指定座標の色の識別とかもできたりするの?
特定のアプリのウィンドウに対してキー入力するとかVBAでやってるよ
Cells(1,"A")と書かず、判りにくいCells(1,1)と書くのはなぜ? ネットの記述とか見ててもCells(1,"A")と書いてるの見たこと無い
forでまわせんだろうが 個人的にrangeをなぜ使うかの方がわからん
ああ、cellsで表現できるのをrangeで表現するのが解らんってことね
Range("B2:E6").Interior.Color = 65535 こんな場合は使うかな 見た目というかデータに影響を与えない部分はrangeの方が読みやすい、気がする
Cells(1, "a")と書くならRangeを使えばいい
繰り返すときCells(i, 1)よりCells(i, "A")の方が判りやすいと思うけど
むしろexcel側でR1C1形式がデフォルトになれば良いのに
列は作りながら足したり順番変えたりする事が多いので最初からenum作って管理する cells(i, cols.hoge)みたいにしてる
>>232 三四郎に対抗するためにこうなった
結果、シェアを勝ち取ったけど負の遺産として残ってしまったね
経験則から言うと、エクセルのシートを入力フォームや書類のフォーマットのように捉えてる人はRangeを使いがちで、配列やテーブルとして扱えるオブジェクトの塊だと捉えてる人はCellsを使う傾向がある
あるリストをユーザーフォームで絞り込んでそのユーザーフォームのリストボックスに リスト内容を表示させたいのですがオートフィルタの表示はうまくいくってるのですがリストの表示 先がうまく表示されません。どうしたらいいでしょうか? 以下がコードです private Sub kensaku_bo_Click() 'オートフィルタによる検索 Dim ws_kiki As Worksheet Set ws_kiki = Worksheets("機器履歴") Dim tateya As String '建屋番号 Dim gouki As String '号機番号 Dim gouki2 As String '建屋と号機の合計のセル Dim haihhun As String Dim myData As Variant tateya = ken1.Value gouki = ken2.Value haihhun = "-" gouki2 = tateya & haihhun & gouki '号機 ws_kiki.Range("A1").AutoFilter 3, gouki2 Dim lastRow As Long With ws_kiki lastRow = .Cells(Rows.Count, 1).End(xlUp).Row myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 12).End(xlUp)).Value End With With list_ken .ColumnCount = 12 .ColumnWidths = "50;80;50;50;50;50;50;50;50;50;50;50" .List = myData End With End Sub
変数で回す時はCells セル位置が固定の時、範囲指定する時はRange 1行ごとにコード入力が楽な方を選んでる
>>237 myData(Range型)にはフィルター設定情報は入ってない
一行一行をRow.Hidden判定しながら範囲内ループさせて取り込むしかないね
間違えたmyDataは配列か それでもフィルター情報は乗らないね リストボックスの.RowSourceに範囲アドレス入れて連動させる方法あるけど これフィルターも連動したっけ?
セルC5:C17に数値が入ってます(A) セルF5:F21に数値が入ってます (B) セルY5:Y25に数値が入ってます (C) AとBの数値のうちCにない数値をセルO5から順番に下に抜き出したいんです cを配列で格納するまでは出来たのですがそれ以降がわかりません よろしくお願いします 初心者です
>>242 すみません
その配列の検索が上手くいかなくて…
for i = 0 to ubound(配列) if 配列(i) <> 検索したい値 then どこかに出力 end if next こういう感じでいいんじゃないの
>>244 コレクションっていうのがあるんですね
調べてみます
ありがとうございます
普通のCollectionや配列よりも、Cの値をKeyにしてDictionaryオブジェクトを作る発想の方がいいと思う Dictionary.ExistsメソッドでKeyの存在確認ができるからコードが簡単になる
Dictionaryは平均的なVBAerには理解できないから却下 他人に理解できないもん作るんならVBAを選ぶ意味がない
連想配列の事をdictionaryって呼ぶんだっけか すごい便利だけど、シートあるんだからシート使った方がいいんでない?と思う 二次配列が目に見えて編集し放題とか楽ちんすぎる
休日まで費やして2000行くらいコード書いてるけどそろそろ嫌になってきた
そのうち、休日に働いて会社でのんびりするようになるよ あんまり良くないんだけど、プログラムは家じゃないと集中して掛けないんだよな
>>248 平均的なVBAerってのがどんな層を指してるかちょっと分からないが、Dictionaryが理解できない人ってそもそも配列やCollectionも理解できないんじゃないの?
dictionaryの替わりにシートを使うという発想は無かったな
シートが可視化された配列だってのはその通りなんだけど誰でもGUIで簡単に編集できてしまう点が逆に弱点でもある 値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし
>>258 まぁねぇ。その辺は考えながらうまく付き合って行きたい所
連想配列ってどういうとき便利なの? いまいち基本書の記述じゃメリットとか使い道とかがイメージできないんだけど
>>260 配列で数字の添え字じゃなくて好きなワードを使いたい時に
あとDictionaryの場合は検索がめちゃくちゃ速いから大量データの検索に
>>241 こういうこと?
Sub 検索()
Const COL_C As Long = 3
Const COL_F As Long = 6
Const COL_O As Long = 15
Dim nSetRow As Long
nSetRow = 5
Dim nRow As Long
For nRow = 5 To 17
If Not IsExistValue(Cells(nRow, COL_C).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_C).Value
nSetRow = nSetRow + 1
End If
Next
For nRow = 5 To 21
If Not IsExistValue(Cells(nRow, COL_F).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_F).Value
nSetRow = nSetRow + 1
End If
Next
End Sub
Function IsExistValue(ByVal pValue As Variant) As Boolean IsExistValue = True Const COL_Y As Long = 25 Dim nRow As Long For nRow = 5 To 25 If Cells(nRow, COL_Y).Value = pValue Then Exit Function End If Next IsExistValue = False End Function
>>260 Keywordが重複できないから必ず一意なデータセットができる。
2シートを連結する際、それぞれの各行をクラスインスタンスに代入&コレクション化してるのですが連結方法に悩んでいます 例 Personクラス(pID, 氏名, 名字プロパティ, 生年月日,...)→Persons.Add Personインスタンス, str(pID) Diaryクラス(dID, pID, 作成日, 本文,...)→Diaries.Add Diaryインスタンス, str(dID) '出力 Dim d as Diary For each d in Diaries if(存在チェック) then xxx = Persons.Item(d.pID).名字 Next d 現在上記のように回してますが、より楽に書けるor固いor保守しやすい...実装があれば教えて頂きたいです 現状はプロパティの予測表示がされないのが微妙に使いにくいのと、そもそもコレクションにおけるkeyの動作をよく分かっていません
>>260 existsが便利
数数えたり、行番号取り出したり、キャッシュの管理に使ったり
for eachで中身を全部取り出そうとしたら投入順が保証されないのが少し残念
VBAでOPENしたファイルを引数で渡す事は出来ますか? こんな感じで処理したいのですが、「#1」って変数では無いのでしょうか Sub foo() Open "TESTFILE" For Output As #1 ' Open file for output. Call write_(#1,"content") Close #1 End Sub Function write_(filenumber, content) Write filenumber, content End Function
>>254 >>255 ホント。
プログラムに対する理解のないバカ上司とか、
コーディングの真っ最中に、平気でコピー取りを要求してきたりするからな。
>>267 ファイル番号は1-255の範囲で常に固定値でやるなら引数で渡さずにどこも#1でいいかと思う
FreeFileって関数があってこれは番号を任意に付番してくれるので
たとえば
Dim nNo as Integer
nNo = FreeFile
Open .... #nNo
って書くこともできる
このnNoを引数に指定してもいいかもね
>>269 行けました!ありがとうございます
ナンバー記号「#」の詳細ってMSDNかどこかにありますか?
Sub foo()
Dim nNo As Integer
nNo = FreeFile
Open "TESTFILE" For Output As nNo ' Open file for output.
Call write_(nNo, "conteaasnt")
Close #1
End Sub
Function write_(nNo, content)
Write #nNo, content
End Function
>>265 Persons、Diariesをコレクションにしている理由は、「Person、Diaryという2つのカスタムクラスの集合オブジェクト」という意味論以外に、何か実装的な理由はあるのかな?
例えば、2つのコレクションクラスに格納するデータの型が一様でないからCollectionじゃないとリスト化できないとか、多態のためにCollectionクラスをインターフェース継承させているとか
そういう事情がないならば、Keyの存在確認手段を持たないCollectionクラスではなく、Keyの存在確認を行うExistsメソッドを持つDictionaryを使うのが実装的には楽だと思う
pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
そもそもRemoveやAddといった基本的な機能はCollectionとDictionaryとで共通しているし、Dictionaryの方が動作も早いしね
>>270 自分は見たことないですね
なんとなくですが自分は常に#をつける派です
それとcloseも#nNoかと
言語リファレンスでも#は省略可能となっているだけで、説明はどこにも見当たらない 古いBASICとの互換性で残してあるだけだと思う
>>272-273 あれ、じゃあなんでしょうねこれ
コンソールで
?#1
ではエラーになるので、ただの数値ではなくなるみたい
#1=2
も出来ない。なんとなくリテラルか参照っぽいですが、何でしょうね
openなどの時にしか使えないのでしょうか
>>271 ありがとうございます
コレクションを選択した理由は特にありません
(あえて挙げるなら、コレクションにまとめるリファレンスが最初に目に付いた です)
>pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
言葉足らずですみません。Diaryクラス側ではpIDが重複しdIDが主キーとなるので、一意に取得できません。(この認識も間違っていたらすみません...)
エラー処理がExistsで済むのは明確なメリットですね。Collectionでは、調べた限りではOnErrorGoToで飛ばす方法しか見つけられませんでした
ひとまず、Diary側のループで取得したpIDでPersonDictionaryにExistsをかける 方法を試してみようと思います。
>>274 > openなどの時にしか使えないのでしょうか
そう言うことだろ
>>275 複数のDiaryインスタンスが共通のpIDを持つならば、連結を二重化したらいいんじゃないだろうか
まずpIDをキーとするDiary用のDictionaryをまず作っておいて、
同じpIDを持つDiaryインスタンスをまとめたDictionaryかCollectionをItemとして持たせる形にすればいいと思う
構造的に表すと
(Key[i] = pID, Item[i] = (Key[j] = dID, Item[j] = Diary))
みたいな感じ
VBAで表からその左の行を検索したいのですがどうしたらいいでしょうか? Dim rng As Range Set rng = ws_siriaru.Range("D:L").Find(ken4, LookAt:=xlWhole) If rng Is Nothing Then rng MsgBox ""ない Exit Sub End If siriaru = Range("C" & rng.Row).Value gouki = siriaru label_siri = gouki では表示はされるのですがうまくいきませんでした。
>>278 重ねてありがとうございます。
なるほど。Dictionaryの各要素を、そのkeyに対応するインスタンスの集合とするんですね
1key対1レコード という考えしか無かったので目から鱗です
>>279 説明する時「うまくいく」とか「うまくいかない」という単語は使ってはいけない
>>279 どういった表示がされて、実際に欲しい情報とどこが違うでしょうか?
Range("D:L")をken4で完全一致検索をかけ、最初に見つかったセルの行番号を取得
その行のC列セルの値をsiriaruに代入
という点ではプログラムに間違いはありません
>>280 その通り
そのようにすれば、Diaryのインスタンス集合全体に対してpIDの存在確認をすることも出来るし、pID, dIDという2つのプロパティ値を使って目的のDiaryオブジェクトを取り出すこともできる
>>279 siriaru=ws_siriaru.Range("C" & rng.Row).Value
>>279 siriaruに値を代入するときに参照しているシートがシリアルのシートじゃなくて別シートになってると思う
siriaru = ws_siriaru.Range("C" & rng.Row).Value
に変えたらうまくいくのでは
>>270 close もopenと同じ番号のnNo によ
>>236 最初からVariantに入れるのが正解では?
>>287 Variant型は便利だけどRangeオブジェクトを突っ込むためだけの変数で使用するにはねぇ
実際のデータ型を明示しないぶんコードが読みにくくなるしコーティング時にインテリセンスも利かなかったりとデメリットの方が目立つ
実行時エラーの原因って感じ
リストの表示について 以下の表示の際最終行後ろのセルが空白だった場合最終行が表示されません。 なぜでしょうか? LastRowではA列の最終行を指定しているので間違いではないと思うのですが 最終行のみ全てのセルに数値を入れていないと最終行に反映されないみたいです;。 With ws_kiki LastRow = .Cells(Rows.Count, 1).End(xlUp).Row myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Value End With With list_ken .ColumnCount = 13 .ColumnWidths = "20;60;50;50;50;70;70;50;50;50;50;50" .List = myData
>>289 M列で値が入ってる一番下のセルまでが範囲のようだが
>>289 あなたsiriaruの人でしょ
もういい加減お金払って誰かに教えてもらうか、MSDNのVBAのリファレンスを読み込んできちんと勉強すべきだとおもうよ
会社で使ってるマクロのコードベタ貼りしてるのも本当に宜しくない
今回の問題は、せっかくLastRowにA列の使用セルの最終行の行インデックスを格納しているのに、myDataに入れる値のセル範囲指定でそのLastRowの値を使っていないことが原因でしょ
自分の頭をちゃんと使って書いてる?
myData = .Range(.Cells(1, 1), .Cells(LastRow, 13)).Value
と書き直せば終わり
この人の問題は質問内容よりも質問文が意味不明なこと 状況を全く何も知らない相手に説明するということを考えながら質問文を書くようにしよう
こういう構造的思考力のない人がコピペ&コピペで作り上げた野良マクロが企業の負債になっていくんだよね
ワークシートのスクリーンショットとか図で説明してもらわないと訳がわからない
.Net系もやってる人に質問です 列挙体に属性付けて指定すると数値の他に定義した文字列返す方法があると思うんですけど アレをVBAで行う方法は有りますか? Constで定義すれば出来ないことは無いんですがなんかダサくて・・・
>>295 構造体配列とかクラスとかで擬似的に再現するしかないんじゃないの
>>295 どうでもいいだろ
VBAなんか使ってること自体が恥辱なのに何を今更
>>295 簡単には無理でしょ
.NETも取得するのはそれなりに面倒だし
>>296 そのためにクラスを作るとVBAの場合はひとクラス1モジュールファイルを切らないといけないし、
フォルダ分けも出来ないので、クラスを作る方法は後々クラスファイルが煩雑になる可能性があるのでやめておきます。
構造体や配列を使うのは少し大掛かりな気もしますが、お陰で何となくイメージがわきました。
DictionaryとかCollectionとかのValueペアのオブジェクトを使って、key側にenumで使用している番号、
Value側に文字列を設定して、enumに紐付けてやるような感じでやろうかなと。
ただ、修正が入るときに手間が掛かるようだとあまり意味がないのでその辺の構成は気をつけて作るような
感じですかね。ありがとうございました。
>>297 どんな言語だろうと自分なりに構成を考えて作っていくのは大事だと思いますよ。
今回の件は無理して作る程のものではありませんが
きちんと部品化しておけばまた違った局面で使うことが出来るので、
自分のためにも、引き継ぐ人のためにも大事だと思います。それはどの言語でも同じでしょう。
引き継ぎを考えるなら郷に入れば郷に従えで普通にプレーンに書いた方がいい VBAに限ったことではないけど、変なオナニーされるのが一番迷惑なんだよ
>>295 それは.NetでExcelを動かせばいいんじゃ・・。
>>299 値のペアを返す参照構造を作りたいんだったらワークシートを素直に使ってハッシュテーブルで運用した方がメンテ工数が少ないのでは
ワークシートはGUI化された多次元配列なのでね
セルの値の読み書きでイベントハンドラに制御が渡るのが嫌なら別だが
フィルタされたデータをシート上で複数繋がった状態で選択したとする。その場合にそれら『のみ』を取得することはできるんだろか?教えていただきたいです。 バージョンはexcel2016です。 例) 以下がフィルタされたセル。 A1←選択 A4←選択 A5 上の場合にA1とA4のみを取得する。A2とA3は取得しない。
フィルタ抽出されたセル範囲だけを取得したいなら、 Range("A1:A5").SpecialCells(xlCellTypeVisible).Select の一行で終わると思う Range.SpecialCellsプロパティが可視セルだけを返すよう、引数に列挙定数xlCellTypeVisibleを渡せばいい Range("A1:A5")のフィルタ範囲は必要に応じて変えてね
>>289 です。
わぉ!辛辣ですね。こちらで聞いて大分やりたいことが出来ましたので
後は自分で考えていきます。
参考書を聞きかじってインターネットからまるまるパクったコードをデバックしまくって改造
していきます。
ちなみに今回のコードは
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Value
これが正しいコードでした。
myData = .Range(.Cells(LastRow, 1), .Cells(1, 13).End(xlUp)).Value
最終列の最終行を取得してたのでそこが空白だと最終列が反映されないことが判明しました
>>307 読んでて頭痛のするような酷い文章だな
デバックじゃなくてデバッグだろ
しかも単なるコード改変のことをデバッグとか言ってるしさ
本気でデバッグしなきゃならないときにスキルのないこういうコピペコーダーは何の役にも立たないのに
会社の資産であるコードをこんな掲示板に晒しといて何やってんだか
>>309 会社の資産でもなんでもないけど?
1から自分で休日に作ってるんだけど?会社で使うものでもないんでw
>>311 仕事でもないのにわざわざVBAを使うってただの苦行じゃん
PythonとかJavaScriptとか使えばいいのに
インターネットからまるまるパクることを1から自分で作るとは言わない
vbaの話で別の言語とか出してマウント取りたい人って何なんだろうね 職場の同僚も大変そうw
何か心に刺さったのかな? 他言語持ち出されたときにマウント取られたと思うのは大抵そう受け取る側に問題があるぞ
>>316 一応ここVBAのスレだから
せめてJavascriptやPythonでExcelが扱えるようになってから来なさい
前提もなしに
>>312 みたいなこと書くやつは要らんっていう話だろ
結局なんらかの形で表データを閲覧するならエクセルで閉じた方が楽だなと思う
結局、表入力が簡単で確実なんだよな なんつか心配がいらない 処理はpythonのほうが楽だがエクセル ファイルのみで管理できるってことも含め 総合的にはVBAいいんだよね 雑な意味で データと処理が一つにまとまってるんで オブジャクト思考的ってか
API呼び出せるんだから 大概のことはVBAでどうにか なってしまうんだよな。小さい会社、つまり 会社の9割以上はVBA程度で 十分なんだよな まあVBAがおもちゃで なくてはならないって立場は分からんでもないがw
エクセルの表から始まる作業ならVBAがいいとおもうよ 例えば客からの電話注文をエクセルに一度まとめていて、それを管理画面に反映させる作業とか・・・ スクリプトを動かす必要のないサイトならブラウザ開かずにボタンポチで完了するし (いつもちゃんと登録されてるのか不安がられるが)
俺ならそういうのはGoogle Spreadsheet使うかな 一旦ローカルに置くのは無駄
まぁVBAやって育ってくるとその内 VB.Netとかやるようになって Web系を扱うようになると ASP.Netとかやる機会も出て来るから SQLと同じようにHTMLとかCSSとか JavaScriptとか必要に迫られて 片手間で覚えるようになるから大丈夫。 別に今のままで良ければそのまま VBAやってればいいわけだし。
VBAの最大のデメリットは何でもVBAでやろうとする脳になる事 こんな化石のような言語でやるのは苦行そのもの 今更覚える意味すらない
そんな意味のないもののスレをわざわざ見に来る意味はあるの
>>322 さすがにエクセルで納品ってわけにいかないから
適当にインターフェースつくるが中身はVBAで
十分ってのはあるな
>>327 そんなに言語仕様クソか?
小綺麗にまとまってると思うけどな
純粋さはないが使い勝手は悪くない
時代遅れ感があるのと、どう書くべきかが分かりにくいのと、エラーメッセージがクソなのを除けばそこまででもないな シートモジュールやブックモジュールが邪魔すぎる。標準モジュールだけで良かった そしてエラーメッセージの「修正:式」はあまりに不親切。ここはアップデートかけてくれてもいいのに
>どう書くべきかが分かりにくいのと それは言語の問題じゃない。 英語の文法はわかりにくい → そりゃお前が日本人だからそう思うだけだろ! 日本語の文法はわかりにくい → そりゃお前がアメリカ人だからそう思うだけだろ!
>>333 え?
違うの?
じゃあわかりにくいのは、あんたの能力の問題だね。
俺にはわかりやすいから。
シートモジュールとブックモジュールはただのクラスモジュールだからなぁ コンストラクタとデストラクタがないぶんシートモジュールだけが特殊だが
そう、オブジェクトが何か分かっていれば何の問題もない しかし現実問題、Excelを使うのは一般事務。setっていつ使うのかなかなか理解できない層が中心なのだ
implementsステートメントで組み込みのワークシートオブジェクトのインターフェースを継承すればシート用モジュールになります、って感じの仕組みならよかったよな ユーザー定義クラスだって属性宣言を先頭に持って来ればクラス用モジュールになりますって感じの扱いで良かったし
>>338 VBAを上手く使うというのはつまるところ「可能な限りVBAを使わない」なので教えろと言われても難しいな
業務フローのレベルからVBAが最小限になるように設計するんだよ
PowerQueryとかPowerPivotとか標準的なExcelの組み込み機能で出来る作業をVBAでやってるのを見るけどああいうのも時間の無駄だわな
vbaで何でも出来るから全部vbaでやる・・・それがシンプルでカッコイイ事だと思いこんでいた時期がありました
>>339 >>340 >>341 レスありがとう。万能なExcelに選ばれた言語、それが、VBA!
VBA王に俺はなる!
>>343 そんなこと言わんと
VBAをとっとと卒業してC#辺りに入りなさいな。
他の言語も勉強するとVBAのコードの組み方もガラッと変わるよ。
例えば.Net系をやればクラスやインターフェースの理解がグッと深まるから
テスト項目も減らせる組み方が出来るし、変更点の改修も少ない組み方が出来るようになる。
そういう所まで進みたい人とそうでも無い人がいるって事を理解しなよ
>>345 どちらにせよVBAを極めても意味はないという帰結に違いはないな
本当にプログラミング好きな人はVBAじゃ満足しないだろ VBAを極めるとはどういう状態かわかりませんが
2つ質問させてください Sub Main() Dim n As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws1cell As Range Dim r As Long Set ws1 = Worksheets(1) Set ws2 = Worksheets(Worksheets.Count) n = ws1.Cells(Rows.Count, 5).End(xlUp).Row + 5 For r = 1 To ws2.Cells(Rows.Count, 5).End(xlUp).Row Set ws1cell = ws1.Range("E:E").Find(ws2.Cells(r, 5).Value, lookat:=xlWhole)'項目名が違い、達成率が100%でない場合は開始日・終了日・達成率を更新 If ws1cell Is Nothing And ws2.Cells(r, 10) < 1 Then ws1cell.Range(ws1.Cells(n, 8), ws1.Cells(n, 10)).Value = ws2.Range(ws2.Cells(r, 8), ws2.Cells(r, 10)).Value n = n + 1 Else'達成度が進んだ場合は開始日・終了日・達成度を更新 If ws1cell.Value = ws2.Cells(r, 5).Value And ws1cell.Offset(0, 3) < ws2.Cells(r, 8) Then ws1cell.Offset(0, 3) = ws2.Cells(r, 8) ws1cell.Offset(0, 4) = ws2.Cells(r, 9) ws1cell.Offset(0, 5) = ws2.Cells(r, 10) End If End If Next r End Sub 項目名が違う時にエラーが出てしまいます If ws1cell is nothingの部分で変数を解放しているから問題なのかと考えていましたが、ws1cell = "" , 0に書き換えてもウォッチウィンドウで見ると set ws1cellを通った後もnothingのままになっていました setを通れば変数を定義出来ると思っていたのですが、どのようにすれば解決できますか? よろしくお願いします
改行エラーが出てしまったため2つに分けました VBAを使い始めて1ヶ月弱なのですがC#でエクセルを操作出来るようになりたいと考えております VBAで作ったプログラムを元にして、C#を学ぶ方法は無いでしょうか? 書き方が全然違うとの話を聞いたので、諦めて最初から覚えるしかないかと途方に暮れております よろしくお願いします
なんでvbaでできる事をいちいちC#でやろうとするか意味解らんよ
今後C#を使う予定であれば、VBAで出来る事だとしてもC#を使う時間を増やした方が習得が早いと思ったからです
>>349 一番目のIF文の条件間違えてね?
これだとNothingのときに中で使うことになっちゃうよ
文法が全く違う言語だから何をどう頑張ろうがベースにはできない。 せいぜい同じ結果を出せるかどうかの演習材料にしかならんよ。
>>350 覚えるっていうか移植先の作法に従って書き換えるだけ
>>349 書き直すけど
If ws1cell Is Nothing And ws2.Cells(r, 10) < 1 Then は
ws1cellがNothingのときじゃないと通らない。なのにそのあとでws1cell.Range〜とかws1cell.Offsetなんてやると当然エラーになる。
Not ws1cell Is Nothing みたいに反転させないと。
セルがどういう時にnothingになるのか分かって条件に指定してるのか怪しい気がする
>>350 VBAやって一ヶ月ならそのままVBAやっておけばいいよ。別に急いでるわけでもないんでしょ?
VBAやってツールの幾つかでも作って、コードがそらで書けるようになったらまずVB.Netをやる。
文法はそっくりだけど構成が違うし見たこともない命令も沢山あるから多分苦労すると思う。
でもここさえ乗り越えてしまえばObject指向の何たるかが大体解るようになるからそうしたらC#に入ればいいよ。
C#はVBA→VB.Netのときとは逆に構成がVB.Netとよく似ていて文法が違う。あと型が厳しい。
でも、ま、VB.Netを覚えてしまえばC#も7割方理解したって言えると思う。
何も手を着けてない状態なら最初からC#をやることを勧めるけど
折角VBA始めたんだから遠回りにはなるかも知れないけどそういう楽な方法もあるよ。
それ以前に
>>349 は
> 項目名が違う時にエラーが出てしまいます
じゃなくてどの行でどんなエラーが出てるのかを書けよ
ID:Kd4kiXAf0は超親切だからレスしてくれてるけど普通はスルーされて終わりだよ
>>356 条件が反対だったんですね…
If文の条件をもう一度書き直してみます
丁寧にありがとうございます
>>355 >>358 将来的にはエクセルに集約しすぎて重くなってしまっているデータを、誰でも使えるように軽くしたいと考えている位なので、まずはプログラムに慣れて行きます
プログラムの考え方だけでも次のステップの練習問題には使えると思うので、数をこなしてみます
ありがとうございます
>>359 すみませんでした
次から質問する時は気をつけます
>>349 関係ないけど変数の中に何か入れることを定義とは言わない
定義はDimの行でやっている
>>361 もっと細かく言うとDimでやっているのは定義ではなく、あらかじめ定義されたデータ型の適用を宣言してその型に適合したメモリ領域を確保することなんだけどな
未知の型を宣言するとエンジン側で型検査できずにコンパイルエラーになることを考えたら分かる
>>360 そういう目的があるならまず覚えるべきはSQLだね
VBAだろうがJavaだろうが.Netだろうが
どの言語をやっていてもデータベースを扱う限り
SQLはまず使わないことがない。
ま、中にはEntityFreamworkなんてSQLを使わずにDBに同期してデータを
引っ張るなんて場合もあったりするけどSQLは最初の内に覚えておいて絶対損はしないよ。
>>363 VB系言語はそれだけやってると変な癖がついて他言語への適応が困難になるから、
プログラミングの基礎の基礎だけ習得したらあまり使い込まないですぐに他に移った方がいいよ
>>364 そこは割り切り。
どうせどんな言語やってたってちょろっとしたツールを作るには
VBAでやった方が手っ取り早いことの方が多いんだから。
どの仕事場でも大概Excelは入っているしね。
それにVB系は癖が強いから他言語の習得を阻害するというのも
個人の適応能力やセンスによるものも大きいからちょっと何とも言えないし。
むしろ俺みたいに適応力やセンスが皆無なら
やれ構造化言語だ、object指向だ、関数型言語だって変わるたびにチンプンカンプンなところから始めるから
結局否応なくその言語に合わせることになるんだけどね。
.netを始める上での壁は文法や型なんかより膨大なクラスを把握することだからVBでもC#でも手間は変わらん しかも日々増殖したり仕様が変わったりするから手に負えない
VBAは枯れに枯れた技術って意味で物凄い安定感がある
>>365 さすがに関数型言語はもう無いんじゃね?
一時遊びでlispやってたけどあれは頭の切り替えに難儀した。あれが業務だったら退職しますわ
>>367 ちょい前までExcelに入るんじゃないかって噂で騒がれてたPython、あれ関数型言語だよ
>>368 あれ、まだ関数型言語に分類されるのか
2の頃はそうなんかなl−と思ってたけど、3になるとすっかりオブジェクト指向担ったと思っていたのに
うーん、なんて言うか Microsoftが出してる言語、複数やったことがある人なら何となく知ってると思うんだけど 何か中途半端にとどめておくのが好きみたいな傾向があって、 例えばVBAや旧VB6なんかでもObject指向の概念は 取り入れてるんだけどインターフェースはあるけど .Netでいう継承は出来ないとか .Netでも関数型言語の概念は取り入れててlinqやrambda式が使えるけどデータ分析や機械学習が 出来ないって訳じゃないけど苦手だったり。 次に何か出るときはその変のことが統合されて いい感じになったものが出るんだろうけど 多分次もその次に出て来る新しい概念を 中途半端に取り入れたところで落ち着くような そんなことを繰り返すような気がするね。
>>365 ,
>>368 Pythonが関数型とか適応力やセンスの問題じゃなくて単なるアホやろw
>>371 何となく言いたいことは解るけど
一応パラダイム対応してるからObject指向でも書けるけど
それだけだったら他に洗練された言語いっぱいあるしやっぱり関数型色が強いしね
ここの人たちはどんなシステム作ろうとしてるんだ 事務処理をちょい効率化したい程度の簡単なプログラムならVBAが最高
>>373 そうなんだよね。
よく「別言語の〜でやれば〜行で出来るのに」って
言う人がいるけどあれは違うと思う。
VBAは凄く間口が広い言語で
EXCELが有ればどこでも組める言語。
手軽だから何かをちょろっとやらせるには
非常に使い勝手のいい言語なんだよね。
特にExcelが絡んだときは。
間口が広いってことは初心者からお年寄りまで
誰にでも優しい言語だからそりゃ至らない部分も沢山あるけど
他の言語で簡単に出来る部分でExcelが苦手な部分を
どうやっていい感じに作りこんで行くかを考えるのもまた醍醐味。
例えばXNAとかでテトリス作った後でもう一回
じゃ、今度はVBAで作って見ようかなと思わせる
何かがある言語だと思う。
>>372 どこを見て関数型と言ってるんだ?
パラダイムとか言いたいだけやろw
VBAのいいところはほぼ会社のPCで普通にはいっているExcelでいろんなことができるようになることだろ C#だなんだっていうやつは職場のPCにかってにVSとかいれていいとでも思ってるのかな それをわかってないバカが多すぎ
データの整理とか手作業でやらされてるのを、ちょっと自動化して楽したいだけなのに、なんでC#とか使わなあかんの
>>376 今時のWindowsにはC#コンパイラは標準で入ってますけど?
> それをわかってないバカが多すぎ
自己紹介乙w
ちょっとした処理のためにCOMのOfficeのGUIを起動させ続けなきゃいけないってのがVBAの最大の難点でしよ 単なるデータ整理をする環境として見るとOfficeは高機能すぎるし効率が悪い PowerShellなんてWindows標準でSDKとCUIがインストールされてるしマルチプロセスもOKだからな
Powershellは.NetFramework抜いたらただのshell .NetFrameworkにへばりついてるただの寄生虫
>>378 そのC#コンパイラが使いにくいw
メモ帳で頑張るのが苦痛だw
>>379 寧ろ、OfficeのGUIが起動してるのが前提だよ。
ExcelのファイルをどうにかしたいだけだったらVBAである必要全く無いんだから。
ちなみにここはVBAのスレであってExcelブックをどうにかしたいスレじゃない。 でも、なぜか競合しないのにVBAでないものを書く人が沸いてくるね。
>>380 > Powershellは.NetFramework抜いたらただのshell
流石にそれはアホすぎ
パイプにオブジェクト流せるとか配列処理とか従来のshellとはかなり違う
>>381 面倒と言うならわかる
VSなんて要らんよっていうだけの話だし
>>373 開発職やってるが、Excelじゃなくて他の環境で作るべきではと思うようなシステムをExcelて依頼されることがよくある
Excelっていう環境が使う側にとっても手軽で都合がいいんだろう
>>388 俺は逆に発注側だけど、Excelの方が都合が良いというより、Excelしか想像できない奴に要件整理のタスクを与えて社内稟議まで通してRFP出してしまう感じ
Excelで作ろうが他のシステムで作ろうが発注側は中身が理解できないから取捨選択すらしてない
ある意味閉じた環境だからテストが楽なんだよ もちろん完全なサンドボックスではないけど
>>388 それあるね。
ネットワークとユーザー認証絡む奴でExcelには向かないからWebとかで作った方が良いって言ったんだけどさ、予算が無いんだってさ。
csc教えてくれてありがとう。世界が広がったわ。 エクセルで社内chatアプリとか作り放題できそう。
A1セルに飛びたいブックのアドレスが書いてある(C:\test1.xlsx)環境下 test1.xlsxが開いていなければWorkbooks.Open(Filepath)で開く test1.xlsxが開いていなければハイパーリンクで飛ぶ(2重起動しないため) にしたいのですが、どうしてもできません。 G4にハイパーリンクをせっていしましたが、できません・・・どこが悪いのでしょうか? Dim myChkBook As Workbook Dim bookname As String On Error GoTo ErrHdl Set myChkBook = Workbooks("test1.xlsx") '"開かれています。" 'ハイパーリンク起動G4 Range("G4").Hyperlinks(1).Follow NewWindow:=True Exit Sub ErrHdl: ' "開かれていません。" (↓pas_kombetu1は設定済みで以下のマクロは実行できます。) Dim Filepath Filepath = pas_kom1 Dim targetWorkbook As Workbook Set targetWorkbook = Workbooks.Open(Filepath)
↑393です。間違えました。訂正します A1セルに飛びたいブックのアドレスが書いてある(C:\test1.xlsx)環境下 test1.xlsxが開いていなければWorkbooks.Open(Filepath)で開く test1.xlsxが開いていればハイパーリンクで飛ぶ(2重起動しないため) にしたいのですが、どうしてもできません。 G4にハイパーリンクをせっていしましたが、できません・・・どこが悪いのでしょうか? Dim myChkBook As Workbook Dim bookname As String On Error GoTo ErrHdl Set myChkBook = Workbooks("test1.xlsx") '"開かれています。" 'ハイパーリンク起動G4 Range("G4").Hyperlinks(1).Follow NewWindow:=True Exit Sub ErrHdl: ' "開かれていません。" (↓pas_kombetu1は設定済みで以下のマクロは実行できます。) Dim Filepath Filepath = pas_kom1 Dim targetWorkbook As Workbook Set targetWorkbook = Workbooks.Open(Filepath)
↑393です。間違えました。訂正します A1セルに飛びたいブックのアドレスが書いてある(C:\test1.xlsx)環境下 test1.xlsxが開いていなければWorkbooks.Open(Filepath)で開く test1.xlsxが開いていればハイパーリンクで飛ぶ(2重起動しないため) にしたいのですが、どうしてもできません。 G4にハイパーリンクをせっていしましたが、できません・・・どこが悪いのでしょうか? Dim myChkBook As Workbook Dim bookname As String On Error GoTo ErrHdl Set myChkBook = Workbooks("test1.xlsx") '"開かれています。" 'ハイパーリンク起動G4 Range("G4").Hyperlinks(1).Follow NewWindow:=True Exit Sub ErrHdl: ' "開かれていません。" (↓pas_kombetu1は設定済みで以下のマクロは実行できます。) Dim Filepath Filepath = pas_kom1 Dim targetWorkbook As Workbook Set targetWorkbook = Workbooks.Open(Filepath)
ハイパーリンクでどこへ飛ぼうとしているのか? 天国か?
mychkbook.activate range~
>>395 やりたいことはこういうことかな?
処理の内容からみて、GoToでエラーハンドラに飛ばす必要はないと思う
' 開いているブックの集合に対してループを回し、順番にmyChkbookにセットして名前を調べ、test1.xlsxが見つかったらループを終了する
Dim myChkbook As Workbook
For Each myChkbook In Workbooks
If myChkbook.Name = "test1.xlsx" Then Exit For
Next myChkbook
' ループが終了した段階でmyChkbookにセットされているブックの名前がtest1.xlsxでない場合、test1.xlsxが開かれていないことを意味するので、test1.xlsxを開いてmyChkbookにセットする
If myChkbook.Name <> "test1.xlsx"
Then Set myChkbook = Workbooks.Open(pas_kom1)
' myChkbookをアクティブにしてハイパーリンクをフォローする
myChkbook.Activate
Range("G4").Hyperlinks(1).Follow NewWindow:=True
プログラムじゃなくて、プログラミング言語とは…驚いた
学生の頃、友人がyaccとか字句解析とか構文解析とか言ってたが、その世界か…分からん
スーパー中学生誕生、プログラミング言語わずか数週間で開発、
U-22プログラミング・コンテスト2019 2019/10/21
https://www.bcnretail.com/market/detail/20191021_142131.html 「もっと人間にとって扱いやすい、自分の言語をつくってみたかった」。
10月20日に東京の秋葉原コンベンションホールで開催された第40回「U-22プログラミング・コンテスト2019」の
最終審査会で、見事、経済産業大臣賞(総合)を受賞した開成中学校3年の上原直人さん(15歳)は、
独自プログラミング言語「Blawn」を発表した。
IT業界の経営者など、並みいる審査員を驚かせたのは、完成度の高さはもちろんのこと、今年8月からわずか
数週間で完成させたスピードだった。
一次審査の応募期間7月1日〜9月2日に着想から開発、完成まで一人で仕上げたという。
◆C言語を使ったのは今年7月
それまでPythonを使っていたという上原さんは発表の中で、「今年の7月か8月にC++を始めたが、扱いにくかった。
もっと可読性の高い構文とメモリの安全性や速度を高めたいと思った」と、開発のきっかけについて語った。
質疑応答で審査員から、「7月にC++を使ったということは、Blawnはそれ以降につくられたということですか?」
と聞かれて、上原さんが「7月中旬に構想して構文解析を行って、プログラムを書き始めたのは8月ごろ」と答えると、
会場にどよめきが起きた。文句なしの受賞だった。
上原さんは、ほかにもスポンサー企業のデジタルガレージとサイボウズ2社の賞と、当日の模様を配信した
ニコニコ生放送の視聴者による賞など4冠を達成した。
Blawnの特徴は、型名の記述が一切不要、構文の可読性が高い、すべての関数/クラスがC++でいうところの
テンプレート関数/クラス、コンパイル速度と実行速度が速い、メモリが安全などだ。
また、Blawnの言語名は「Blue Lawn(青い芝)」からもじったもので、隣の芝が青く見えるほど、既存の言語の
不満を解消できるような良い言語にしたい気持ちを込めたという心憎い演出もあった。
なぜ天才は日本語プログラミング言語を作ってくれないのか
変数に2バイト文字使えるだけでもかなりありがたいぞ
自然言語のルールそのままでプログラミング言語を実装するわけじゃないから日本語が曖昧云々ってのはズレてる 英語のit とかtheyとかbeだって曖昧極まりないし
>>403 > 変数に2バイト文字使えるだけでもかなりありがたいぞ
今時使える処理系の方が多いだろ
>>404 みたいなのは何も考えてない+自分に自信を持てないアホだから相手しても時間の無駄だぞ
>>406 え、マジかわざわざ挑戦するようなことでもないから知らんかった、スマン
.NETはともかく他に何かあるんか?web系は全滅と思うけど変わってるのだろうか
>>408 それこそVBAでも使えるしVisual Studioで使えるC/C++, C#, VB.NETはもとより、GCCとかPython3でも使える
vlookupを最下行まで入れたくて、検索範囲を絶対参照にしたいんだけどできるの? $maxrow$じゃだめだよね
108万行探すつもりかよww A:Aとかじゃダメなのか。
100行しかデータが入ってなくても、A:Aみたいに列全体にすれば自動的にA1:A100みたいに解釈してくれるよ
>>409 どっちもあまり良いコードとは言えんよ。
activateは使わない方が良い。
その後のRangeの前を省略しない書き方のが良い。
>>415 ApplicationレベルのWorkbookActivateイベントで何らかの処理を噛ませている可能性があるから、Activateメソッドが無意味とは言いきれない
それは考えすぎw ハンドラまで作れる人ならこんな質問しないよ
Excelで、「行ごとに違う色をつけるが、1行目だけ何も色を付けない」というVBAの書き方を教えてくんさい。
>>418 https://support.office.com/ja-jp/article/-1- 行おきまたは-1-列おきに色を設定する-30002ce0-7a1c-4d70-a70c-4b6232f09f5e
VBAなど不要
どうしても一発でやりたいならマクロの記録を使えばいい
>>418 3行目から始まる、4行ごとのsannpuru
色(65535の部分)はマクロの記録で取ってくれ
あともう少し真面目に聞いたほうが回答が尽きやすい
For i = 3 To 100 Step 4
Rows(i & ":" & i).Interior.Color = 65535
Next
End Sub
>>420 すみません&有り難うございます。
具体的な目的を書かずに適当に質問してしまったのですが、やりたいことは
1.行ごとに違う色を入れる
2.1行目だけ何もしない(色を変えない)
3.2についてはIF文を使う
なのですが、3.が上手くいきません。
*************************************************************************:
Sub xxxxxxx()
Dim i As Integer
Dim z As Integer
Dim y As Integer
z = 500 '最大行数
y = 300 '最大列数
For i = 1 To z '繰り返し処理を使い、変数は1〜500
Range(Cells(i, 1), Cells(i, y)).Interior.ColorIndex = 22 'セル範囲の指定
Next i '500行目までを22番色で埋める
For i = 1 To z Step 2 '1行飛ばしで500行目までを13番色で埋める
Range(Cells(i, 1), Cells(i, y)).Interior.ColorIndex = 13 'セル範囲の指定
Next i
End Sub
**********************************************************************↓こういう感じのIF文を入れたい
If i = 1 Then '1行目だけ何もしない
Range(Cells(i, 1), Cells(i, y)).Interior.ColorIndex = 00
Else
>>421 Ifにする必要がわからない
Range(Cells(1, 1), Cells(1, y)).Interior.ColorIndex = 0 を最後に入れるか、
最初に入れてForの開始行を1にしなければいいと思うんだが
上手くいかないとはどういかないの?
縞模様のテーブルスタイルをあらかじめ定義しておいて、テーブル変換してスタイルを適用してからテーブルを範囲に転換するのが一番楽だよ
>>421 ifは見づらいだけだよ
100%、forを2から始めた方が良い
For i = 1 To z '繰り返し処理を使い、変数は1〜500
if i >1 then
'ここに全部入れる
endif
Next i
>>421 範囲内を塗るだけなら、最初のFor〜Nextはいらない。
範囲全体を22番で塗った後に奇数行に処理するのではなく、
範囲全体を13番で塗った後に偶数行に処理する、
とすれば、1行目の処理のIf文いらない。
Sub xxxxxxx()
Dim i As Integer
Dim z As Integer
Dim y As Integer
z = 500
y = 300
Range(Cells(2, 1), Cells(z, y)).Interior.ColorIndex = 13
For i = 2 To z Step 2
Range(Cells(i, 1), Cells(i, y)).Interior.ColorIndex = 22
Next i
End Sub
>2.1行目だけ何もしない(色を変えない)
っていうのは元々色が付いていたらその色から変えてはいけないって意味だよね。
そうすると
1行目を含めて塗った後、勝手にInterior.ColorIndex = 00であったとと決めつけて処理するのはよろしくない。
>>422-425 有難うございます。
間違いなく、Forのところを2行目からにする方が簡潔でいいと思うのですが、無理矢理if文を入れるとするとどうすべきかを知りたかった部分もあったので、大変助かりました。
>>426 全く仰る通りです。
「00で塗らなければならない」ではなく、「何もしない」なのだから、そのように書くのが筋ですよね。
有難うございます!
奇遇判定ならIfよりSelect Caseで分けると楽かな Dim cngRng As Excel.Range Set cngRng = Excel.Application.Range("A1:E20") '範囲から上一列を除外 Set cngRng = cngRng.Offset(1, 0).Resize(cngRng.Rows.Count - 1, cngRng.Columns.Count) Dim colorNum As Long Dim r As Excel.Range For Each r In cngRng.Rows Select Case r.Row Mod 2 '行番号を2で割った余り Case 0 colorNum = 1 '1=Black Case 1 colorNum = 6 '6=Yellow End Select r.Interior.ColorIndex = colorNum Next r
z = 500 '最大行数 For r = 2 To z Step 2 '偶数 Next For r = 3 To z Step 2 '奇数 Next
Rangeをつかってセルの範囲を指定した後に 条件を付け加えて条件に合うまで自動で繰り返し処理を行って条件通りになった時に選択セルに文字や数字を入れるにはその下にIfとかで条件を増やしていけばいいの?
>>432 条件が簡単で範囲が狭ければ上にあるようにselect caseが分かりやすい
for each c in range("a5:b20")
select case c
case 1
c=c+1
end select
next
>>432 選択セルに入れるというのがナンセンス。
今、ユーザーが選択したセルに入れるという処理はあり得るけど、普通は選択せずに入れる。
ExcelでOutlookのメールを処理することについての質問なのですが、ここのスレでよろしいでしょうか。
https://docs.microsoft.com/ja-jp/office/vba/api/outlook.items.getlast getlastメソッドで、メールを取得するのですが、たまに取得できないことがあります。(たぶんNothing?が帰ってくる。Nothingでない可能性もある。)(メールアイテム以外でも動作確認済。)
getlastメソッドで、取得失敗した場合には5秒待機してもう一度getlastメソッドを行い、最大20回繰り返す処理にしても、たまにメールの取得に失敗します。
ログを確認すると、メールを受信した時間にエラーが起きているようでした。(自身が送信したメールであるかは未確認)
ちなみに、共有受信フォルダに対して処理を行なっています。
メールの取得がうまくいかない原因として何が考えられるでしょうか?
また対策もお教えいただければ。
よろしくお願いします。
getlastしようとしてるオブジェクトが空なんじゃないの 当然何度やってもダメでしょうし オブジェクトの指定を見直すしかないのでは
>>435 マクロ実行のタイミングで新着がある場合に失敗することがある
>>435 outlookの受信処理と競合して、完全にダウンロードされていないアイテムを掴んで処理が失敗してしまってるんじゃないかな
ActiveExplorer.CommandBars.ExecuteMso ("ToggleOnline")でオンライン/オフラインのモードを切り替えられるので、オフラインモードにしてから受信済のアイテムを操作してみたらどうかな
>>438 解決に近い具体的な解決策ありがとうございます。
少し調べてみて明日組み込んでみます!
>>439 438をポストした者だけど、共有メールボックスではコマンドバー操作を試していないので、うまくいかなかったら申し訳ない
選択されてる範囲に勝手に入力されるのは困ると捉えるか 使う側が指定した範囲に効果を適用したいと捉えるかの違いでは
>>429 むしろ遇奇なら一行ifを使ったほうが簡潔だよ
If r.Row Mod 2 Then r.Interior.ColorIndex = 6 Else r.Interior.ColorIndex = 1
また、「colorNum」を「r.Row Mod 2」の関数とみなせば
Dim colorNum(): colorNum = Array(1, 6) '配列で代用
(中略)
r.Interior.ColorIndex = colorNum(r.Row Mod 2)
という形になる。
また、「r.Row Mod *」の除数は「colorNum」の要素数なので
Dim modSecond as Long : modSecond = Ubound(colorNum) - Lbound(colorNum) + 1
r.Interior.ColorIndex = colorNum(r.Row Mod modSecond)
と一般化できる。
これはIf文やSelect文と違い、colorNumを与えれば三色以上にも動的に対応出来る。
>>441 Selectメソッド使わなくてもセルに入力できるよっていう話だと思う
マクロを記録すると当然セル選択(Select)も全部記録するし、「選択してから操作する」は直感的にも正しいから、
初めてVBAを触る人はSelect必須だと勘違いしやすい
実際は「マクロが動いてる様子が見れないと不安だ」っていう人も少なからずいて、わざとSelectすることはよくある
このまえ職場のITの人が 「サーバがコケた」と言ってました。 「コケた」とはなんですか? サーバに足が二本あってその足がもつれてサーバが倒れた?
すいません 「いま選択しているセル(1セルのみ選択します)の中心に、 [行の先頭(Aの左端)]から[設定されている印刷範囲の右まで] オートシェイプの罫線を引く」 、というマクロを作成し始めているのですが、 [印刷範囲の右まで] という指定はどのように記述したらよいでしょうか? いまのところ検索しつつ手習いでこんな記述になったのですが、 Sub マクロ名() Dim R As Range Set R = Selection With ActiveSheet.Shapes.AddLine(R.Left - R.Left, R.Top + R.Height / 2, [ ], R.Top + R.Height / 2).Line End With End Sub [ ]の中に[印刷範囲の右まで]という意味合いを 挿入すればできるのかしらと思っています [Aの左端]を指定するのに [選択範囲の右までの距離から、選択範囲の右までの距離を引いたもの]で 距離がゼロになったはウフフ としているのも 「・・・他にビシッとした命令文があるんじゃないかね」と思っているので ここもご教示いただければ幸いです
>>445 印刷範囲はActiveSheet.PageSetup.PrintAreaで取得できる
印刷範囲の右端列のうち選択セルRと同じ行にあるセル範囲を取得するならば、こんな感じになるかな
試してないのでうまくいかなかったらごめん
With ActiveSheet
.Cells(R.Row, .PageSetup.PrintArea.Columns(.PageSetup.PrintArea.Columns.Count).Column)
End With
列の右端左端の値を取ろうとxltoright/xltoleftを使ったやり方したんだけど、普通に値が入ってるのは大丈夫だったのだけど、計算式が入っているのはダメだった… どうしたら計算式でも値が入ってる最終、最初の列の値を取れるのでしょう… 一応値貼り付けをしてみたけどダメでした。
>>448 RangeオブジェクトのCurrentRegionプロパティで解決できる
listviewが使えない状態でフルパスをドラッグドロップで取得したいんですが可能ですか。 vbsでバッチファイル経由でも良いのですが excel上にマクロボタンを設置し listviewのようにバッチファイル自体にドラッグドロップするのではなく エクセル内にドラッグドロップしフルパスを取得したいです。 ご教示お願いします。
OutlookとかVBAとかいつの時代を生きてんの? そろそろ進もうよ
>>451 Office365でOutlookクライアントネイティブでマクロ実行するときもOutlook VBAが使えて便利だぞ
Excel VBAでもPowerPivotや PowerQueryみたいなモダンな機能を扱えるし何かと便利
あとVBAは古くて癖があるけど、やっぱりMS Office自体は有用だし、他言語でCOM生成したりMS Office Interopを使ったりする手間を考えたらVBAを使う手間と大差ない
【1 OSの種類 .】 Windows10 【2 Excelのバージョン 】 Excel2019 【3 VBAが使えるか .】 はい 【4 VBAでの回答の可否】 可 ちょっと頭のおかしい感じにしてみたんですけど、どうでしょう? Sub 猿() '@@@@@@@@@@@@@@@@@@ Dim 日本脳炎, 邪教, 脳梗塞 '@@@@@@@@@@@@@@@@@@ End Sub Sub 呪呪呪呪呪呪呪呪() '死死死死死死死死死死死死 Dim あああああああああああ '死死死死死死死死死死死死 End Sub
33sands's blog: VBAでpushやpopができる配列クラスを実装しました
http://33sands.blogspot.com/2012/03/vbapushpop.html このブログで、VBA自作配列クラスが公開されていたようですが、ファイルが消えていました。
ここで公開されていたファイルをお持ちの方はいませんでしょうか?
>>449 月曜日に試してみたいと思います。
ありがとうございます。
>>456 そこに書いてある Ubound(配列) + 1 ってのは、よく見かける見る例で、
ループ内で使うと思うんだけど、毎回配列の最大数調べてたら遅くならんかなぁ。
俺は a = a + 1 にしちゃうけど、変わらんか?
>>460 VBAでpushを実装しようと思うとこうするしかないぞ
>>460 たいして変わらんし、多少変わったとしても次の
ReDim Preserve myArray(newIndex)
に比べたらゴミ
>>449 currentregionプロパティで下記のは可能でしょうか?
ABCDEFGHI(列名)
q 12 33 q
A〜I列の内、B〜H列内で数字がある最初と最後の列番号を取得したいと思ってます。
通常では448に書いたようにB〜H列を指定して.ENDでxltoleft/rightを使い2行と2つの変数に結果を入れる事でできたのですが、計算式だとNGだったので(どちらもH列が帰ってきました)
>>463 計算結果が数値の最初と最後の列ってこと?
xlToLeft; xlToRight; はセルが空かどうかでしか判断できないから使えないでしょ?
開始列と終了列からそれぞれなめて、IsNumeric(.value) で判定しないとダメじゃないかな。
なんかいい方法あるけ?
>>456 よく見てないけど計算量最適化できてなさそうだね
>>463 CurrentRegionでは恐らく無理
下のようにループを左右両側から回して調べるしかないんじゃないかな
列番号をチェックする行に含まれるセルを選択している状態という前提です
Dim RngA2I As Range 'チェック対象行のA列からI列までの範囲
Dim i As Long 'ループ用インデックス
Dim LMost As Long '左端列の列番号
Dim RMost As Long '右端列の列番号
With ActiveSheet
Set RngA2I = .Cells(.Cells(Selection.Row, 1), .Cells(Selection.Row, 9))
End With
For i = 2 To 8
If IsNumeric(RngA2I.Item(i).Value) Then
LMost = i
Exit For
End If
Next
For i = 8 To 2 Step - 1
If IsNumeric(RngA2I.Item(i).Value) Then
RMost = i
Exit For
End If
Next
>>466 中身わからんのに計算量を推定できるとかエスパーかよw
>>463 With Range("B:H")
'最初
.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
'最後
.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
End With
値が入ってるセルが1つも無いとエラーになるから事前にチェックしておく
>>469 これで数値結果を返すセルを拾えるの?
文字列結果を返すセルも捕まえるみたいだけど、、
今の時代でマルチスレッドが使えない時点で終わってる
>>472 マルチスレッドプログラミングは難しいので、なにか適切な抽象化方策が言語でとられるべきかと
>>468 Redimで連続アドレス領域を都度確保するのが効率悪いって言いたいだけなんだが
>>467 やはり両方から確認しにいくのが確実ですよね。
他の部署から来るデータで2シートだけは単純に空白と数値だけなのですが、他のファイルにある1シートだけは計算式入ってたので…
まぁ、最初と最後だけ確認してから他の作業をさせればいいので、これ参考にさせていただきます。
ありがとうございました。
>>469 数値限定なんです。
さらにその数値から●を他のシートに入力していくとかいうメンドクサイ作業も待ってるという…(そっちは早々に作りましたが)
ありがとうございました。
>>474 どこからその都度確保なんて出てきたんだ?
>>456 のリンク先のコードはサンプルでクラスモジュールのコードがそのままとかエスパーならわかるの?
>>476 その作業、AccessとかPowerQueryでやった方がいいんじゃないの?
VBAだと車輪の再発明になる気がするぞ
AccessやPowerQueryを知らずに言ってるんだろうがテーブルへのクエリをExcel VBAでスクラッチする方が遥かに面倒だぞ
448のどこがaccess、powerquery向きなのか理解出来ない
最初からデータをDBへ入れて扱っていれば「端の値を取る」などというトンデモ要件はそもそも出てこないということだろう 業務ロジックの中でシートの右だの左だの何列目だのとシート上でのレイアウトに依存したコードが散乱するのは典型的な悪夢
448です。 元は手作業でやっていたのを自動化?したいとかで外の会社とかも関わってるので、DB化とかそういう話になるとメンドクサイ事になるらしいです。 自分は他から来ているので、あまり口出しできない状態。 あと、作業の行にカレンダーがあって、そのカレンダーに数字が入力されてる感じです。 なので月ごとに場所が変わったりするので… そんなのが数百行あるので、少しでもその作業の先頭列が分かれば…と思っていたのですが…
>>482 確かに…
Excelで手作業だったって事もあって、項目によっては行が結合されていたりとかもあってさらにメンドクサイ状態。
そのへんなんとかしてほしいのだが、そうなると外の会社との折衝にもなるらしいのでNGっぽい…orz
プログラミングスレで聞くのが妥当か分からないけど マクロの記録を使って「データ分析」ツールをSheet1、Sheet2....Sheet13と起動していくマクロを作ろうとしてるんだけど、どういうわけか「データ分析」で生成された表が現れるSheetと現れないシートにムラがある 規則性はないように思われる なにかわかることありますかね
Mac版でcontrol+Shift+5で%が付くようにしたのですがこの設定を元に戻すショートカットってありますか?
userformの選択されているcheckboxのcaptionを変数にまとめてautofilterでデータ抽出しようとしているのですがうまくいきません ちなみにそのような方法でautofilterをかけることは可能でしょうか? よくわかんない質問ですいませんがよろしくお願いします
>>487 たぶん。
確か、配列にして渡すんだったと思う。
任意の複数選択フィルタリングを記録すればどう書けばいいかすぐわかるハズ。
看護師の勤務表を作りたいけど何からやればいいか分からないです。教えてください
単純に勤務表ってだけなら表計算でできることなのでエクセルスレへどうぞ(厳密には表計算ですら無いけど) VBAは大雑把に言うと表計算だけでは実現でいないことをやるための技術です
その場合は必要 後出しで条件を追加すると話が長くなるし回答も二度手間になるので最初にやりたいことをきっちり説明すべし
配列に入ってる値をセルに一個ずつ入れたいのですが、 for i = LBound(配列) to UBound(配列) Cells(i.1).value = 配列(i) Next i こう書くと型が違いますとエラーになります どうすればいいですか?
勤務表を自動で作成したいとなれば、アルゴリズムの知識がないと実装できないと思う。ナース・スケジューリング問題とか調べてみるといい。参考になる文献が出てくる。ただ、いっそのこと有料ソフトを買った方が早い気がする。
>>494 そらi=0から始まるけどセルに座標0はないんで
>>494 range("a1").resize(Ubound(配列)ーLbound(配列)) = _
worksheetfunction.transporse(配列)
Cells(i+1,1).valueかCells(1,1).Offset(i,0).valueにする
エクセル以外のソフトをインストール出来ないってアホみたいな環境はソッコーで辞めた方が良い VBAなんて将来性もないクソ言語を覚える意味は全くない 本当に他の開発環境は無理なの? 冗談だよね?
>>494 取り敢えずみんなが言ってる通り配列のインデックスは0から始まるし
Cellは行にしても列にしても1から始まるのでそこんとこ気をつけなければいけません。
後はセル指定する際にはブック、シートも指定しておく癖をつけておくことをお勧めします。
>>501 仕事場によっては、特に銀行系は
使うもの以外勝手にインストールしてはいけないところが多々有ります。
例えばJavascriptだけ使ってればいいのに
勝手にVisualStudoやTOMCATとかをインストールすると怒られるどころか
コンプライアンスの面から仕事場を退場させられる場合もあります。
EXCELは大概どこの仕事場にも入っているから
インストールしなくても使えるだけで、
当然入れてはいけないと言われたら勝手に入れるべきではありません。
むしろ「勝手にどんどん何でもインストールしていいですよ〜」なんて仕事場があったら
そこのセキュリティはどうなってるのか疑うべきと思われます。
開発メンバーは基本何でもできるからしょうがないだろ Excelマクロがだめなら開発環境の言語使うわ
cmdとか使える時点でセキュリティも何も合ったもんじゃないと思うけどね
>>496 >>497 目から鱗ですありがとうございます
早速明日試してみます
>>503 ご教授ありがとうございます
めっちゃすっきりしました
やっぱり1人でうんうん悩むより聞いた方が早いですね
勉強になります
>>441 >>443 少し組める人は絶対にSelectを使わないという姿勢で組むものです。
何故なら無駄である上に速度が低下するので百害あって一利無しだからです。
しかし、ごく一部Selectしないと実現出来ない処理があります。
形式を選択して貼り付ける処理などがそれです。
それから
>>443 さんのおっしゃるようにユーザーに選択している場所を提示するためにわざとSelectする場合もあります。
>>501 結構多いし、そもそもExcelだけでどうとでもなるから。
能力の低い奴はExcelのせいにするけど、こっちは君が対応出来ないことも出来るんだよ。
確かにどうにもならないことならその時にはじめて他のソフトを検討するけどね。
>>503 >>509 配列の設計はどうにもならんの?
別に1始まりにも出来るし、2次元にすればもっと良い。
>>504 勝手に入れる奴はそもそも居ないでしょ。
Excelは大概どこの仕事場にも入っているのは事実だけど、それが理由ではない。
入っていなければ最初から選択肢に無いし、このスレに書き込んでもいない。
>>487 >>488 Dim i As Integer
Dim n As Integer
Dim 検索値(0 To 3) As String
n = 1
For i = 1 To 4
If Me.Controls("CheckBox" & i).Value = True Then
検索値(n) = Me.Controls("CheckBox" & i).Caption
n = n + 1
End If
Next i
ActiveSheet.Range("$A$1:$J$41").AutoFilter Field:=2, Criteria1:=Array(検索値), Operator:=xlFilterValues
素人ながらにこんな感じで書いてみたのですが、こうするとチェックした項目だけでなく空白セルもautofilterもかけてしまいます。
どうしたら空白セルを除外することができますか?
end ifの前にredim preserve 検索値(i)は?
VBAのユーザーフォームはWindows98の時代で止まったまま あれじゃあ恥ずかしいよね
2019でファイルを開いた時に、勝手にコンボボックスのクリックイベントが発動するんだけど、何で? もちろん、ワークブックのクラスには何も書いてない状態。 2013ではそんな事なかったと思うんだけど。 このせいで、一切編集せずに閉じようとしても、いちいち保存するか聞いてくる。
>>517 だいたいそんな感じですね。 以下で行けました。(Dim文、略) Control名いじるのが面倒なので、FrameにChkBox つっこんで回しています。 iCnt = UserForm1.Frame1.Controls.Count - 1 ReDim ARR(iCnt) i = -1 For Each vBuf In UserForm1.Frame1.Controls With vBuf If .Value = True Then i = i + 1 ARR(i) = .Caption End If End With Next ActiveSheet.Range("範囲").AutoFilter _ Field:=1, _ Criteria1:=ARR, _ Operator:=xlFilterValues >>520 アドインでアプリケーションレベルのイベントハンドラ動かしてるとかじゃないの
ワークブッククラスの話までできるなら切り分ければいいのに。
>>522 アドインを無効にしたり、
ワークブックオープンイベントの最初にEnd入れてみたりしたけど、ダメだった。
>>523 最悪は違う手を考えるけど、こんな変な仕様だったのか?と思って。
↑ワークブックオープンイベントの最初にEndって、アドインの方ね。
↑クリックイベントだけじゃなくて、チェンジイベントもだった。 何もチェンジしてないっての。
>>525 Worksheet_Activateイベントあたりが悪さしてるんじゃないの
シートイベントってほんとにゴチャゴチャになりやすいから
ある数値が範囲(***-***)や、範囲と単体の組み合わせを、カンマで区切っているのを降順に配列に格納したいけど、なんか上手くいかないです。 全部VBAでやろうとしているから…なのかな?と思い始めてます。 それ用のシートを作って、そこに1つずつ入れてソートさせた方が簡単…なのでしょうか?
>>528 10, 5, 1-3, 6 7-9, 11
みたいに数字が並んでるのを、カンマ区切りの文字列ではなく数字の評価をした上で降順ソートしたいってこと?
まず今手元にあるコードを書いてくれ
>>527 それも見たけど、ないなぁ。
ていうか、コンボボックスが置いてあるシートがアクティブじゃなくても発動するし。
2013では、VBAでオブジェクトにフォーカスを移すと、
初回のみカーソルが見えなくなる現象が起きたと思うけど、
その対策として何かやってたりして。
>>528 VBAでもシートに書き出してからでもどっちも大した手間は無いよ
まず範囲を1-3なら1,2,3と展開して全体をカンマ区切りだけにしてから、
前者なら配列に格納→配列の中身を降順でソート
後者ならシートに貼り付け→ソート機能使えばいい
>>530 実装レベルでの不具合の可能性もあるし、ブックのxmlだけが壊れてる可能性もある
コンボボックス以外のオブジェクトの挙動は試してみた?
>>529 すまん、コード会社にあるから書けないけど、やりたい事はそんな感じ。
最初にカンマでsplitして配列に入れてからfor〜nextで0からuboundで最後まで繰り返して「-」になってる範囲を数字にバラしてその間の数字を作って配列に入れ直して…
とかやってたらコードぐちゃぐちゃ、頭の中もぐちゃぐちゃに…orz
ソートを自前で書くのは速度的にもメリット無いし作業シート用意した方がいいと思う そういうとこで苦労するのはちょっと時間の無駄かなとも思うし
>>533 配列を作るところまでは多分いけるんだろうけど、問題はソートなんじゃないの?
配列のソートをサポートしてる.NETのArrayListオブジェクトはVBAでも使えるので、CreateObject("System.Collections.ArrayList")でインスタンス生成してAddメソッドで配列を渡して使うといいよ
Revereメソッドを噛ませてからToArrayメソッドで再度配列化して配列変数に再格納すれば一発で降順ソートされた配列を取得できる
Excel2016/32bitで作成したマクロをExcel2019/64bitのパソコンに移動すると途中でExcel自体が落ちてしまいます この場合、2019にしたこと、64bitにしたこと、どちらが原因と考えられるでしょうか?
>>537 動かないマクロファイルのファイル形式は?
>>538 調べてもわかりませんでした
>>539 xlsmです
ちなみに動く時もありますがたまに落ちるという不安定な状態です
>>540 何をどう調べてどういう結果になったの?
533です。 結局分割をしたデータをセルに置いてソートをさせて配列に入れるコードで問題なく動きました。 ありがとうございました。 変にVBAてわ全てやろうとせずにすればここまで時間かけずに済んだのですね…orz
どうせマクロ作った奴が手抜きしててエラーになったらApplication.Quit()してるとかじゃね みんなエスパーじゃないんだからコード上げられないなら自分でチマチマデバッグしなよ
VBSスレが過疎り過ぎているのとWSHのスレが無いことから、ここでVBSの質問させて下さい。 WshShellのRunメソッドを使ってTortoiseSVNのダイアログを呼び出すプログラムを書いているのですが、引数1を入れてもウィンドウが最前面に来てくれません。 Runした後にAppActivateメソッドを使ってもだめです。誰か、解決策をご存じの方、よろしくお願い申し上げます。
tortoiseSVNとやらを触った事ないけど、 tortoiseSVNだけ起こる事象なの?他のNotepadとかでは試しました?
spy++とかで窓id探ってapi使ってhandleできないかな
>>536 レコードセット以外にも色んな方法があるものだね。勉強になったありがとう。
こちらのページ(
https://www.sejuku.net/blog/99122 )に記載されている
PDFをテキスト抽出してエクセルに貼るマクロを利用したいのですが、
ファイルとフォルダのパスを固定した記述になっているため、
ベースとなるPDFファイルを選択できるようにしたいのですがどなたか教えていただけないでしょうか。
↓のアスタリスク部分をどうにかすればと2時間戦いましたがどうにもできませんでした...
'PDFのデータをExcelに読み込むメイン処理
Sub Main()
'PDFファイルをテキストに変換するための定数を用意
* Const fileName = "*****"
* Const folderPath = "C:\Users\*****\"
Const pdfFilePath = folderPath & fileName & ".pdf"
Const txtFilePath = folderPath & fileName & ".txt"
'PDFファイルをテキストに変換
Call convPDFtoText(fileName, folderPath, pdfFilePath, txtFilePath)
'テキストデータをExcelに読み込む
Call importTxtData(txtFilePath)
End Sub
>>551 GetOpenFilenameでパスとファイル名を取得
>>536 .Netのオブジェクトが使えるというのは
正直目からウロコだった。
いいね。.Net使いの俺からすると
機能に制限があるとは言っても有り難い。
ただ、参照設定して使っても
インテリセンスが効かないのが
ちょっと玉に瑕だけど。
>>532 試してないけど、クリック→ドロップボタンクリックにしたら発動しなくなったから、もうそれでいいやw
1クリックで2回動くのが嫌だけど。
いちいち、2回に1回Exitする処理入れないといけないし。
↑ダメだったwww 発動しないけど、何もしてないのに保存しますか?って聞いてくる現象が直ってないww イベント関係ないのか。
>>553 IListインターフェースを通せばメンバが見れる
>>552 定数を変数にしてファイル名だけの取得を別に作成したらできました!
ありがとうございました
>>557 CreateObjectせず使う方法があるのか
面白いこと考えるよな。 シートに貼ってソートか、SQLのORDER BYしか思いつかんかったわ。
>>563 見下したところでお前のほうが格上になったわけじゃないんだぜ
ん?
>>563 は、自分が頭良いとは言ってないのでは?
ここの回答者よりも高度な回答例は書けないようだし。
書けたら格上を認めてあげても良いけど。
ユーザーフォームが表示されてる状態でキーボードのキーの組み合わせ(ctrl+何かとか)をした際にだけ、フォーム上に表示される様にするにはどう言ったコードにすればいいでしょう?
>>570 UserFormのKeyDownイベントで拾う
たとえばUserFormの上でCtrlキーとAキーが同時に押されたときにCommandButton1を表示するという処理なら下のようになる
押された文字キーを示すキーコードは引数KeyCodeに定数で格納されるけど、Aキー以外の文字キーにしたいなら定数は自分で調べてくれ
あと次からは何を表示したいのか目的語をきちんと書くように
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 65 And Shift = vbCtrlMask Then Me.CommandButton1.Visible = True
End Sub
Withってコーティングの手間を省く、見映え以外に良いこと有りますか?
>>572 Dim S As Xxx
Set S = Yyy
S.Abc = …
S.Def = …
より
With Yyy
.Abc = …
.Def = …
End With
の方が微妙に速いとかもあったかも
まあ気にするほどの差はない
>>571 ありがとうございます。
今までユーザーフォームって苦手でほとんど使った事なかったのですが、今携わってるシステムは使ったほうが使い勝手良くなるので…
まず変数名を考えなくて良いという点、 それから、end with で破棄(解放)される点
逆にWithステートメントで取得した参照がEnd Withまで静的に保持される点は注意すべきポイントでもある 例えばWith ActiveSheet で始まるWithブロック内で他シートをアクティブにしても、ドットでアクセス提供されるメンバの親はWith宣言時点のActiveSheetになるからな
Withの読み方はウイズだと思うけど書くときの頭の中はいつもウイテンなのは俺だけなのかな
読み方があってるかどうか不安なのはあるな。 ナンバーフォーマットローカルとか。
最初は、ヤッホージャパンって何だよwwwって思ったな。
むかしFalseのことファルスって読んでた ファルスがギリシャ語で陰部を意味する単語だと知ったのは最近
>>581 20年以上ファルスと読んでた。最近Youtubeでフォルスだと知った。Bluetoothを何度教えてもブルースと読む同僚を笑えない。
>>585 ワイの周りにもファルス詠みはたくさんいる。中高の英語の勉強で発音記号見たことあるはずなのに
教えてくれた先生がファルスだったので周りもみんなファルス読み
ファーストフードがいつの間にかファストフードになってるようなもんだろ
>>589 発音記号みると、どっちもあるみたいだね。
カタカナに当てはめるんじゃないfalseはfalseだぜ
野球のファールみたいなもんだろ よってファールスで
すみません。 最新のWindows10でVBAを実行したところ、VBScript.RegExpのCreateObjectに失敗しました。 IEのVBS機能が無効化された影響によるものでしょうか? 回避策等ありますでしょうか?
>>601 試してないけどJScriptを使ったらどうかな
32bit環境ならScriptControl オブジェクトをCreateObjectで生成してJScriptの正規表現を使う
62bit環境ならMSHTMLオブジェクトでIEのエンジンのJScript実行環境を生成して、そこからJScriptの正規表現を使う
同じフォルダ内の他のファイルを削除しようとすると ファイルは削除されますが、 「実行時エラー'70': 書き込みできません。」 がでて処理が止まります。 Dim aa As String aa = ThisWorkbook.Path & "\" Kill aa & "*.*" どうすれば止まらずに処理できますか
>>603 自分の手で自分の頸を吊ってみればわかるぞ
>>603 ThisworkbookそのものをKillしようとして失敗してる
>>605 VBAの実行ファイルを対象から外すにはどうすればよいですか?
>>603 On Error Resume Next
じゃダメなん?
>>609 thisworkbookを消そうとした時以外でも同じエラーが出ることがある
FileSystemObjectとか使えばいいのに
>>603 Dim fso As Object
Dim fr As Object
Dim fl As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set fr = fso.GetFolder(ThisWorkbook.Path)
On Error Resume Next
For Each fl In fr.Files
If fl.Name <> ThisWorkbook.Name Then
fl.Delete
If Err.Number <> 0 Then
Debug.Print "Err.Number:" & Err.Number &" FileName:" & fl.Name
Err.Clear
End If
End If
Next fl
Dim wb as Workbook ... wbが開いているか閉じられているか確認する方法ありますか?
For Each wb in workbooks で名前やパスをチェックするとか
>>620 そのやり方だとNASとかにある共有ファイルを他人が開いてる場合には判定不可能
>>619 対象のファイルをエクセルファイルとして開かずにVB6のOpen ステートメントの追記モードで開くのがオーソドックスなやり方
他のユーザーエンティティが編集権をロックした状態だとファイルが開けずエラーが発生することを利用する
エラーコードを調べて0より大きい場合はファイルが開かれている、そうでなければファイルが開かれていないと判断する
ただし負荷対策が最適化されていないネットワーク環境でサーバーの応答が遅くなっている場合、数分前に誰かが閉じたファイルを開いていると判定してしまうので要注意
'サンプルコード
Sub Sample()
If IsFileOpened("任意のブックのフルパス") Then
MsgBox "開かれています"
Else
MsgBox "開かれていません"
End If
End Sub
Function IsFileOpened(fliepath as String) As Boolean
On Error Resume Next
Open filepath For Append As #1
Close #1
If Err.Number > 0 Then
IsFileOpened = True
Err.Clear
Else
IsFileOpened = False
End If
End Function
>>621 ブックを開いているときは~$ファイル名の隠しファイルが作られるからそれを見たら
行番号が1-9まで1ずつ加算されてる中で3ごとにブロックとして処理の始点を1,4,7行にしたいんだけど行番号から式で求められないかな? for i=1to9 if i<4 and i>0 then 処理1 elseif i<7 and i>3then 処理2 else 処理3 next i これを分岐なしでスマートに書きたい 123456789→111444777って変換式が欲しい
Ruby で、 ( 1..9 ).each { |i| p ( ( i - 1 ) / 3 ) * 3 + 1 }
何でもうすぐ無くなる言語のruby何かで答えるの?アホなの?
>>623 変換するだけなら i - (i - 1) Mod 3 で111444777になる 3つの処理に分けたいなら Select Case i Case 1, 2, 3 処理1 Case 4, 5, 6 処理2 Case Else 処理3 End Select >>623 111777999を割り出す変換式を使うのではなく、行番号を3で割った商が1の場合だけ処理を行うようにするのは駄目なの?
例えばこんな感じ
For i = 1 To 9
If i Mod 3 = 1 Then
'処理
End If
Next
>>631 間違えた、3で割った商じゃなくて余りね
j = Mid("111444777", i, 1)
たくさんレスありがとう
>>634 のが一番シンプルな気がするのでこれいただきます。
>>633 そのとおり
練習で作ってみてるんだがエスパー力に驚嘆
( x - 1 ) mod stepNum + minNum 例えば0123456789を3ずつカウントアップすると000333666になる
>>637 何故馬鹿は聞かれてもいない事をこたえてしまえのかw
>>635 1-9, 3毎, ブロック
こんだけあれば可能性として浮かぶよ
ブックAのUserFormのボタンから1つ下のフォルダに入っているブックBのUserFormを起動させたいのだけど、 ネットで探した「Application.run Thisworkbook.path & "\〜\ブックB!subプロシージャ名"」というのを記載して実行させたけど、 エラーになってしまいましたが、これはどこが悪いのでしょう…
>>641 パス、プロシージャ名、引数のどれかが間違ってる
>>643 .xlsm!〜でもやってみたのですがダメでした。
ちなみに、workbook_openのプロシージャは直接subプロシージャ名を指定してもブックが開く時には通るって考えでいいんですよね?
>>646 application.run 'thisworkbook.path & "ブックB.xlsm'!subプロシージャ"
って書けばいいのでしょうか?
>>648 先頭のシングルコーテーションは&演算子で結合する
application.run 'フルパス'!プロシージャ名
という形になるようにする
>>649 やってみます!
ありがとうございます。
>>649 シングルクォーテーションにしたら…コメントアウトになりません?
…今気がついたけど…
>>649 すみません、自分の早合点でした。
"'" &でやればシングルクォーテーション使えましたね…
スレチですまん。 俺はVBAをやってるが上司から言われました。(うちの部署、10名のうち、VBAを作れる人は二人だけ、、、) AIが集計をしてくれるからEXCELは必要ない時代が来るねと言ってた。 反論出来る?
まぁAIが台頭してくる頃にはその上司は居ないだろうからスルーでいいんじゃない? それかそのAIの設定?は誰がやるんだよっ! そんな事も分からん様なヤツの方が必要なくない?ってw
AI以前に、最近のDXの流れでシステムが合理化されていって、VBAでやってるような無意味な業務自体が消滅するのが先だろうね
○データフロー中に存在する、辻褄合わせのためのデータ加工 →業務フローの見直し、システムの改善、ETLツールの導入等により脱VBA ○ルールベースで実施可能な、機械的な意思決定のためのレポート作成 →完全な自動化により脱VBA ○ルールベースでは困難な、人間的判断を必要とする意思決定のためのレポート作成 →BIツール等に置き換えて脱VBA AIを使うとしたらこの3番目だけど、そこまでいく前にやるべきことはいくらでもある それをやり尽くしてAIの導入を検討する頃にはVBAなんかとっくに無くなってるはずだから、VBAとAIが直接競合することなんて無いよ
VBAが必要ないじゃなくて、EXCELが必要なくなるだからな 人間が介在する限り、なんらかのUIは必要なわけで、AIとEXCELはまったく競合しないわな
昔のSFみたいに透明なパイプを空飛ぶ車が走ったりロボットが何でもやってくれる世界を想像しているようなもんだろ 残念ながら現実は違ったよな
構文ミスって無限ループが発生した時にエクセルが固まるやつはなんか対策ないんか?
>>662 Esc連打したり他のウィンドウをアクティブにしたりを繰り返してみる
>>661 交通事故をなくすには車を隔離してパイプの中を走らせるのが一番
ただしあと300年かかる
>>664 低学歴がPythonやっても仕事無いぞ
いつかはExcelもPCも必要なくなる時代は来るだろうけど今は必要だからな。データ管理する以上はExcel、Accessは最後まで残りそうだけどな。 将来的に事務職がなくなれば、事務管理してる上司もいらないから、新しい仕事探したほうがいいね Pythonだけ出来ても仕事ないよ
学校で奨励されたためにVBAエキスパートを受験しようと思いましたが、仮にスタンダードまで合格すれば理解度はどの程度にまで到達するのでしょうか?
その時点で世の中の自称VBAプロの半数以上よりは上だと思う 世の中のVBA使いのレベルは想像を絶するほど低いから、 少しでも何が役に立つもの作れるようになったら「VBAを使いこなせます」と言っちゃっていいよ
エキスパート持ってるけどやっぱり試験用の知識って感じだよ つまらん関数の引数とか PC環境あれば簡単に確認できるものを暗記でやる感じ
VBAエキスパートなんかあるのか・・。 VBエキスパートではなく。 トランスフォーマー検定じゃなくて、 トランスフォーマーガム検定みたいな感じか? 違うか。
A列で適当な色でフィルターをかけて、B列の可視セルをC列の値✕D列の値にする場合はどうすれば良いでしょうか。 for each in specialcells(xlCellTypeVisible) b.value=c.value*d.value next にしていますが、データ2000くらいあるとと遅いです。 b.specialcells(xlCellTypeVisible).value=を用いれば早くなりそうですが、よく分かりません。 分かる方いましたら教えて下さい。
何だそりゃww 可視セル以外は計算しちゃいけないのか? 計算してもいいなら、全部配列に入れて計算しちゃえば?
>>677 早速の返信ありがとうございます。
可視セル以外は変更してはだめなんです。
後だしになるんですが、黒でフィルターしたらC✕D、白ならC-Dと処理が違うためです。
>>676 B列にはじめから計算式入れとけば良いんじゃ
>>678 フィルタいらなくない?
色で計算変えればいいだけじゃない?
質問失礼します。 vbaからc++のdllへ引数を渡してc++で処理し、配列をvba側に返したいです。 引数で渡すものは、配列ではありません。 文字列や数値をvbaで受け取ることは出来るのですが、配列はどのようにc++から受け取れば良いのでしょうか? お願いします。
>>679 >>680 ボタンを押した時だけ変更するようにしたいので、式を入れるのは難しいかと思います。
またまた後だしになるんですが、他にも色々ボタンを配置して、このボタンを押すとB=Cとしたり、こっちのボタンを押すとB=1.1*Dという感じにしています。
>>682 だからボタン押した時色によって計算変えればいいじゃないかと
>>682 色以外にフィルタをかけられる要素は無いの?
あるなら、一旦解除して配列に入れて、該当行だけ計算して、またセルに戻して再度フィルタ。
>>681 普通に受け取れると思うけど。
ByRef的に受け取るの?
>>676 for eachループを
range(cells(2,2),cells(10000,2).end(xlup)).specialcells(略).formula="=C2*D2"
>>687 こんなとこでハゲ友おっさんずラブっすかw
>>671 昔、某掲示板で質問してた奴が、欲張らずに基礎からやった方が良いと言われてエキスパート持ってるんですけどねと言ってた人がいた。
そんな感じかな。
vbaスタンダードの教材の目次見たけど基礎というか普通に初心者向けという感じがした 逆にこういう内容飛ばしてどうやって使ってるんだろう
基礎からやるの、良いと思うけどな。 基礎を無視した俺は、ADOもWinAPIもUiAutomationも使えるが、 プロシージャの意味を20年くらい知らなかったぞ。
「置換したい文字列」と「置換文字」を変数として扱って、全体の文字を出力することはできませんか? Replace関数では、Replace(文字列, 検索文字, 置換文字)とありますが、 文字列の入った変数を第一引数に与えるエラーが出てしまいます。 最終的な目的として、エクセルで定型的なHTMLコードを出力したいのです。 何かよい策がありましたら教えてください。 Sub 企業情報コピーテスト() Dim i As Long Dim s1 As String Dim excelldata1 As String Dim excelldata2 As String .... s1 = HtmlSorce.Cells(2, 2).Value '企業名 excelldata1 = Sheet1.Cells(4, 4).Value '資本金 excelldata2 = Sheet1.Cells(5, 4).Value Replace(s1,"tabledata1", excelldata1) Debug.Print (s1) End Sub
■HtmlSorce.Cells(2, 2)に入っているデータ■ <table width="100%" cellspacing="0" cellpadding="0"> <tbody> <tr> <td>企業名</td> <td> tabledata1 </td> </tr> <tr> <td>資本金</td> <td> tabledata2 </td> </tr> .... </tbody></table> /////////////////////////////// こんな感じです。どうぞよろしくお願いいたします。
>>694 関数の結果を入れる変数が抜けてる
コートは精査してないけど、とりあえずこれでいいんじゃね?
s1 = Replace(s1, "tabledata1", excelldata1)
すいません。できた 私はあほでした。 s1 = Replace(s1,"tabledata1", excelldata1) で出力できました。
レンダリングエンジンとしてExcelを使ってるの? つらすぎるなそれは
使ってるかどうかは、これだけじゃ判断できない 可能性はあるけど断言はできないから
わたくしのことですか?? コーディングは、いつもAtom使って手打ちしてるよ。 ただ、定期的にエクセルで入稿してくる案件があるので、 毎回エクセルからデータを手作業でコピペするのがしんどくて コピペミスもあるし。 VBAでまるっとタグが出力できればいいなと。 他に良い方法がみあたらないし、これがベストかと。 思ってるとこでし。
Atomとか久しぶりに聞いたな VSCodeに完全敗北して利用者がほとんど乗り換えた挙げ句に開発元がMSに買収されて完全に開発も終わった死んだエディタだよ
そんなこといわなくても、、、 web系は、sublimetext か Atom が多いと思う。まれに秀丸さんもいるお。
ここらへんにいらっしゃるかたは R列が何番目か直ぐに頭にでてくるのかしらん。 セル選択したら、行列番号がすぐわかる表示設定あるといいですねえ。
いつの話だよ Web系のAtomユーザーはほとんどVSCodeに乗り換えたよ
>>707 言ってることがよくわからんけど↓みたいにVBEでコンソール出力するのは駄目なの?
?Selection.Item(1).Row & ", " & Selection.Item(1).Column
いろいろ提案ありがとうございます。 普通に対応表を手元においときます。
>>707 A1とR1C1表示を切り替えられるショートカット作った
>>707 機能はいらんかな。見たくなったらcolumn()入れてる
俺も=Column()入れてるわ。 ていうかね、何でどっちか片方だけなんだよ。 A(1)、B(2)とか両方表示するモード付けりゃいいのに。
>>717 おーそれいいね
ややこしかったらツールチップみたいに、ポイントした時に出てくるとかでも良い
indirectやVBAで古いデータを整備する時にたまに必要になる
1行目1列目にランダムに数字が入力されている表において、その数字を上から順番に足して2列目にその合計を表示させるにはどう書けばいいでしょうか?(下みたいな感じで) 1列目 2列目 -------------------- 4 4 7 11 8 19 12 31 15 46 2 48
上から順番に足して2列目にその合計を表示させればいいですよ
for i = 1to10 v=v+cel(i,1) cel (i,2)=v next みたいな感じ?
Ruby で作った nums = <<"EOT".lines( chomp: true ).map( &:to_i ) # 数字の配列。改行は削除 4 7 8 12 15 2 EOT totals = nums.each_with_object( [ 0 ] ) { |num, ary| ary.push( ary.last + num ) } totals.shift # 先頭要素の0 を削除する p totals #=> [4, 11, 19, 31, 46, 48]
>>722 Sub sample1()
Dim i Range
Range("B1") = Range("A1")
For i = 2 To 6
Cells(i, 2) = Cells(i - 1, 2) + Cells(i, 1)
Next i
end sub
A列が不特定多数で出力の速さを求めるのなら
Sub sample2()
Dim i Range,j Range
j = WorksheetFunction.Count(Range("A:A"))
Application.ScreenUpdating = False
Range("B1") = Range("A1")
For i = 2 To j
Cells(i, 2) = Cells(i - 1, 2) + Cells(i, 1)
Next i
Application.ScreenUpdating = True
end sub
間違えた Sub sample1() Dim i As Long Range("B1") = Range("A1") For i = 2 To 6 Cells(i, 2) = Cells(i - 1, 2) + Cells(i, 1) Next i end sub A列が不特定多数で出力の速さを求めるのなら Sub sample2() Dim i As Long,j As Long j = WorksheetFunction.Count(Range("A:A")) Application.ScreenUpdating = False Range("B1") = Range("A1") For i = 2 To j Cells(i, 2) = Cells(i - 1, 2) + Cells(i, 1) Next i Application.ScreenUpdating = True end sub
>>707 VBEのメニュー上にテキストボックス作って数値とアルファベット相互変換する奴作れば。
>>722 Range("B1:B10").Value="=SUM($A$1:$A1)"
'関数残したくなければ下を追加
Range("B1:B10").Value=Range("B1:B10").Value
マクロ実行ブックと同じフォルダ内にある"CCT"というブックに 1つのシートがあって、そのシートをマクロ実行ブックの"CCT1"に貼り付けたいのですが "CCT"内のシート名が毎回変わってしまうので、変わってもコピペができるマクロをおしえてください Workbooks.Open ThisWorkbook.Path & "\CCT", ReadOnly:=True Sheets("*").Cells.Copy ThisWorkbook.Sheets("CCT1").[A1] ActiveWindow.Close savechanges:=False
>>736 普通はCells(i, j)を使うから
>>737 Worksheets(1)じゃ駄目なん?
>>738 まさかと思うけど、F1~X1のセルの処理を
For C = 6 To 24 ' F列からX列
~.Cells(1, C).~
Next
みたいにコーディングしてるの?
vbaを勉強してるのですが、specialcellsとusedrangeの違いが分からないのですが、どんな時に使い分けるのですか?
>>740 そんなものは内容による。
Range("C1")のような表現よりも数学的、座標的表現であるCellsの方を使うことの方が多いと言ってる。
>>737 シート名かシートの順番を固定しないと無理
>>741 specialcellsは選択範囲から取得される
usedrangeは選択範囲関係なくシート全体から取得される
>>744 シート1つしか無いと思う。
文が曖昧だから必ずそうとは言えないが。
>>740 列方向だけに伸ばす事は少ないけど、
for k = 1 to 3
for i = 1 to 最終行
cells(i,k)
next
next
みたいに二重ループにすることはたまによくあるよ
>>737 シートが1枚しか無いならブック開いてからアクティブシート取得すればいいのでは
>>748 ならなんの問題もないな
>>749 お前の周りの話だよね?
>>750 いや、その例で
for k = 1 to 3 ' A列~C列
って書いてるってことね
Rubyなら一行で書ける程度の事をVBAは面倒だね
俺はCells派 任意のセル範囲内での位置座標を相対指定できてめちゃくちゃ便利 Cells(i)もCells(i, j)もよくつかうしSelection.Cells〜とかよくやる
>>741 SpeciallCellsのほうはユーザー定義関数で使うと不具合あったはず
>>740 RangeをVariantに代入して
For c = 1 To Ubound(Variant)
Variant(1,c)...
が一番楽
だけどRangeが1セルだけの場合上手く代入できない気がする
>>762 >>740 いや、だからさ、
>>735 みたいにしたりするし、その時によるんだよ。
行、列共に多少なりとも組める奴ならアルファベットでアクセスすることは少ないというだけ。
http://officetanaka.net/excel/vba/tips/tips38.htm Sub Sample1()
Dim RE, strPattern As String, r As Range
Set RE = CreateObject("VBScript.RegExp")
strPattern = "SUM\("
With RE
.Pattern = strPattern ''検索パターンを設定
.IgnoreCase = True ''大文字と小文字を区別しない
.Global = True ''文字列全体を検索
For Each r In ActiveSheet.UsedRange
If .Test(r.Formula) Then r.Interior.ColorIndex = 3
Next r
End With
Set RE = Nothing
End Sub
このソースのDim REの部分ってこのサブルーチンだけを動かすようなマクロの場合いらなくね?
>>764 間違えたdimでRE変数宣言するのいらなくない?
それとは別の話でset RE nothingはこのサブルーチンしか動かさない場合は必要なくない?
>>765 変数そのものがなくても良いって話なのか、宣言がいらないって話なのか?
まあどっちもやりようによってイエスだが、それが推奨されるかは別の話
>>766 プログラム的に何か考慮してるのか聞きたい
プロジェクトでどうするべきか見たいなところは興味ない
vbaの設計的にはSet RE = CreateObject("VBScript.RegExp") これだけで初期化できてるからdimで宣言する必要があるのかコンピューターサイエンスサイドの意味で聞きたい
>>768 モジュールレベルで変数宣言を強制している場合にはプロシージャ内のDimで宣言していないとコンパイルエラーになる
型指定なしのDim宣言ってのは実際にはVariant型変数の宣言なので、代入時に型評価をしているだけだけどね
RegExp型のメモリ領域をDim宣言時に確保するとなると参照設定が必要でそれはそれでまた別の問題が生じる
クラスモジュールを使ってオブジェクト指向(厳密には違うらしいですが…)を理解したいと思っています Newでオブジェクト生成して、get set letを使いながらプログラムを書くという認識で合っているでしょうか?
>>771 モジュールレベルで変数宣言を強制している場合には必要なのね、ありがとう良くわかった。
set RE = nothingなんだけどこのサブルーチン実行完了したらメモリとか解放されるからnothingやらなくてもスタック領域占有しないと思ってるんだけど実際のところどうなの?そもそも"VBScript.RegExp"の占有ってスタック領域であってる?
そもそもVBAのこの
>>774 教えてよ知ってるなら質問してたからこれも
実際に正常終了する前提ならset RE = nothingしなくてもメモリリーク起きないのか知りたい
>>777 やるけど"VBScript.RegExp"の占有領域はスタックかどうかだけ教えて欲しい
スタックメモリだと思ってるんだけど
>>779 いやここVBA質問スレだよね?
その姿勢は本分を果たしてなくないか
アインシュタイン「6歳の子供に説明できなければ、理解したとは言えない。」
CreateObject("VBScript.RegExp") VBScript のオブジェクトを作っているのだろ。 別のプロセスか、DLL から作っているのだろ とても、スタックとは思えない
そもそも占有領域とはなにを指しているのか VBAのローカル変数はスタックにとられる それ以上はそのオブジェクト次第
>>773 VBScriptの正規表現オブジェクトはIE付属のエンジンだからヒープにインスタンス作成してるだろうし、参照カウンタ0になったら自動破棄されてるんじゃないの
このサブルーチンからの参照がなくなっても別の参照が発生してたらインスタンスは残るでしょ
だから、このサブルーチンが正常終了するかどうかとメモリリークが起きるかどうかは別問題だと思う
サブルーチン外に制御が渡った段階でこの正規表現オブジェクトがどこかのプロセスによって参照されていて、そっちの制御フローの中に猛烈なメモリ負荷が発生する処理が存在すれば、メモリリークの原因になりうる
execループで空文字をマッチさせていてindexが進まずに無限ループしたりとかね
それと、あなたの認識通り、End Subでスタック内のローカル変数のアドレス空間自体が解放されるので、End Subの直前にこの変数SEにNothingを代入する理由はない
モジュールレベルの変数やグローバル変数を使う場合は逆に、制御フロー上の要求としてサブルーチン終了時に参照アドレスをクリアしなければならない場合もある
Windows10で、SetLayeredWindowAttributesのLWA_COLORKEYを正常動作させる方法ある? Windows7でやる方法は知ってるので、7の場合の回答は不要。
with cells(i,j) .cut .offset(1,0) .value=k end with cells(i,j)にkが入らず、cells(i+1,j)にkが入るんだけど仕様?
>>790 普通に
Cells(i, j).Value = k
では駄目なのか?
>>790 cut貼り付けでセルそのものが移動してるから
>>791 >>792 仕様なんですね
ありがとうございます
仕様というか、代入先を自分で変えてることは伝わってるんだろうか
>>790 仕様ではなくて君のコードの動作の問題
同じ綴りのオブジェクト式の記述をまとめる文法ルールとしてWithを理解するのは大きな間違い
Withで任意のセルを取得して和のセルに貼り付けたらEnd Withまでずっと貼り付けられた先のセルを参照する
その状態で.Valueに値を代入したら、当然貼り付けられたセルの値が変わる
With Cells(i, j)
.Cut .Offset(1,0)
End With
Cells(i, j).Value = k
とすれば何の問題もない
>>795 わかってて聞いてるんでしょ
わかってなきゃわざわざ「仕様?」なんて聞き方しないだろうし
With で参照してるセルを変更した時の挙動を書いてるドキュメントは見たことないから仕様かどうかはよくわからん
誰か見たことある人いる?
>>790 仕様
cut後もcells()で返ってくるオブジェクトは同じ
そういや上書きされるcells()はどうなるのか、と試してみたらnothingになっていた
この辺はExcelのカットアンドペーストなどでおなじみだけど、いざやってみると不思議な気分だ
Sub foo()
i = 2
j = 3
k = "k-"
Set before = Cells(3, 3)
With Cells(i, j)
.Cut .Offset(1, 0)
.Value = k
End With
Debug.Print before.Value
End Sub
>>799 不思議でも何でもない
変数によるオブジェクト参照の仕組みをもっと正確に理解すべきだろ
カットは貼り付け先のセルの削除と貼り付け元のセルの埋め込みを伴う処理だぞ
貼り付けを行った段階で、変数のスタックに格納されていた貼り付け先のセルのポインタが無効になるので、貼り付け後に変数の中身を評価するとNothingになるだけ
セルの仕様ではなくオブジェクト参照の仕組みからして当然
しかし、VBAをやり始めたら仕事がはかどるな 面倒くさい勤務表の処理もマクロで一発やからな
VBAで劇的に工数削減できるような単価の低そうな仕事をしているのなら、 今の仕事の効率化なんかよりプログラミングに習熟してITエンジニアに転職したほうが金を稼げるのではないだろうか
>>803 そのやりかたは?
フリーランサーになればたくさん稼げる?
在宅ワークも可?
>>803 >>804
ここで回答するのもアレだが
VBAは基本的に常駐で保守のゴツイ仕事のみ。仕事自体が少なく稼げない。稼ぐなら別のプログラム言語の方が良い。
在宅の案件は更に無い。ゼロと思ったほうが良い(web業者がついでにAccessのVBAをメンテする、といった事例は聞いたことがある)
VBAはマクロ記録も出来るし、やりたいことをちょいググればいくらでもサンプルコード載ってるからね
Excel VBA限定の話だろそれ Outlook とかWordとかPPTのVBAだと途端に情報集めの難易度が上がる Access VBAは衰退傾向だし
>>789 動作しなくなったの?
あらためて試して無いから分からんけど。
>>807 そういうレベルの話してるから安い話になるんじゃないの?
ググってすぐどうにかなることなんて殆ど無い。
というかググって答えが見つからないことは多い。
>>811 そんなレベルの低い話はしてないんだがw
>>789 というか、それってExcelそのものに対して透明化したいって話?
それは某掲示板で話題になってWindows10から出来ないみたいな話を聞いたような。
>>809 正常動作しなくなったのは7の時点だけど、その時はAeroを切ってどうにか切り抜けた。
しかし10はどうしたものかなと。
LWA_ALPHAの方は全く問題ないんだけど。
複数のPCで確認したから、おま環ではないと思う。
>>814 透明化したいのはExcelそのもの。
結構便利なんだよ。
ウインドウを2枚重ねても、奥側のウインドウを操作できるから。
使えなくなったのか 大昔ハマって透明アプリばっかり作ってた記憶
>>817 使えないっていうか、変な動作をするんだよ。
ThisWorkbook.Application.Hwndでハンドル取ってるのに、
なぜか最初に配置したコマンドボタンのキャプションだけが透過するとか。
>>816 透過はするけど透明にならないんだろ。
無理矢理やる方法は思い付いたけど試して無い。
ググったらサンプルコードが見つかるんじゃなかったのか?
初歩的な質問ですみません 標準モジュールとユーザーフォームでプログラムを書いています 1つのモジュール内にプロシージャが沢山あり、読みにくくなってしまいました 本を読むとクラスモジュールでプログラムが読みやすくなると書いてありました どのような時にクラスモジュールを使ったらプログラムは読みやすく出来ますか? サブルーチンやForNext,if等の繰り返し使うものはクラスモジュールを使った方がいいでしょうか?
>>824 そんなことをここで聞くような人には無理
>>825 わかりました
もっと勉強してきます
失礼しました
ぶしつけで恐縮ですが、シート内の改行を一気に削除する方法を教えていただけないでしょうか。 cellsで指定してreplaceメソッドってやってもできないので、誰かよろしくお願い申し上げます。
新しいシート作って改行をl削除したデータをコピーすればいいんじゃないかな
Dim R As Range For Each R In ActiveSheet.UsedRange R = Replace(R, vbCr, "") R = Replace(R, vbLf, "") Next あるいは Cells.Replace What:=vbCr, Replacement:="" Cells.Replace What:=vbLf, Replacement:=""
>>827 VBAスレなんで余談だけど
VBAでやるんなら
>>829 手動なら検索窓に「ctrl+J」を入れて全て置換って方法もある
いちおう説明 excel内の改行コードはLFが基本らしいんだけど マクロ使ったりでCRLFも入力出来るらしい なのでCRとLFで分けて処理させてみた
>>824 クラスモジュールというのはユーザーが独自にメソッドやプロパティ、イベントを定義して使えるオブジェクトのことで、本質的にはユーザーフォームと変わらない設計とコーディングに結構手間がかかる
オブジェクト化によるカプセル化がどうしても必要なら試してもいいが、肥大化したモジュールのコードの可読性改善くらいの目的であればやらない方がいいかもしれない
クラス内に定義された関数を呼び出すにも、そのクラスの型をもつ変数を宣言してインスタンスを生成してメソッドを呼び出なければならなくなるのでね
モジュールがごちゃごちゃして嫌なら、モジュールに記載している関数を機能カテゴリに分類して、各機能カテゴリごとモジュールを分ければいいんじゃないのかな
文字列操作系、メール送信機能系、メッセージダイアログ系、みたいな感じの切り分けで
>>833 ありがとうございます
おっしゃる通りで今問題なく動くプログラムをわざわざ変える必要は無いですね
まずはモジュールを分けるところから始めてみます
今後プログラムを作る際の参考にさせていただきます
シートやセルと変数の定義が重複するようなときに一カ所まとめられて便利
>>788 ヒープエリアに展開されるのはその通りだけど
VBAにガベージコレクションの概念は無いよ
>>837 なにをガベージコレクションと言ってるのかわからんけど、VBAはCOM扱ってるから参照カウンタは使ってるよ
まあCOMをVBAの機能と言うかについてはいろんな意見があるだろうけど
>>837 参照追跡方式の本当のガベコレは利用できないけどCOM標準の参照カウンタ方式のリソース管理システムはバックグラウンドで使ってるだろ
循環参照が発生してるとリソース解放できないやつね
A列の値が「ア行」、B列の値が「あいうえお」のうちどれかであればC列を赤く塗り、 同じく「カ行」で「かきくけこ」のうちどれかであれば青く塗る、というような処理をしたくて 以下のようにしたところ一応うまくいったのですが、 「ア行 and あ」or「ア行 and い」or …… というような複数条件の書き方はこれであっているのでしょうか? If InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "い") > 0 Or InStr(Range("B2").Value, "う") > 0 Or InStr(Range("B2").Value, "え") > 0 Or InStr(Range("B2").Value, "お") > 0 Then Range("C2").Interior.Color = RGB(255, 0, 0) ElseIf InStr(Range("A2").Value, "カ行") > 0 And InStr(Range("B2").Value, "か") > 0 Or InStr(Range("B2").Value, "き") > 0 Or InStr(Range("B2").Value, "く") > 0 Or InStr(Range("B2").Value, "け") > 0 Or InStr(Range("B2").Value, "こ") > 0 Then Range("C2").Interior.Color = RGB(0, 0, 255)
>>843 間違ってる
AndとORは左側からの計算になるんで
false and false or true …がtrueになる
Or の連続部分を括弧で囲まないといけない
>>843 > 「ア行 and あ」or「ア行 and い」or ……
> というような複数条件の書き方はこれであっているのでしょうか?
ダメ
AndよりOrの方が優先順位が低いので
InStr(Range("A2").Value, "ア行") > 0
And InStr(Range("B2").Value, "あ") > 0
Or InStr(Range("B2").Value, "い") > 0
Or InStr(Range("B2").Value, "う") > 0
Or InStr(Range("B2").Value, "え") > 0
Or InStr(Range("B2").Value, "お") > 0
は
(InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0)
Or InStr(Range("B2").Value, "い") > 0
Or InStr(Range("B2").Value, "う") > 0
Or InStr(Range("B2").Value, "え") > 0
Or InStr(Range("B2").Value, "お") > 0
のように解釈される
なのでA2が "ア行" でなくてもB2が "い" だと成立しちゃう
詳しくは
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/operator-precedence を見て
>>843 そもそも
> A列の値が「ア行」
と言うなら
Range("A2").Value = "ア行"
と書けばいい
InStr(Range("A2").Value, "ア行") > 0
だとA2が "マレーシア行きのバスはここから出ます" でも成立しちゃうけどそれはいいのか?
あらそうだったんですね。ということは InStr(Range("A2").Value, "ア行") > 0 And (InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "お") > 0) Then という感じにすればいいんでしょうか?
>>845 の左順って間違いだったは
変更はそれでOK
ああなるほど。文言は固定でかぶってる言葉がなかったので大丈夫だったんだと思います すでにあった文言の組み合わせの違うVBAをいじったもんですからそれを大枠はそれをそのまま 使ったんですけどそう言われればそうですね
If Range("A2").Value = "ア行" And (InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "お") > 0) Then Elseif Range("A2").Value = "カ行" And (InStr(Range("B2").Value, "か") > 0 Or InStr(Range("B2").Value, "こ") > 0) Then こうでしょうか?
もいちょい頑張って正規表現使ったらいいんじゃないでしょうか
正規表現だと If Range("A2").Value = "ア行" And (Range("B2").Value Like "[あ, い, う, え, お]" Then これであってますか?
>>853 厳密には"[あ-お]"または"[あいうえお]"
それだと,でも反応する
簡略化するためにあいうえおを使いましたが、実際は2〜10文字程度の文字列なので、 And (Range("B2").Value Like "東京|大阪|名古屋" Then こうすればいいのかな?
確かにただ | を使っただけでは反応しませんね とりあえずOrいっぱい使って直します、ありがとうございました
TestメソッドがTrueを返してきたら処理するって形にすればいい
質問スレなんだから構わないだろ 気に入らないなら無視しとけアホ
他人が作ったマクロなんて読みづらいに決まってんじゃん… 今更グダグダ言ってもあとの祭りさ。
自分が作ったマクロもだぞ 数年前どころか一ヶ月もするとわからなくて四苦八苦することがある
プログラミングの実習で教授が言ってたわ 明日の自分は他人だから、いつでも他人が見てもわかるように書けって
>>868 昨日の昼飯がなにか?なんて思い出せなくなりました…
>>869 ボケがはじまっているのでわ?
アルツハイマーだとやっかいですよ
>>870 ビタミン剤をしこたま飲んでるんですけど、やっぱりだめですかね…
>>867 集中してるとそこまで対処してるか!みたいなのが書ける時があって
後から見てなんでこんなのあるんだ?って思うことがある
同じことやろうと思っても出来なかったり
だから自分に対してのコメント必須だわ
昨日の自分は今日の敵 今日の自分は明日の(自分にとっての)敵
>>819 >>832 もうちょっと調べてみたが、
種類に関係なく、最初に配置したオブジェクトだけが透過することがわかった。
しかも、コマンドボタンは常時透過するが、
テキストボックスとラベルは、アクティブになっている時だけ透過するっていう。
だから、どでかいコマンドボタンに特大フォントで■(四角)を書くとか、
本当に無理矢理やろうと思えば出来るんだろうけど、それはちょっとねぇ・・・。
VBAでChromeのタブブラウザを思い通りに操作することってできます? IEのタブブラウザも思い通りに操作する方法も知りたいけど。
Seleniumでもタブ操作は無理だから無理なんじゃねーの
Ruby で、Selenium Webdriver を使っているけど、タブ移動は出来る! url_0 = "URL 0" url_1 = "URL 1" driver.navigate.to url_0 # url_0 を開く driver.execute_script( "window.open()" ) # 新しいタブを開く driver.switch_to.window( driver.window_handles.last ) # 新しいタブへ移動する driver.navigate.to url_1 # url_1 を開く all_handles = driver.window_handles # すべてのタブ driver.switch_to.window( all_handles[ 0 ] ) # url_0 へ移動する
driver.execute_script( "window.open()" ) # 新しいタブを開く driver.execute_script で、JavaScript のソースコードを書ける
>>874 以前の挙動ってセル罫線は見えるけどセル自体は透過して、下への入力が出来るというものだった記憶があるんだけど、そういう動作を望んでるってことだよね。
単純にセル範囲全体、もしくは部分を完全透過するって意味じゃ無いよね。
セル範囲、もしくは部分を完全透過して下へ入力出来るっていうのなら簡単に実現出来ると思う。
試して無いけど。
>>879 そう。
SetLayeredWindowAttributesではなく、違う発想でやるってこと?
>>880 SetLayeredWindowAttributesは多分無理だと思う。
使ったことないけどUpdateLayeredWindowも同じかな?
この種のAPIは諦めて、リージョン使ってウィンドウの形状をくり抜いた形に変形する方法を使って出来たけど、色指定とかも出来ないし、くり抜いた部分は問答無用で透過する。
当然、罫線も透過する。
それからブックのウィンドウを移動すると元に戻る。
こっちはサブクラスでどうにか出来なかったかな。
くり抜く部分は右端列、下端行の見切れる所を正確に取得するのが面倒くさい。
指定セル範囲なら簡単なんだけど。
元々、無理矢理やろうとしてたのは半透明にしてその描画をメモリに取得してから完全透明にして、デスクトップに取得した描画を書き込むことを考えたけど、再描画で無茶苦茶チラつきそうで断念した。
ググレばサンプルや答えが見つかるとか言ってた奴がいたけど、ググってどうにかなるようなレベルの低いものは、問題にすらならないわけでね。 わざわざ覚えるようなことをしてないだけでググレば答えが見つかるのが分かってるんだよ。 一方、問題になるようなレベルの高いものはググっても答えが見つかることは殆ど無いわけだ。
最近独学ではじめたんだがググっても出ないから質問させてくれ if の条件式をセルから読み取ることできない? 例えば セルA1に1+1=2って入力してあって VBAで if cells(1,1).value then end if 的なことを実行したいんだが・・・
if Application.Evaluate(cells(1,1).value) then end if は?
>>886 すまん例がわるかった
セルになんでもいいから条件式が入力されてて
それをVBAのif文で読み取りたい
>>888 ありがとうございます。やってみます。
>>889 数式の結果が欲しいだけなら
Cells(R, C).Value
>>885 そのコードで読み取れるが、=1+1=2と入れてるなら常にTrueにしかならないと思うぞ
コードで条件指定するんじゃなくて セルに条件書いてそれで判定したいって事だよね
文字列(1+2)*3を計算して数値にしてくれる方法ないかね
>>894 試してないけどevaluateで出来るんじゃないか?
Cells(1,1).Textでは数式読み取れなかったっけ
>>897 表示されてるものを表示形式通りに取得するやつ
Range("A1").Formula = "=(1+2)*3"
転記マクロを作っていて、AのブックからBのブックに転記をしようと考えているのですが Aの転記する部分を一旦構造体に全部取り込んでしまってからBブックを開いて転記する方法と AとBのブックをその都度比較して転記するかで悩んでいます どっちの方がいいんでしょうか?
オブジェ.pastespecial(xlpaste〇〇) オブジェ.pastespecial paste := xlpaste〇〇 これ何が違うの? 前者は戻り値はカッコをつけるっていうルールに従ってなくね?
>>903 前者はメソッドが返す戻り値を取得するために関数としてメソッドを使用している
文法上、引数指定の箇所で括弧が必要
後者はメソッドをコールしてそのまま次の処理に制御を渡している
引数指定の箇所には文法上括弧が不要
>>904 関数とメゾットの違いって何?
pastespecialってメゾットじゃないの?
pastespecial xlpaste〇〇 これでも行けた… pastespecialメゾットの戻り値ってなんだ? x = オブジェ.pastespecial(xlpaste〇〇) こんなの使うときあるの? pastespecialの戻り値を使う意味が全くわからない If MsgBox("実行しますか?", vbYesNo) = vbNo Then これは戻り値がTRUEかfalseだから意味がわかるけど
>>903 オブジェ→オブジェクト
Selection.PasteSpecial Paste:=xlPasteValues
Selection.PasteSpecial(xlPasteValues)
そういう文法。
前者のメリットは指定できる引数が大量にある時、一つだけ記述することができる上に見やすい
ただ、「:=」のコロンを見落としやすいのがネック
引数が一つだけの時は前者で書く理由はないと思う
>>905 メゾット→メソッド
メソッド=クラス内関数
ただ、vbaなんて全部applicationクラス(と思う)から、関数は全てメソッドに当たりそう
pastespecialはメソッドで間違いない
>>906 >こんなの使うときあるの?
>pastespecialの戻り値を使う意味が全くわからない
そもそも使わないから返り値なんてなんでも良い
俺も使った事無いけど、あえて返すとすればペーストの失敗か成功なのは間違いないだろう
>>905 メゾットではなくメソッド(Method)ね
PasteSpecialはメソッドだよ
関数の定義は曖昧だが、ここでは制御と戻り値を返す命令文の意味で使っている
一方メソッドはオブジェクト外からアクセス可能になるようメンバとして実装された機能プログラムのことを指す
戻り値を返すものと返さないものの両方がある
>>907 あんまわからないけど
endプロパティは
end(xlup)これ以外に書く方法ってある?
end shift :=xlupとかそんなのでもいけそうな感じするけど
>>907 細かい話だが、VB6共通の標準関数やステートメント類、列挙定数はApplicationクラス配下のメンバではないはず
あと調べていけばApplicationクラスから独立しているクラスもあるかもしれない
プログラム本体をコードする言語ではなくマクロ言語なのでApplicationというカレントなインスタンスに依存しないクラスがあってもおかしくない
>>903 ,906
引数の指定方法が、位置指定か名前付き引数指定かの違い
戻り値使わないときでも引数の指定に括弧を付けても問題ない
>>905 関数とメソッドの違いはあいまい
ヘルプ類見る限り、VBA組み込みのメソッドを関数と呼んでるっぽい
一般的にはそれ以外のオブジェクトのメソッドも関数と呼ばれたりする
PasteSpecialの戻り値は俺も使ったことないからよくわからんな
まあ戻り値があるからといって、必ず使わなければいけないというもんでもない
>>911 上級者になりたいなら分からない言葉を自分で調べてキャッチアップする姿勢も必要
メンバとかは初心者向けの解説書やネット記事にも載ってる
PasteSpecialの戻り値が何なのか知らないけど、 範囲だったら使い道があるんじゃないの。 貼り付けた後に、そのまま書式を変更するとかさ。
>>909 名前付き引数で指定するなら
.End(Direction:=xlUp)
って書ける
>>916 なんでカッコがいるんだ…
end direction :=xlupじゃダメなのか…
こういうのって気にする人いる?
エラー出たらかっこつけるとかメソット、プロパティの引数指定にはとりあえずかっこつけるとかしてる?
>>909 >>917
今回はプロパティ。さっきのはメソッド
vbaは見た目が一緒だから死ぬほどややこしいけど、まぁいつも通りに書いてればいいよ
俺もendはメソッドと思ってたけど問題なかったし
>>910 そうそう、その辺り考え出すとまぁ例外もあるよな〜って思ってたけどアホらしくなって考えるのを止めた
>>911 このレベルの事を聞きたいなら最低限クラスは覚えないとついていけないぞ
ただそれを理解すれば一気にレベルアップする
実際、クラスを自作すると、プロパティとメソッドを同じように使うことも出来るから、 どっちでやりゃあいいんだ? ってなるときはある。
VBAのプロパティのアクセサやセッターも実体はただのプロジージャだからね クラス外から見たらただの関数でしかない
>>921 そこら変がちょっとキモイよなー
完全に挙動が一致してればいいんだけど、見た目が同じで処理が分かれるとなんだこれってなる
>>915 RangeオブジェクトとPasteSpecialメソッドの違いを考えたらわかる
なんかイマイチな答えしかこないな 俺は、プロパティ、メソッドで()がつく場合とつかない場合の違いは何? 全部()つけるでいいの?どう意識してるの?ってきいてる これに対してクラスガーとか言われてもわからん
>>917 プロパティの引数の括弧は省略できなかったと思う
メソッド(関数)呼び出しで、戻り値を使わない場合は括弧がなくてもいい
この辺は、大昔の文法との見た目を合わせるための仕様
慣れれば自然と使い分けれるようになるから頑張れ
>>923 RANGEもコレクションだろ
RANGE(a1)でメンバーだろ
>>924 ああ、もちろん引数指定は全部括弧つけるって自分ルールでも問題ない
正直自分でもこのへんの使い分けは感覚で、明確な基準が説明できん
>>929 俺は
名前付き引数は使わない
括弧を省略できるときは省略する
基本はこんな感じ
でもそう書かないときもある
あと複数人でソース見るときは事前にルール決めることもある
>>930 なるほど!
名前付き引数を使わないときや戻り値を使うときには()がいる
名前付き引数を使うときは:=で()不要
この認識でいい?
>>926 全然違う
RangeクラスとRangeプロパティを混同してはいけない
Range("A1")の式はWorksheetクラスのメンバのRangeプロパティを引数つきで呼び出している
このプロパティ式で参照を取得しているのが、Excelのオブジェクトモデルで定義されたRangeクラスの実体(インスタンス)、つまりA1セルになる
要するに、Range("A1").Valueと書いた場合、.Value以下がRangeオブジェクトのメンバになる
Rangeクラスがセル範囲のコレクションとして自己再帰的に実装されているのは確かだけどね
>>929 俺は
名前付き引数は使わない
括弧はなるだけ省略しない
かな。括弧なしで空白スペースは見辛い
>>931 名前付き引数と括弧の省略は別
戻り値使うなら名前付き引数でも括弧は必要
>>932 中級者ならわかるけど
初心者にはまったくわからんな
そこらへんの文法を初心者向けに解説してるサイトある?
>>931 戻り値を使う場合には()が必須、
名前付き引数を使おうが使うまいが()の要否には影響しない、
が正解
括弧つけてても名前付き引数の指定はできるので
>>935 緑川吉行っていうOffice/VBA界の有名人が初心者向けに書いた記事
https://allabout.co.jp/gm/gc/297719/ これはコンパクトで分かりやすい。ただし初心者向けにわざとSheetsをオブジェクト名とかコレクション名とか言っているのは問題がある
正確な知識を得るならこっち
インストラクターのネタ帳 -
「オブジェクト名.プロパティ」という解説はウソですよ
https://www.relief.jp/docs/excel-vba-that-is-not-object-name.html >>938 Callの引数として引数付き関数を呼び出す場合、呼び出される側の引数を特定して先に評価してCallに渡さなきゃいけないから括弧必須なんだよな
しかも戻り値が取れないという
>>939 >「オブジェクト名.プロパティ」という解説はウソですよ
あーそういやそうだな。vbaは色々省略できるから勘違いしていた
new rangeは出来ないわな
>>941 組み込みオブジェクトはそもそも仕様としてNewできなさそうだけどな
要は As ActiveCell とか As Cells とかいう型指定が出来ないってことだわ、そういうクラスが存在しないわけだから
NEWと言えば何でintegerとかstringは宣言した段階で使えるのに オブジェクト型はインスタンス化しないと使えんないの?
面倒だから integerは値型だからとかもっともらしい説明を付けることもできるが、それは結果論に過ぎない
インスタンスという概念が無いとそれが新規のオブジェクトなのか既存のオブジェクトかの見分けが付かないよ 他の言語だとstaticとかインスタンス化せずに使えるクラスもあるけどね
インスタンス化は実体化するため=メモリ領域確保するためって解釈だけど
integerだろうがstringだろうがメモリ確保してるわけだし
>>947 dim x as classtest
dim y as classtest
みたいなので見分けってつかないの?
正確に言うと値の代入もLetステートメントで行うのがBasic系言語の本来の姿 それを規約上で略記できるようにしているにすぎない 逆にSetステートメントは言語設計上、変数用に確保されたスタックメモリに格納される値がヒープへの参照ポインタであることを示す役割を持っているものと思われる Variant型変数にオブジェクトを代入するときもこのSetがあるおかげで、スタックの値を参照アドレスとして解釈できるようになっているはず
>>949 そう、setは文法上無いと何かとバッティングしたはず。だからどうしても必要なんだけど、
何だっけな、何でもいいや
>>951 Letとのバッティングだろう
推測だが、VB6/VBAのコンパイラは、代入演算子と等価演算子がともに'='であることを前提とした仕様になっているんだと思う
プリミティブ型の値の代入はスタックの値のコピーに他ならないので、代入演算子を等価演算子と混同しても論理矛盾が起きない
オブジェクトの場合はそうはいかないので、オブジェクト変数として型宣言した変数へのインスタンス代入の際にはSetの識別子付与を強制するようにしてるんじゃなかろうか
VB.NETではSetが要らなくなってるからコンパイラの仕様だよなこれは
参照カウント型GCの都合だよ Setで左辺のオブジェクトの参照カウントが+1されて変数に束縛される 左辺がNothingだったら束縛していたオブジェクト参照カウントを-1する 変数がemptyやNothingだったら何もしない 見た目以上に重い代入処理 関数や手続きの戻りまで行ったら全てのローカル変数に対してSet 変数 = Nothing相当の処理をする だから関数の最後でNothingの代入は不要 ただし
>>953 知らなかった、ありがとう
代入値の評価をして変数スコープ内で参照カウンタを管理するためのステートメントなのか
確かにそれだとLetと違って省略不可だな
>>951 Setが省略できないのはデフォルトプロパティとの絡み
SetもLetもないと、デフォルトプロパティへの代入なのかインスタンスそのものの代入なのか区別がつかないから
文法解釈の問題で、GCや参照カウンタの問題ではないよ
>>952 VB.Netではデフォルトプロパティという概念を変えて
一部条件以外でのデフォルトプロパティの省略を禁止した
コンパイラは文法を解釈してるわけで、言語仕様の問題
ちなみに=が等価演算子か比較演算子かの解釈に、値型か参照型の区別は関係ない
VB.Netがそうだろ
>>955 なるほどそういうことか
ありがとう納得した
ここは勉強になるな
>>955 あーそれだ、ありがとう
setが無いと、
foo = cells(1,1)
が
set foo = cells(1,1)
なのか
foo = cells(1,1).value
なのか、
見分けが付かないって事だね
>>942 ちょっとリンク先見てみたけど、微妙な説明してるなぁ
混乱する一番の原因は、
オブジェクトを返すプロパティには、そのオブジェクトの型と同じ名前を使う
っていう指針があるから
Dim r As Range
のRangeは型名(=オブジェクト名)
Set r = ActiveSheet.Range("A1")
のRangeは文法的にはWorksheetオブジェクトのRangeプロパティ
RangeプロパティはRange型のインスタンスを返す
ActiveSheetなんてオブジェクトはないが、これは
Set r = Application.ActiveSheet.Range("A1")
の省略形とみなされるので、ApplicationオブジェクトのActiveSheetプロパティだと解釈される
ActiveSheetプロパティが返しているものがWorksheetオブジェクト(のインスタンス)
Worksheet型じゃなくてSheet型だろとかいう突っ込みとか
Rangeのデフォルトプロパティだろとかいう突っ込みは勘弁な
>>958 > 混乱する一番の原因は、
> オブジェクトを返すプロパティには、そのオブジェクトの型と同じ名前を使う
> っていう指針があるから
違うよ
オブジェクトなんて曖昧な用語を使うから混乱するの
型(クラス)と実体(インスタンス)をきちんと区別すればいいだけ
Select CaseステートメントでLong型変数の判定がおかしいのですがなぜですか?
@では5000未満と判定されているのに、Aではきちんと12500と判定されます
https://pastebin.com/LvSb9cmT 値型はNewしないで参照型はNewするというルールに従うと 別言語でStringは参照型なのに何でNewしなくていいのかと悩んだな 結局参照型でもNewしなくていい場合があるってスルーするのが一番だけど
stringは今となっては値として何も考えずに使えるよね
昔は配列だの何だの意外とめんどくさかった。更に文字コードやなんやでそれはもう
https://docs.microsoft.com/ja-jp/dotnet/api/system.string?redirectedfrom=MSDN& ;view=netframework-4.8#constructors
え、プロパティの引数って絶対に()つけないといけないの? そこら辺の文法が謎だわ 本でも説明されてないし ネットで検索しまくってもプロパティの引数には()をつけろなんて書いてないし どこでそんな知識仕入れてきたの?
そもそもプロパティに引数ってのがよーわからん getterなんだろうけど
ActiveSheet.Range("A1") = "TEST" とか str = ActiveSheet.Range("A1") とかの()内のことを言っているんだろうか?
>>964 RangeクラスのValueプロパティのアクセサは引数いらないよね
アクセス時に引数を要求されるプロパティとそうじゃないプロパティがあるだけ
>>968 プロパティの引数に()いるの?に対してその答えはおかしい
>>969 ひょっとしてまだメソッド/プロパティの引数指定の丸括弧記法の話をしていたのか?メゾット君
プロパティのアクセサの引数指定は丸括弧必須
戻り値を取得するための命令だから当たり前
>>966 いや、うん。そこじゃないんだ
普通に考えると「プロパティに引数がいるの?」なんだ
プロパティに引数は普通は不要。プロパティは「セルの内容」「列幅」など、取り出すだけのもの
プロパティてのは大体「設定]的な意味
vbaはかなり古く誕生した言語な割に大変長寿で、かなりおかしなことになっているってのはあるけども
>>958 に集約されている
>>971 クラス側で保持するプロパティという概念自体には引数という観念が成立しないのはその通り
でもこの人が言ってるのは多分プロパティの受け渡しに使うアクセサの引数のことだと思う
アクセサ VBA はい、なんもヒットしません 初心者に解説する場合、専門用語を使うってどうなの?
プロパティに引数持てる言語はVB系の言語しかないのでそういうもんだと思うしかないような気がする
プロパティに引数もてるとか持てないとかはっきりしろよ…
>>972 おう、これは本気で行くしか無いぞ
>>973 そうじゃなくて、逆なんだ。vbaにはわざわざ引数が用意されている
プロパティの場合、引数じゃなく代入で済ませる方が自然なんだ
cells(1,1),value = "これを設定する"
A1に"これを設定する"という文字列が入る
この場合、プロパティに引数は使われていない。プロパティに直接代入している
本来ならこう書くべきだ
cells(1,1),value.setter("これを設定する")
この辺りはずっとsetter/getterを用意しようぜって流れが主流になった
Range COMオブジェクト デフォルトプロパティ でぐぐると良いかも
>>980 君は生きている価値もないかな、と感じた
自分の存在価値を下げるような発言は謹んだ方が良いと思うよ
このあたりの話は自分でクラスを作ったことがなければ分からないと思う ともあれ、質問者の意図は引数付きのプロパティ式で丸括弧を省略できるかどうかという話なんだろうから、出来ないという結論で締めて終わり 要するにRange("A1")をRange "A1" とは書けない これだとRangeという名前のSubプロジージャに引数"A1"を与えるという全くデタラメな構文になる
初心者にとって感覚的に分かりやすいのは戻りを使う場合はカッコを使う。 戻りを使わない場合はカッコを使わない。 Call文だけ例外でカッコを使う。 で良いんじゃね?
>>987 end(xlup)
戻り値ってなんだ?
>>988 返り値は連続領域の下端のセルを表すRangeオブジェクトだよ
Microsoftの公式のリファレンスくらい読んだら?
>>988 間違えた、xlupなら上端のセルだな
とにかく仕様理解のためには公式リファレンスに勝るものはないから返り値くらいはちゃんと調べたらいい
>>990 ENDの()のどこが戻り値なのかきいてんだよ…
ガイジかよ
>>991 戻り値の意味が分かってなくて草
Expression.End(Destination)っていう構文全体が戻り値を指し示してるんだが
Cells(i, j).Borders(xlDiagonalDown).LineStyle = xlInsideHorizontal わかりやすくな プログラム初心者でもわかるように解説しろ ボーダーには()でラインスタイルには= どちらもプロパティなはず なんで? どれがなにの戻り値なの?ってのを 主語がなかったりテキトーなカタカナでごまかしてるのおおすぎ
北海道でスーパーハゲをしてるグラサンのおっさんこないのー?
LineStyleプロパティは引数の指定を要求されないプロパティだから()による引数指定は要らない かつ、Linestyleプロパティは値の読み取りの他に値の設定も可能なプロパティなので、代入演算子の = でxlLineStyle列挙体の定数を設定することにより、罫線の書式を設定できる プロパティだから()が必要なんだとか=が必要なんだとかっていう単純な捉え方は理解の妨げになるからやめた方がよい 引数による要素の指定を要求/許容しているのか、値の読み取りだけでなく値の設定も出来るのかといった個々のプロパティの仕様の違いにより、式の書き方が変わるだけ
ってかこの一連の問題、すげー難しいよ 初心者を自覚してるならあまり深く考えないほうが良いと思う 得るものは少ない、ぱっと書き方だけ覚えてどんどん次へ進んだほうがいいような
WorksheetオブジェクトのCellsプロパティなどは引数なしでも引数ありでも使用できるし、=で値も設定できる ()の要不要とか=を用いた代入の可否なんてプロパティの仕様によるとしか
>>993 こう説明したらわかる?
Cellsの戻り値に対して.Borders〜〜って事
Borders(xlDiagonalDown)の.LineStyleに対して = xlInsideHorizontalって事
>>996 引数の要求をされないプロパティ??
linestyleだけではエラーになるのでは?
レンジのラインスタイルです!だけは意味不明でしょ
値の設定?読み取り?
設定 罫線を引く?
読み取り ???
つまりどういうこと?
定数を設定??
bordersの引数も定数では?
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 77日 2時間 45分 30秒
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/ ▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
read.cgi ver 07.7.23 2024/12/25 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20250305101016ncaこのスレへの固定リンク: http://5chb.net/r/tech/1568630099/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「Excel VBA 質問スレ Part63 ->画像>2枚 」 を見た人も見ています:・Excel VBA 質問スレ Part80(ワッチョイあり) ・Counter-Strike: Global Offensive 質問スレ Part3 ・+ JavaScript & jQuery 質問用スレッド vol.8 + ・【BlackDesert】黒い砂漠質問スレPart38 ・【BlackDesert】黒い砂漠質問スレPart45 ・シノアリス質問スレ【SINoALICE】 Part4 ・【BlackDesert】黒い砂漠 質問スレ Part29 ・【BlackDesert】黒い砂漠 質問スレ Part30 ・【BlacKDesert】黒い砂漠PC版 質問スレpart79 ・【Dead by Daylight】PC版質問スレ【DbD】 part28 ・【Switch】Xenoblade2 質問スレpart7【モノリス】 ・【BlackDesert】黒い砂漠 質問スレ Part14 [無断転載禁止] ・【D2R】Diablo 2 Resurrected 質問スレ Part5【リマスター】 ・Cubaseシリーズ 初心者質問スレ Part21 ・【シャドウバース】shadowverseデッキ診断・質問スレ part11 ・【iOS/Android/PC】ウマ娘 プリティーダービー 質問スレ Part22 ・【iOS/Android/PC】ウマ娘 プリティーダービー 質問スレ Part2 ・【TESO】The Elder Scrolls Online 質問スレ Part43 ・Fate/Grand Order どんな質問にも全力で優しく答えるスレ Lv.5 c2ch.net ・KAROS ONLINE 質問スレッド Part4 ・Blender 初心者質問スレッド Part39 ・Blender 初心者質問スレッド Part29 ・セキュリティ初心者質問スレッドpart132 ・Mozilla Firefox質問スレッド Part189 ・5chブラウザ「ChMate」質問スレ Part74 ・5chブラウザ「ChMate」質問スレ Part83 ・5chブラウザ「ChMate」質問スレ Part68 ・Mozilla Firefox質問スレッド Part176 ・5chブラウザ「ChMate」質問スレ Part73 ・5chブラウザ「ChMate」質問スレ Part68 ・5chブラウザ「ChMate」質問スレ Part60 ・【質問スレ】ESCAPE FROM TARKOV Part.5 ・5chブラウザ「ChMate」質問スレ Part54 ・5chブラウザ「ChMate」質問スレ Part53 ・セキュリティ初心者質問スレッド Part141 ・【MobA】vainglory初心者質問スレ ★Tier3 ・【MobA】vainglory初心者質問スレ ★Tier9 ・【MobA】vainglory初心者質問スレ ★Tier12 ・【初心者】ダイエット質問・相談スレPart215 ・【初心者】ダイエット質問・相談スレPart231 ・【初心者】ダイエットの質問・相談スレPart189 ・【初心者】ダイエット質問・相談スレPart224 ・iPhone 質問スレッド part57 【本文引用禁止・ワッチョイ有】 ・【プリコネ】プリンセスコネクト! Re:Dive質問スレ Part11 ・【PS4/XB1】SEKIRO:SHADOWS DIE TWICE 質問スレ Part4【隻狼】 ・Fate/Grand Order 質問スレ Lv.28 ・Fate/Grand Order 質問スレ Lv.29 ・Fate/Grand Order 質問スレ Lv.19 ・PCゲーム雑談・質問スレツド Part 2 ・【FM】Football Manager 質問スレ 36 ・Mozilla Thunderbird 質問スレッド 28 ・【FM】Football Manager 質問スレ 35 ・【海外通販】AliExpress初心者質問スレ 15 ・【海外通販】AliExpress初心者質問スレ 20 ・【PoE】 Path of Exile 質問スレ part43 ・【PoE】 Path of Exile 質問スレ part18 ・Jane Styleの質問に誰かが答えるスレ Part21 ・【PoE】 Path of Exile 質問スレ part20 ・【PSO2】PHANTASY STAR ONLINE2 質問スレ1 ・Jane Styleの質問に誰かが答えるスレ Part55 ・【PSO2】PHANTASY STAR ONLINE2 質問スレ71 ・【LoL】League of Legends 質問スレ Part64 ・【LoL】League of Legends 質問スレ Part67 ・Hearthstone: Heroes of Warcraft 質問スレ part40 ・Fate/Grand Order どんな質問にも全力で優しく答えるスレ Lv.1
20:10:18 up 50 days, 21:13, 0 users, load average: 50.98, 70.58, 77.21
in 2.5148420333862 sec
@1.6769280433655@0b7 on 030510