TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
【えっ】Perlに未来はあるのか?【終わり?】
クラスとかインスタンスってなんのためにあんの?
【Electron】ハイブリッドアプリ開発総合【Cordova】
テストしにくいコードをテストする方法 その2
Visual Studio 2017 Part5
逆コンパイラCodeReverseを作る
【JavaScript】スクリプト バトルロワイヤル55【php,py,pl,rb】
スレ立てるまでもない質問はここで 149匹目
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
1行ずつC言語を書いてくスレ(目標なし)
Excel VBA 質問スレ Part63
- 1 :2019/09/16 〜 最終レス :2019/10/31
- !extend:checked:vvvvv:1000:512
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part62
https://mevius.2ch.sc/test/read.cgi/tech/1561303297/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 2 :
- ぽこちん
- 3 :
- Rこ
- 4 :
- おつちん
- 5 :
- 糞レスで埋めるなら前スレの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
- 6 :
- ぽこちん
- 7 :
- 全部丸投げの教えてクレクレはR
- 8 :
- LongLong型に定数値として4,294,967,296を与えておきたいのですがLongの範囲を超えているせいか、必ず後ろに#が付いてしまいます
用途としては強引にunsigned Long的に使う為のオフセットなのですが#を付けない方法はありますか?
- 9 :
- Verylong型
- 10 :
- Rこ
- 11 :
- >>8
式は書けないんだったっけ…
- 12 :
- LongPtr
- 13 :
- 前スレの最後でセルに色をつけるコードを作って頂いた者です。職場で試してみましたが思い描いた通りに動いてくれました!これを機に自分で作れるように勉強したいと思います。作って下さった方、本当にありがとうございました…!
- 14 :
- ぽこちん
- 15 :
- スレチなのは分かってるけど詳しい人がここにしかいなさそうだから、もし知っていたら教えてほしい
ブックに保存されたクエリをOLAP等で使い回すためにODCファイルとしてエクスポートしたいんだが、「既存の接続」コマンドからクエリのプロパティを開いても「接続のエクスポート」のボタンが無効になっていてうまくエクスポート出来ない
どうしたらうまくエクスポートできるのか知りたい
- 16 :
- 珍ぽこりん
- 17 :
- すみません。
エラーが分からず・・・教えてください。
下記コードで、”型が一致しません”というエラーが出ています。
Dim Ringi1 As Worksheet
ThisWorkbook.Activate
Set Ringi1 = Workbooks(Range("B6")).Worksheet("Sheet1") ←エラー
ThisworkbookのB6には”テストファイル.xlsx”が入っています。
よろしくお願いします。
- 18 :
- >>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")
- 19 :
- ポコポコてぃんてぃむ
- 20 :
- >>8
つけないのは無理だったと思う
今スマホだから試せないけど # が嫌というだけなら ^ ではどうかな?
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/longlong-data-type
- 21 :
- てぃむてぃむ
- 22 :
- ブックAのシート1〜iまでのA1セルの数字を合計した数字をブックBのA1セルに転記したいのですが、どう書けばいいでしょうか?
- 23 :
- >>22
マルチポストはやめよう
- 24 :
- VBAのエディタに未だに慣れない・・・visual studioみたいな至れり尽くせりな開発環境があればなぁ
- 25 :
- >>24
アドオン入れるなり作るなりするとマシになる
- 26 :
- >>18
コードをヒントにして、成功しました!
ありがとうございました。
めっちゃお優しいですね!!
- 27 :
- あいうえお
- 28 :
- >>23
初めてなので許してください
そして教えてください
- 29 :
- >>25
オススメ教えて
- 30 :
- かきくけこ
- 31 :
- なにぬねの
- 32 :
- >>22
ブックAのシートでループ
- 33 :
- >>28
R、馬鹿
- 34 :
- >>33
うるせえウンコマンクソして寝ろ
- 35 :
- 馬鹿の本性なんてこんなもん
- 36 :
- >>28
ならマルチポスト放置してないで一つに絞ろう
- 37 :
- らったったっらたた
- 38 :
- すみません。
考えてもわからないので教えてください。
Dim Wb2 As Workbook
Set Wb2 = Workbooks(Range("B7").Value)
エラーメッセージ:インデックスが有効範囲にありません。
B7セルには<テストファイル.xlsx>が入っているとします。
Workbookにワークブック名を入れようとしているのですが、
なぜエラーなのでしょうか・・・?
- 39 :
- SetするWorkbooksは、ファイルが開いていないといけなかったんですね。
自己解決しました。
失礼しました。
- 40 :
- >>39
dドライブ直下にあるとして
Set Wb2 = Workbooks.open ("d:¥" & Range("B7").Value)
なら自動的にファイルを開いてオブジェクト扱いになる
- 41 :
- >>40
そんな書き方もあるんですね!
勉強になります。
(私のコードは無駄が多そう・・・。)
- 42 :
- 変に答えると幼稚な馬鹿がつけあがる
- 43 :
- と、幼稚な馬鹿が申してます
- 44 :
- あかさたな
- 45 :
- VBAからIEを操作してhtmlで書かれたデータを取りに行くコードを書いています
ターゲットのサイトでは、一度に20件のデータしか表示されず
一番下までスクロールするたびに20件ずつ追加されます(データは全200件です)
htmlでは、20件のデータの下に「::after」と書かれており、スクロールが一番下に近づくと
新たな20件がロードされ、その下に「::after」が現れます
質問ですが、一度に200件全てのデータを取るためにはIEでスクロールさせる必要があるように思いますが
その場合、SendKeysを使って、SendKeys "{PGDN}" のようにするしかないのでしょうか?
それとも他に、何か良い方法があるようでしたらアドバイスをいただきたくお願い申し上げます
- 46 :
- querytables.addでCSVファイルをエクセルシートに貼り付けたとき、グループ化で非表示にされている部分に正しく貼り付けられるのはいいのですが、グループ化非表示から表示状態にされてしまいます。
非表示部分に貼り付けつつ、非表示のままにするにはどうしたらいいでしょうか?
貼り付け先シートの元々の表示・非表示状態はそのままにしたいんですがよい方法はありますか?
- 47 :
- sendkeysはなるべく使わない
- 48 :
- abcdefg
- 49 :
- >>45
ページの作りによる。
例えばあなたは20件ずつなどと言っているけど、URLの入力など次第で200件全部表示できるかもしれない。
スクロールが必要かも分からないがSendkeysなんて使うのは子供と考えて良い。
- 50 :
- >>47>>49
レスありがとうございます。
私もSendKeysは使いたくなかったので質問した次第です
> ページの作りによる。
ターゲットサイトは、dアニメのランキングのページです。
https://anime.dmkt-sp.jp/animestore/CR/CR00000013_001
ここからランキングのデータを抜き出して来ようと思ってますが、20件ずつしか表示されず…
何かいい方法はないでしょうかねぇ
- 51 :
- あーざーやーかーにー
いーろづいたっ
- 52 :
- うちの会社に、元SEでVBAバリバリ書ける、という人が
入ってきたんですが、色々Excel作業の自動化をお願いするために
現行の作業手順をお見せしたら、「ここの、Excel関数を使っているところは
意味が分からないので、関数の使い方から説明してください。」といわれ、
VLOOKUPとは、からお話ししないといけないそうで、もう自分でVBA
書こうかと思ってしまいます。
はじめはこういうもので、すぐ慣れてくれるんでしょうか?
「SEの資格」を持っている、という触れ込みの、部長の知り合いなので扱いは
要注意なのです。はぁ。
- 53 :
- 経歴詐称があった場合、解雇はできるのか
結論から言うと、解雇できる場合もあればできない場合もあります。
一口に経歴詐称といっても、軽微なものから重大なものまであり、全てのケースで解雇が可能とすることは合理的ではないからです。
解雇ができるケースは、「重要な経歴」を詐称されたときに限られます(重要な経歴とは何を指すのかは下記で説明します)。
職歴に関する経歴詐称
職歴を詐称していた場合は、採用後の仕事の内容、賃金に直接影響を及ぼすもののため、重要な経歴を詐称していると判断される可能性が高いと言えます。
判例では、グラバス事件(東京地判平成16年12月17日 労判889号52頁)があり、プログラミング能力がなかったにも関わらず、あたかもスキルがあるかのように経歴書に記載。
採用面接でもそのように説明して、ソフトウェア会社に採用されたが、経歴詐称を理由とする懲戒解雇が認められたという事例があります。
- 54 :
- そもそも触れ込みから嘘だったのかまで疑ったらキリがないから、そこんとこは何とも言えないけど、
元SEが本当なら、少なくともVB(VBAじゃなく)は書けるけど、普通のオフィスワークはあんましてこなかった、とかじゃないの?
そんな感じのSEさんと一緒に仕事したことはある。ちょっと教えてあげたらあっという間に習得したけど。
でもやっぱ利用頻度の低い関数(LOOKUP系)や若干特殊な使い方(SUMPRODUCTを複数条件の判定や抽出に使うとか)には苦慮してた。
- 55 :
- >>52
バリバリ書けるSEならExcelの基本的な関数ぐらい自分で調べられるものだがそれすらできないのはバリバリ具合すら怪しい予感
- 56 :
- >>52
バリバリのエンジニアがVBA使う仕事に応募なんてしません
- 57 :
- >>52
そもそも謎の「SEの資格」とか言ってるお前も似たようなもんだろ…
- 58 :
- 知らないことを知らないと言えるやつはまだ大丈夫だわ
ホントにやばいやつってのはな・・・
- 59 :
- もちろんできますよ大丈夫です(やべっ何もわからん どうしよー)
- 60 :
- >>50
スクロールしないで取得したかったんだが解析面倒で断念。
スクロールはSendkeysではなく、HTMLWindow2のscrollToなどを使う。
https://pastebin.com/V7S3XW71
- 61 :
- VBAって必要になったら都度気合いで調べながら書いて、しばらく書かない間に忘れてまた必要になったらまた調べて覚え直すってことを繰り返してる気がする
- 62 :
- >>52
VBA使いでExcel関数を使わない人もいるからな。
俺はどっちも使うけど両方同時に使うのは避けることが多い。
- 63 :
- >>59
簡単にそんなこと言うと、その時点でバレるぞ。
普通は分かってたら詳細や、かつてその技術でハマッた体験談を語るもんだ。
- 64 :
- あいうえお
- 65 :
- >>60
> スクロールしないで取得したかったんだが解析面倒で断念。
> https://pastebin.com/V7S3XW71
おお、わざわざここまで!
大変お手数をおかけすることとなってしまい、申し訳ないやら嬉しいやら…ありがとうございます!!
> スクロールはSendkeysではなく、HTMLWindow2のscrollToなどを使う。
最近、ネットのブログなどを参考に
見よう見まねでExcelのVBAとIE操作を両方一緒に始めたのですが…
ループで200項目取り出すまでの条件の書き方、スクロールの書き方、すごく参考になります!
ランキングデータの取り出し方…、ここまでシンプルに書けるものなんですね!!
恥ずかしながら、まだオブジェクトとかコレクションとかアイテムとかがごっちゃになってて頭で整理できておらず
文法エラー(?)の嵐に悩まされつつコードを書いてる段階で…"ChildNodes"とかもまだ使ったことないです…
本当に感謝です。
- 66 :
- また幼稚なゆとり世代馬鹿か
- 67 :
- 他人の批判しても成果はあがらない
- 68 :
- 凄く基本的な質問だと思うのですが、
Range("A1".Offset(0,12)).Activate
はだめで、
Range("A1").Offset(0,12).Activate
が正しいのはなんでなのでしょうか?
- 69 :
- >>68
VBAでそのへんを正しく理解するのはまず不可能だしその必要もないから、定型句だと思って暗記しなさい
ちゃんと理解したかったらJavaのようなきちんとしたオブジェクト指向言語を学ぶことをお勧めする
- 70 :
- >>68
引数が間違ってるから
- 71 :
- >>68
一番目の式の方は、"A1".Offset(0, 12)という表現がVBAの構文上無効で何も値を返さない式になっている
なので、参照先のセル範囲の名前をバリアント型の引数として要求しているRangeプロパティ式の評価に失敗してしまい、Rangeオブジェクトの取得にも失敗する
文字列や数値のリテラルに.(任意の値)と続けて何らかのオブジェクトにアクセスしようとしても、そもそもそのようなアクセスルールが定義されていないので当然失敗する
反対にRange("A1").Offset(0,12)の方は構文上無効な表現がなく、RangeオブジェクトのメンバのOffsetプロパティ式を正しく用いているので、Offsetプロパティを介してA1セルから12列分座標移動したセルを取得することができる
- 72 :
- なにぬねの
- 73 :
- VBAのリテラルはメンバを持たないから
他言語だと型変換とかあるんだけど
- 74 :
- リテラルがそのままstring型オブジェクトとして使える言語だとメンバアクセスできて楽だよね
- 75 :
- たちつてやと
- 76 :
- VBEはインテリセンスがクソ
- 77 :
- VBEは静的に型判定できるリテラルくらいハイライト表示対応してくれと思う
- 78 :
- そもそもExcelのおまけ機能だし
- 79 :
- はひふへほ
- 80 :
- イミディエイトとローカルのウインドウ、上下にドッキングしてしまったのだけど、左右にドッキングするようにはどうすればいいのだろう…
- 81 :
- >>80
ドラックすれば良いんじゃない?
位置調整は難しい場合があるけどウィンドウ枠の表示が変わった時に離すとドッキングするから試行錯誤してみれば良い。
- 82 :
- やいゆえよ
- 83 :
- いきしちにひみいりい
- 84 :
- >>80
移動させる時に判定のシビアなガイド枠みたいなのが出るから置きたい位置にハマるまで頑張る
- 85 :
- VBAの代わりにPython実行環境を取り込む動きがあるらしいね
もしそうなったらVBA界隈の閉塞感も変わるかな
- 86 :
- まじ?
エクセルやってる一般社員様がpython始めたらどうなるんだろ
- 87 :
- おっぱいでexcelを自動化する
- 88 :
- Pythonエンジン搭載は色んな理由で見送られたはず
- 89 :
- >>85
未だにこういう馬鹿がいるのか
- 90 :
- Python搭載は見送られて代わりにJavaScriptが搭載されるという記事をどこかで見かけましたが。
どなたか>>46わかるかたお願いします。
- 91 :
- >>90
>>89
>>未だにこういう馬鹿がいるのか
- 92 :
- jsだったらgasと同じような感じになるのかな
gasはそもそもスプレッドシート自体の機能が物足りないからイマイチだったんだけど
- 93 :
- これからJSエンジンが実装されるならTypeScriptベースで型付け強制になるだろうな
- 94 :
- .ClearContents と .Value="" では実行後のセルの状態は異なりますか?
- 95 :
- 何も載らないよ
Excel自体クラウド上で使うようになってきてるから
マクロみたい使うならJavaScriptなのかもね
- 96 :
- きーよしー
こーのよーるー
- 97 :
- ハーゲーはー ひーかーり
- 98 :
- 最近はExcel操作のためにVBAを使うのはもうなんか最後の手段って感じがする
PowerQuery(M言語)、PowerPivot(DAX)、JavaScript、Python、PowerShellのどれかで書く方が楽だしメンテも簡単
- 99 :
- 趣味が大がかりになってきて使う材料の管理が煩雑になってきたのでExcelを使って管理しようかなと考えています
工程が1,2,3…とあって、それぞれの工程で使う部材は今のところ重複はなく(今後どうなるかわからない)部材毎に色違いやグレード違い等の派生品があり、
用途としては工程毎に使う部材を別シートにリストアップしたり、規定量を割ったものをピックアップ
部材の管理番号を振るとき
番号は工程や派生に関わらず一列で一意の連番
3列で工程ー工程内の部材を連番ー派生を枝番
工程に関わらず部材毎に連番ー派生品を枝番
マクロを組むときこれらのうちどうするのがよい構造になるでしょうか?
- 100 :
- まず3行にまとめます。
- 101 :
- RDBSを使って合成テーブルを作ります
- 102 :
- >>98
Excelデータ操作するのにか!?
- 103 :
- 確かにvlookup関数もCで作ったほうが処理速度速いですし
- 104 :
- >>102
情報取得とかテーブル加工とかならVBAよりQueryTable)PowerPivotの方がよっぽど速いし型安全にデータ処理できる
数万行以上のデータのリレーション構築とテーブル加工をVBAやWorkshhet関数で実現するとか正気の沙汰じゃないぞ
- 105 :
- なんか齢50近くになると新しい言語?を知らない…power query?power pivot?
…後で調べてみないと…
- 106 :
- M言語ってどうやって勉強するのさ
英語の本け?
- 107 :
- >>106
マイクロソフトが仕様書公開してる
- 108 :
- >>106
MSが仕様公開して言語レファレンスまで作ってる
開発&実行環境はExcelのPowerQueryに付いてるので特に余分なものは要らない
- 109 :
- >>99
一番目の方法でまず一意のIDを持つ部材のマスタを作った方が良い
その上で、派生関係や使用工程は列を分けて部材マスタの属性値として管理する
そうすれば各使用工程で使う部材を抽出するビューが漏れなく簡単に作れるし、部材データの追加も容易
何故他のやり方が良くないかというと、使用工程や派生関係を管理番号で構造的に表そうとしても、一対一の親子関係から外れる複合的な派生関係の表現が難しいし、複数の工程にまたがって使用する部材が登場した場合の付番がとても困難だから
- 110 :
- ↑仕様もわからないのに勝手に決めつける馬鹿
- 111 :
- >>110
データ活用のシナリオの説明もある程度書いてくれてるし、3パターンの中からオススメを選んで教えてくれと言われてるんだから根拠を示しながら回答するのはOKだろ
- 112 :
- 馬鹿と言いたいだけの馬鹿は相手にしなくていいよ
- 113 :
- > 馬鹿と言いたいだけの馬鹿
>>112の悪口はやめなよ
- 114 :
- 今、困っていることがあり教えてください。
Excelをオープンした時に、入力規則のリストが設定されているセルに
VBAでリストにある文字列を張り付けるとリストが解除されてしまい困っています。
ただ、Excelを既にオープンしている状態であれば、VBAで文字列を張り付けてもリストは解除されません。
Excelをオープンした際の文字列貼り付けでもリストを解除しない方法、何かないでしょうか。
- 115 :
- >>114
試してないから自信はないけど配列に文字列の値を格納してからコピー先セルに一括代入してみたらどうかね
- 116 :
- 計算方法の自動手動を切り替えるとか
doeventsを挟むとか
入力規則を消去して再度設定してみるとか
- 117 :
- >>115
適当な配列を用意して、1要素に代入したい文字列を格納した後、該当セルにコピーしたが駄目でした。
もしかして、一括代入の意味の捉え方誤っていますでしょうか?
>>116
計算方法を手動にしてもdoevent挟んでも駄目でした。
入力規則の再設定は大丈夫でしたが、再設定しか駄目なんですかね。
- 118 :
- 再設定で目的が果たせるならそれでいいんじゃないの
気に入らないかもしれないけど
- 119 :
- >>118
目的は達成できるのですが、どうしてそんなことが
起きているのか気持ち悪さが残ってしまって・・・
ひとまずリスト再設定で回避してみようと思います。
皆さん、ありがとうございました。
- 120 :
- 1ステップずつ何が起こってるか確認してみた?
- 121 :
- ウォッチ式で入力規則が無効になった瞬間を捕まえたらどのステップで問題が起きてるか分かるよ
あとApplication.EnableEvents=False の状態で入力規則が無効化する症状が同じように出るかどうかを確かめると良いかも
副作用あるから気を付けた方がいいけどね
- 122 :
- デバッグは大事
- 123 :
- Worksheetの表示を縮小したときに名前をつけた範囲名が青文字で表示されますが
あれを縮小表示なしに表示するメソッドとかないですかね?
なければ諦めて作ろうと思って、、
- 124 :
- 以前の勤務表の作成についての質問をしたものです。
指定範囲に対して条件を参照して自動で勤務を組むにはどのようなコードが使えますか。
- 125 :
- その通りにコードを組めばいいです
よかったですね
- 126 :
- そこまでくると質問というより代わりに作ってって感じな気がする
- 127 :
- 15万ぐらい払えば作ってくれるよ
- 128 :
- 任意のフォルダを開きたいくて、そのファイルのパスが
A1に書いてあるときにどんなコード書いたらできますか?だれか教えてください。お願いします🥺
- 129 :
- え?w>>124見たいな糞簡単なの作って15万???
うそやろwwwww
- 130 :
- >>128
ファイル形式は?
- 131 :
- >>128
次から次へと現れる馬鹿
- 132 :
- >>128
フォルダのフルパスがA1セルに入っているなら、
Shell Range("A1").Value, vbNormalFocus
と書けばとりあえずフォルダを開くことはできる
開いたフォルダの中のファイルを選んで何らかの操作をしたいならファイルそのものを掴む別の工夫が必要
- 133 :
- .Findで検索するマクロ作ってるけど死にそう
全シート検索で結合セル気にしないでいい方法ないですか
一致したの全部もれなくとるだけなのに
なんでこんな大変なんですか
- 134 :
- >>133
何がそんなに大変なの?
- 135 :
- 初回検索と次項目の検索が別メソッド
検索したあとに問答無用で一周して戻ってくる謎仕様
結合セル最初に見つけたら2週目で見つけられなくて死亡
最初から検索しようとしたら最初の次のセルから開始という超絶理不尽仕様
最終セル開始点にしようとしたら最終セルが結合セルで死亡
- 136 :
- http://dsp74118.blogspot.com/2014/08/excel-vbarangefind.html
ってこれなに
うそだろ
- 137 :
- あるシートから10000行程クリップボードにコピーして別シートに行挿入する事を10回程度繰り返すマクロがメモリ不足で停止してしまいます。
エクセルは32bitですがメモリ使用量は2.5GB程度、使用率は80%程度なので余裕はあります。
コピー&挿入だけでこんなにメモリ食うのは想定外だったのですが何か良い対策ありませんか?
クリップボードを使ってる理由は書式もコピーしたいからです。
- 138 :
- >>137
結合セルがない場合で、書式が行列で統一的に構造化されている(=手動でランダムに設定された書式がない)場合の話だけど、セルの値のコピーはクエリテーブルを使い、セル書式はスタイルとして登録しておいて値をコピーしたあとにテーブル単位で適用するようにする
それができないなら常套手段的な対策として、描画停止、セルの自動計算の無効化、一度のコピー行数の抑制、コピーする情報の量の削減(列を減らす、セルに入れる値の文字列長に上限をつける等)をやるしかない
- 139 :
- >>135
検索対象のセル範囲でループを回して、MergeAreaプロパティから取得できる結合範囲の第一セルの値に対してInStr関数でチェックをかけるほうが簡単に実装できる
一度触った第一セルをDictionaryに突っ込んでおけば重複回避の処理も簡単に書けるし
- 140 :
- 1000行を100回にすれば解決する気がする
- 141 :
- >>137
想定して最初から設計しなおした方がいいんじゃね
- 142 :
- >>137
一度に全部やらず少しずつやるとか、挿入やめて別シートに貼り付けていくとか
- 143 :
- vbaできる人は何歳くらいの方が多いのですか?
- 144 :
- 100才。
きんは100才100才。ぎんも100才100才。
もう死んじゃいましたけど。
- 145 :
- いまは中曽根元首相が100才だよ。
- 146 :
- >>145
もう101歳になった
- 147 :
- 100才くらいなら健康でも1年後にもまだ生きてる生存率は50%くらいだよな。
そろそろ死神のお迎えがくるかな。
- 148 :
- そんな事言ってる人に来るからな
- 149 :
- 直せるものもろくに直さず
超絶くそのまま世界で最も使われる言語の一つになってしまったVBAに
いろいろ思うところがある
俺らがああしろこうしろと習ってることってどこまで本当なのか
- 150 :
- 人の言うことなんか信用するな
学校で教えることなんて、諸説あるうちの一つを紹介してるだけ
自分で直接見聞きしたことが真実に一番近い
- 151 :
- >>138
>>141-142
細かくコピペするよう変えたのですが、今度はメモリを3.5GBくらい使い始めました。
さすがにおかしいので調べた結果、コピー元のシートの1つがバグってたようです。
現在はメモリ使用量が250MB程度に収まりました。
ありがとうございました。
- 152 :
- 質問させてください。
シート上に簡単なHTMLを表示させたいのですが、そのようなコントロールはありますでしょうか?
必要なタグは、br font(color属性のみ) bold div(改行の代わり)くらいです。
目的としては、WEBデータベースに登録されているリッチテキストフィールドをダウンロードして表示することになります。
危ないタグはWEBサービス側で排除されていると思います。
- 153 :
- >>152
Microsoft Web Browserコントロールというのがあります
ただしHTMLの設定や変更にはVBAが必要です
- 154 :
- >>152
簡単なHTMLと簡単でないHTMLの違いがわからん
- 155 :
- MSはC#とかTSとか素性のよい言語開発してるのにどうしてマクロは頑なにVBAのみなのか…
- 156 :
- 企業ユーザーは既存資産が動く事が大事
新しい事は求めていない
- 157 :
- c#でexcelの読み書きすればいい
- 158 :
- >>157
それならそれでいいんだけどMarshall.ComReleaseが面倒すぎる
- 159 :
- ""とclearcontentsって別物だったんだな。
一部書籍で扱いが同じだったが新刊書で違いが明らかになった。
- 160 :
- >>159
どう違うんだ?
- 161 :
- 長さ0の文字列と値・数式のクリア
- 162 :
- >>161
何を入れてクリアしてるかを聞いてるのでは
- 163 :
- ClearContentsでクリアするとValueプロパティの中身が型未定義のEmpty値になるってことか?
- 164 :
- >>161
この2つで異なる結果を返す関数、演算は何ですか?
- 165 :
- 並べ替え、重複削除、ピボットテーブル、COUNTA関数
- 166 :
- 違うかなぁ?
typenameは、どちらもEmptyだし。並び替えにも影響しないみたいだけど、、
- 167 :
- ""のTypeNameはvbStringじゃないの?
- 168 :
- 特定フォルダの中のファイル名を取得したくて、A1にファイルパスが書いてあってあったとき
Dim fname As String fname = "DirSample.xlsx"
の"DirSample.xlsx"の部分をA1のパスにしたいのですが、どうやった良いですか?
- 169 :
- fname = range("a1").value & "¥DirSample.xlsx"
- 170 :
- >>164
=type(a1)
書式を文字列にしてからやってみ
- 171 :
- >>5
このQueryTablesなんですけど、セル内改行を含むCSVを読み込むにはどうしたらいいですかね?
改行コードをいじってみたりしたけど駄目でした
- 172 :
- >>171
CSVで「セル内改行」?
意味が分からん
- 173 :
- >>172
Excel セル内改行 csv
でググっておいで
- 174 :
- >>171
Excelのセル内改行コードとテキストファイルの改行コードは違う
- 175 :
- >>171
CSVのパーサーを自分で書けばいいです
- 176 :
- >>171
QueryTableをコード内でAddするんじゃなくて、予めPowerQueryでセル内改行の処理を埋め込んだ接続を作っておいて、コード実行時にデータの読み込みとテーブル出力だけすればいいんじゃないの
- 177 :
- >>174
セル内改行をLFにしたり色々試したんですけど駄目でした
結局一時ファイルを作って開いてからコピペという泥臭い処理に…
- 178 :
- >>176
PowerQueryですか
調べてみます
- 179 :
- VBAある表のデータで行と列が一致する列の値を返すコードを書きたいのですがどうしたらいいでしょうか?
行だけならVLOOKUPで行けると思うのですが列になるとどうしてラいいのかわかりません。
該当するセルの値を返したいです。
- 180 :
- rangeをfor eachで巡回すればいいんじゃないの
- 181 :
- >>179
行と列が一致するってどういうこと?
行インデックスと列インデックスが一緒ってこと?
それとも、行と列を特定するための条件が個別にあって、それらの条件を満たすってこと?
- 182 :
- >>177
コピペするならファイル作らなくてもクリップボードに送ってテキスト取り出し貼ればセル内改行も反映される
- 183 :
- >>179
何がしたいのか知らないけどVLOOKUPの横版ならHLOOKUP
- 184 :
- >>181
後者です。
シートに参照する表がありユーザーフォームで作った入力表がコンボボックスとなり
一つ目のコンボボックスが行とリンクしていて、二つめのコンボボックスが列と連動して言いて
行と列の一致した値をテキストボックスに表示させたい。
一つだけならVLOOOKUPでできるのですが表となると私の力だと全く思い浮かびません。
力といってもちょっと基本がわかって参考書とインターネットの中から使えそうなコード
を引っ張ってきて使えるように修正するくらいで一から工程を考え出す事は難しいです。
- 185 :
- ワークシートの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をおしたら対象となるセルに反映されました。
これもどうしたら普通通りになりますか?
- 186 :
- >>183
しいて言うならVLOOKUPとHLOOKUPの合わせる感じ?
- 187 :
- >>185
うまくいきませんとは?
一部だけ反応?反応の範囲が逆?
- 188 :
- >>186
関数でできないからVBAでやろうとしてるだけなら関数でできる
表がA1:D5だった場合、
=VLOOKUP(列の条件,A1:D5,MATCH(行の条件,A1:D1))
- 189 :
- 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"
- 190 :
- >>184
重複無しなら、コンボボックスの値が行、列の並びと
同じになるように設定して
listindexを取得
offsetで値を取るとか
- 191 :
- 見出し行の値をkeyにしてrowを取り出すdictionaryを作る
列も同じ様に配列を作る
で、コンボボックスで選択した値で配列から行列番号を取り出す
- 192 :
- >>177
まず考えるべきはバイナリエディタで該当ファイルを開いて、どういう構造になってるのかを確認することだよ。
- 193 :
- >>185
Not抜けてる
- 194 :
- >186 change自体が動きません
>193 マジッスカ!どこに入れたらいいですか?
- 195 :
- >>194
ifのあと
- 196 :
- 〉〉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
- 197 :
- >>196
たぶんMatchの行条件がおかしいけど、どんな問題が起きてるのか分からないから何とも言えない
それから、haihhunとかsiriaruとかhanni_seruとか変数の名前がちょっと酷い
HyphenとかSerialとかとかCellとか英語をきちんと使う意識を持つのが上達の近道だと思う
- 198 :
- 〉〉196
その前にまず安価というのはだな・・・
- 199 :
- 別モジュールに書いたprivate subをcallする方法ってありませんか?
publicにするしか無いでしょうか
- 200 :
- 〉〉196です。
変数名もそんなルールが?
なんとなく日本語はよくないなーと思って自分で分かるローマ字で表記しようと思ったんですが、後ダメな理由がマッチ関数にワークシート指定してないからかと推察。後で試します。
- 201 :
- 無理に英語やローマ字にするくらいなら日本語でいいと思うけど
あとrangeだけじゃなくてcellsも覚えれば目的達成するんじゃないか
cellsのrowとcolumnで行と列を取得出来るからね
- 202 :
- >>199
ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
Publicにするのが嫌なら、呼び出したいPrivate Subが定義されたモジュールにコールバック用の引数付きでPublic Subを定義して、呼び出したい任意のPrivate Subを引数で指定して呼び出せるようにする
それも嫌ならクラスを作ってPrivate Subをメソッド化する
どちらもコーディングや保守の工数は大して変わらない
- 203 :
- >>202
>ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
まさにこれです!privateにしなくても出来たんですね、勉強になりました。ありがとうございました
他の方法も勉強になりました
- 204 :
- >>200
決まった名前ルールは無い
人それぞれに拘りがあるだけ
たぶんみんなに共通する拘りは分かり易さ
他人が見て混乱しないか、半年後に自分が見てすぐに理解できるか
- 205 :
- >>200
ありがとうございます。
コメントつけまくって分かるようにしてます。
まぁ詳しい人が見たらめっちゃくちゃで分かりにくいと思うのですが、
自分用で自分が分かればいいので動くようにして少しづつ改良していきます。
多分、めっちゃ不具合あります。
- 206 :
- データベースから原本のシートに転記する場合表内でのループは可能ですか?
但し、実際に転記する表の上下に題名や表題があります。
例えば1行から20行での表があり繰り返すデータが21行目なったら2ページめの1行目
にするという事は可能でしょうか?
出来なさそうなのでリストボックスで見やすく作ろうかと思ったのですが、印刷用でも
作成したいのでできるのであればご教授お願いします。
上だけなら、forの頭を指定して10番目ならfor i = 10TO 最終行
で行けると思うのですが表の最後の指定がわかりません。
forをネストすればできそうですが、それでも20番目でおわる形にする感じ?
21行目を2ページ目の1行目を指定するのは難しそう
- 207 :
- 伝え方って大事だよね
- 208 :
- >>206
21行目になったら次の改ページ位置を貼り付け先にする
- 209 :
- または上下の題名をヘッダフッタに指定して改ページを気にせず貼り付ける
- 210 :
- >>194
出来ました。大変ありがとう😊
- 211 :
- たまにpowershellの話題出るから聞きたいんだけどpowershellってUWSC見たいなことできるの?
- 212 :
- 特化してるUWSCみたいに簡単ではないけど
がんばればできる
- 213 :
- 頑張れば何でもできるだろうな。
VBSではWindowsAPIが使えない! → 裏でこっそりエクセル起動すれば使えるじゃん。
VBAではjavascriptが使えない! → ExecuteThisJavaScript使えば出来るじゃん。
殆ど屁理屈だけど。
- 214 :
- 要は徒歩でも世界一周できますよねってこと
- 215 :
- ジョジョ、逆に考えるんだ、『vbaの下に便利APIのExcelやAccessが付いているのさ』と考えるんだ
- 216 :
- >>211
>>212
>>213
出来るぜ。
−応ここVBAのスレだから言うけどVBAでも全部できる。
今流行りのRPAがやってることは全部出来る。
- 217 :
- ただ、VBSでWindowsAPIは苦肉の策というか、敬遠したい気持ちもある。
まっ、VBSが最適な話なら結局使うけどね。
VBAでJavaScriptも同様だね。
こっちの方が敬遠したい。
まずはVBAだけで何とかならないかを考える。
- 218 :
- >>216
まじかー
vbaでやれるっていうことはwinapiを使うって事だよね?
スクリーン上の指定座標の色の識別とかもできたりするの?
- 219 :
- 特定のアプリのウィンドウに対してキー入力するとかVBAでやってるよ
- 220 :
- Cells(1,"A")と書かず、判りにくいCells(1,1)と書くのはなぜ?
ネットの記述とか見ててもCells(1,"A")と書いてるの見たこと無い
- 221 :
- マルチかよw
- 222 :
- はわわ〜
- 223 :
- RPAは所詮VBAに勝てないか
っしゃああ
- 224 :
- forでまわせんだろうが
個人的にrangeをなぜ使うかの方がわからん
- 225 :
- ああ、cellsで表現できるのをrangeで表現するのが解らんってことね
- 226 :
- Range("B2:E6").Interior.Color = 65535
こんな場合は使うかな
見た目というかデータに影響を与えない部分はrangeの方が読みやすい、気がする
- 227 :
- 朕も同じくだわ
- 228 :
- Cells(1, "a")と書くならRangeを使えばいい
- 229 :
- マルチする迷惑な質問者多いな…
- 230 :
- 繰り返すときCells(i, 1)よりCells(i, "A")の方が判りやすいと思うけど
- 231 :
- 列方向に繰り返す時はどうするの
- 232 :
- むしろexcel側でR1C1形式がデフォルトになれば良いのに
- 233 :
- 列は作りながら足したり順番変えたりする事が多いので最初からenum作って管理する
cells(i, cols.hoge)みたいにしてる
- 234 :
- >>232
三四郎に対抗するためにこうなった
結果、シェアを勝ち取ったけど負の遺産として残ってしまったね
- 235 :
- アホか
- 236 :
- 経験則から言うと、エクセルのシートを入力フォームや書類のフォーマットのように捉えてる人はRangeを使いがちで、配列やテーブルとして扱えるオブジェクトの塊だと捉えてる人はCellsを使う傾向がある
- 237 :
- あるリストをユーザーフォームで絞り込んでそのユーザーフォームのリストボックスに
リスト内容を表示させたいのですがオートフィルタの表示はうまくいくってるのですがリストの表示
先がうまく表示されません。どうしたらいいでしょうか?
以下がコードです
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
- 238 :
- 変数で回す時はCells
セル位置が固定の時、範囲指定する時はRange
1行ごとにコード入力が楽な方を選んでる
- 239 :
- >>237
myData(Range型)にはフィルター設定情報は入ってない
一行一行をRow.Hidden判定しながら範囲内ループさせて取り込むしかないね
- 240 :
- 間違えたmyDataは配列か
それでもフィルター情報は乗らないね
リストボックスの.RowSourceに範囲アドレス入れて連動させる方法あるけど
これフィルターも連動したっけ?
- 241 :
- セルC5:C17に数値が入ってます(A)
セルF5:F21に数値が入ってます (B)
セルY5:Y25に数値が入ってます (C)
AとBの数値のうちCにない数値をセルO5から順番に下に抜き出したいんです
cを配列で格納するまでは出来たのですがそれ以降がわかりません
よろしくお願いします
初心者です
- 242 :
- 配列を検索すればいいだけでは
- 243 :
- >>242
すみません
その配列の検索が上手くいかなくて…
- 244 :
- 配列よりコレクションの方が楽では
- 245 :
- for i = 0 to ubound(配列)
if 配列(i) <> 検索したい値 then
どこかに出力
end if
next
こういう感じでいいんじゃないの
- 246 :
- >>244
コレクションっていうのがあるんですね
調べてみます
ありがとうございます
- 247 :
- 普通のCollectionや配列よりも、Cの値をKeyにしてDictionaryオブジェクトを作る発想の方がいいと思う
Dictionary.ExistsメソッドでKeyの存在確認ができるからコードが簡単になる
- 248 :
- Dictionaryは平均的なVBAerには理解できないから却下
他人に理解できないもん作るんならVBAを選ぶ意味がない
- 249 :
- dictionary楽なのに
- 250 :
- 連想配列の事をdictionaryって呼ぶんだっけか
すごい便利だけど、シートあるんだからシート使った方がいいんでない?と思う
二次配列が目に見えて編集し放題とか楽ちんすぎる
- 251 :
- みんなどうやってVBAそんなに詳しくなったの?
- 252 :
- 必要に迫られて作ってるうちに
- 253 :
- 休日まで費やして2000行くらいコード書いてるけどそろそろ嫌になってきた
- 254 :
- そのうち、休日に働いて会社でのんびりするようになるよ
あんまり良くないんだけど、プログラムは家じゃないと集中して掛けないんだよな
- 255 :
- >>254
あー、すごいよくわかる
- 256 :
- >>248
平均的なVBAerってのがどんな層を指してるかちょっと分からないが、Dictionaryが理解できない人ってそもそも配列やCollectionも理解できないんじゃないの?
- 257 :
- dictionaryの替わりにシートを使うという発想は無かったな
- 258 :
- シートが可視化された配列だってのはその通りなんだけど誰でもGUIで簡単に編集できてしまう点が逆に弱点でもある
値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし
- 259 :
- >>258
まぁねぇ。その辺は考えながらうまく付き合って行きたい所
- 260 :
- 連想配列ってどういうとき便利なの?
いまいち基本書の記述じゃメリットとか使い道とかがイメージできないんだけど
- 261 :
- >>260
配列で数字の添え字じゃなくて好きなワードを使いたい時に
あとDictionaryの場合は検索がめちゃくちゃ速いから大量データの検索に
- 262 :
- >>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
- 263 :
- 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
- 264 :
- >>260
Keywordが重複できないから必ず一意なデータセットができる。
- 265 :
- 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の動作をよく分かっていません
- 266 :
- >>260
existsが便利
数数えたり、行番号取り出したり、キャッシュの管理に使ったり
for eachで中身を全部取り出そうとしたら投入順が保証されないのが少し残念
- 267 :
- 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
- 268 :
- >>254
>>255
ホント。
プログラムに対する理解のないバカ上司とか、
コーディングの真っ最中に、平気でコピー取りを要求してきたりするからな。
- 269 :
- >>267
ファイル番号は1-255の範囲で常に固定値でやるなら引数で渡さずにどこも#1でいいかと思う
FreeFileって関数があってこれは番号を任意に付番してくれるので
たとえば
Dim nNo as Integer
nNo = FreeFile
Open .... #nNo
って書くこともできる
このnNoを引数に指定してもいいかもね
- 270 :
- >>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
- 271 :
- >>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の方が動作も早いしね
- 272 :
- >>270
自分は見たことないですね
なんとなくですが自分は常に#をつける派です
それとcloseも#nNoかと
- 273 :
- 言語リファレンスでも#は省略可能となっているだけで、説明はどこにも見当たらない
古いBASICとの互換性で残してあるだけだと思う
- 274 :
- >>272-273
あれ、じゃあなんでしょうねこれ
コンソールで
?#1
ではエラーになるので、ただの数値ではなくなるみたい
#1=2
も出来ない。なんとなくリテラルか参照っぽいですが、何でしょうね
openなどの時にしか使えないのでしょうか
- 275 :
- >>271
ありがとうございます
コレクションを選択した理由は特にありません
(あえて挙げるなら、コレクションにまとめるリファレンスが最初に目に付いた です)
>pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
言葉足らずですみません。Diaryクラス側ではpIDが重複しdIDが主キーとなるので、一意に取得できません。(この認識も間違っていたらすみません...)
エラー処理がExistsで済むのは明確なメリットですね。Collectionでは、調べた限りではOnErrorGoToで飛ばす方法しか見つけられませんでした
ひとまず、Diary側のループで取得したpIDでPersonDictionaryにExistsをかける 方法を試してみようと思います。
- 276 :
- >>274
#1の中身は文字列じゃないよ
- 277 :
- >>274
> openなどの時にしか使えないのでしょうか
そう言うことだろ
- 278 :
- >>275
複数のDiaryインスタンスが共通のpIDを持つならば、連結を二重化したらいいんじゃないだろうか
まずpIDをキーとするDiary用のDictionaryをまず作っておいて、
同じpIDを持つDiaryインスタンスをまとめたDictionaryかCollectionをItemとして持たせる形にすればいいと思う
構造的に表すと
(Key[i] = pID, Item[i] = (Key[j] = dID, Item[j] = Diary))
みたいな感じ
- 279 :
- 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
では表示はされるのですがうまくいきませんでした。
- 280 :
- >>278
重ねてありがとうございます。
なるほど。Dictionaryの各要素を、そのkeyに対応するインスタンスの集合とするんですね
1key対1レコード という考えしか無かったので目から鱗です
- 281 :
- >>279
説明する時「うまくいく」とか「うまくいかない」という単語は使ってはいけない
- 282 :
- >>279
どういった表示がされて、実際に欲しい情報とどこが違うでしょうか?
Range("D:L")をken4で完全一致検索をかけ、最初に見つかったセルの行番号を取得
その行のC列セルの値をsiriaruに代入
という点ではプログラムに間違いはありません
- 283 :
- >>280
その通り
そのようにすれば、Diaryのインスタンス集合全体に対してpIDの存在確認をすることも出来るし、pID, dIDという2つのプロパティ値を使って目的のDiaryオブジェクトを取り出すこともできる
- 284 :
- >>279
siriaru=ws_siriaru.Range("C" & rng.Row).Value
- 285 :
- >>279
siriaruに値を代入するときに参照しているシートがシリアルのシートじゃなくて別シートになってると思う
siriaru = ws_siriaru.Range("C" & rng.Row).Value
に変えたらうまくいくのでは
- 286 :
- >>270
close もopenと同じ番号のnNo によ
- 287 :
- >>236
最初からVariantに入れるのが正解では?
- 288 :
- >>287
Variant型は便利だけどRangeオブジェクトを突っ込むためだけの変数で使用するにはねぇ
実際のデータ型を明示しないぶんコードが読みにくくなるしコーティング時にインテリセンスも利かなかったりとデメリットの方が目立つ
実行時エラーの原因って感じ
- 289 :
- リストの表示について
以下の表示の際最終行後ろのセルが空白だった場合最終行が表示されません。
なぜでしょうか?
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
- 290 :
- >>289
M列で値が入ってる一番下のセルまでが範囲のようだが
- 291 :
- >>289
あなたsiriaruの人でしょ
もういい加減お金払って誰かに教えてもらうか、MSDNのVBAのリファレンスを読み込んできちんと勉強すべきだとおもうよ
会社で使ってるマクロのコードベタ貼りしてるのも本当に宜しくない
今回の問題は、せっかくLastRowにA列の使用セルの最終行の行インデックスを格納しているのに、myDataに入れる値のセル範囲指定でそのLastRowの値を使っていないことが原因でしょ
自分の頭をちゃんと使って書いてる?
myData = .Range(.Cells(1, 1), .Cells(LastRow, 13)).Value
と書き直せば終わり
- 292 :
- この人の問題は質問内容よりも質問文が意味不明なこと
状況を全く何も知らない相手に説明するということを考えながら質問文を書くようにしよう
- 293 :
- こういう構造的思考力のない人がコピペ&コピペで作り上げた野良マクロが企業の負債になっていくんだよね
- 294 :
- ワークシートのスクリーンショットとか図で説明してもらわないと訳がわからない
- 295 :
- .Net系もやってる人に質問です
列挙体に属性付けて指定すると数値の他に定義した文字列返す方法があると思うんですけど
アレをVBAで行う方法は有りますか?
Constで定義すれば出来ないことは無いんですがなんかダサくて・・・
- 296 :
- >>295
構造体配列とかクラスとかで擬似的に再現するしかないんじゃないの
- 297 :
- >>295
どうでもいいだろ
VBAなんか使ってること自体が恥辱なのに何を今更
- 298 :
- >>295
簡単には無理でしょ
.NETも取得するのはそれなりに面倒だし
- 299 :
- >>296
そのためにクラスを作るとVBAの場合はひとクラス1モジュールファイルを切らないといけないし、
フォルダ分けも出来ないので、クラスを作る方法は後々クラスファイルが煩雑になる可能性があるのでやめておきます。
構造体や配列を使うのは少し大掛かりな気もしますが、お陰で何となくイメージがわきました。
DictionaryとかCollectionとかのValueペアのオブジェクトを使って、key側にenumで使用している番号、
Value側に文字列を設定して、enumに紐付けてやるような感じでやろうかなと。
ただ、修正が入るときに手間が掛かるようだとあまり意味がないのでその辺の構成は気をつけて作るような
感じですかね。ありがとうございました。
>>297
どんな言語だろうと自分なりに構成を考えて作っていくのは大事だと思いますよ。
今回の件は無理して作る程のものではありませんが
きちんと部品化しておけばまた違った局面で使うことが出来るので、
自分のためにも、引き継ぐ人のためにも大事だと思います。それはどの言語でも同じでしょう。
- 300 :
- 引き継ぎを考えるなら郷に入れば郷に従えで普通にプレーンに書いた方がいい
VBAに限ったことではないけど、変なオナニーされるのが一番迷惑なんだよ
- 301 :
- >>297
なんでここに居るん?
- 302 :
- >>295
ダサくてもそれが今の実力だからな
- 303 :
- >>295
それは.NetでExcelを動かせばいいんじゃ・・。
- 304 :
- >>299
値のペアを返す参照構造を作りたいんだったらワークシートを素直に使ってハッシュテーブルで運用した方がメンテ工数が少ないのでは
ワークシートはGUI化された多次元配列なのでね
セルの値の読み書きでイベントハンドラに制御が渡るのが嫌なら別だが
- 305 :
- フィルタされたデータをシート上で複数繋がった状態で選択したとする。その場合にそれら『のみ』を取得することはできるんだろか?教えていただきたいです。
バージョンはexcel2016です。
例)
以下がフィルタされたセル。
A1←選択
A4←選択
A5
上の場合にA1とA4のみを取得する。A2とA3は取得しない。
- 306 :
- フィルタ抽出されたセル範囲だけを取得したいなら、
Range("A1:A5").SpecialCells(xlCellTypeVisible).Select
の一行で終わると思う
Range.SpecialCellsプロパティが可視セルだけを返すよう、引数に列挙定数xlCellTypeVisibleを渡せばいい
Range("A1:A5")のフィルタ範囲は必要に応じて変えてね
- 307 :
- >>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
最終列の最終行を取得してたのでそこが空白だと最終列が反映されないことが判明しました
- 308 :
- >>307
間違ってるけど…
- 309 :
- >>307
読んでて頭痛のするような酷い文章だな
デバックじゃなくてデバッグだろ
しかも単なるコード改変のことをデバッグとか言ってるしさ
本気でデバッグしなきゃならないときにスキルのないこういうコピペコーダーは何の役にも立たないのに
会社の資産であるコードをこんな掲示板に晒しといて何やってんだか
- 310 :
- >>307
しかもコード間違ってるし
- 311 :
- >>309
会社の資産でもなんでもないけど?
1から自分で休日に作ってるんだけど?会社で使うものでもないんでw
- 312 :
- >>311
仕事でもないのにわざわざVBAを使うってただの苦行じゃん
PythonとかJavaScriptとか使えばいいのに
- 313 :
- インターネットからまるまるパクることを1から自分で作るとは言わない
- 314 :
- 控え目に言ってアホだよな
- 315 :
- vbaの話で別の言語とか出してマウント取りたい人って何なんだろうね
職場の同僚も大変そうw
- 316 :
- 何か心に刺さったのかな?
他言語持ち出されたときにマウント取られたと思うのは大抵そう受け取る側に問題があるぞ
- 317 :
- >>316
一応ここVBAのスレだから
せめてJavascriptやPythonでExcelが扱えるようになってから来なさい
- 318 :
- 前提もなしに>>312みたいなこと書くやつは要らんっていう話だろ
- 319 :
- 結局なんらかの形で表データを閲覧するならエクセルで閉じた方が楽だなと思う
- 320 :
- 結局、表入力が簡単で確実なんだよな
なんつか心配がいらない
処理はpythonのほうが楽だがエクセル
ファイルのみで管理できるってことも含め
総合的にはVBAいいんだよね 雑な意味で
データと処理が一つにまとまってるんで
オブジャクト思考的ってか
- 321 :
- 発音に「ャ」の要素はないかと。
- 322 :
- API呼び出せるんだから
大概のことはVBAでどうにか
なってしまうんだよな。小さい会社、つまり
会社の9割以上はVBA程度で
十分なんだよな まあVBAがおもちゃで
なくてはならないって立場は分からんでもないがw
- 323 :
- エクセルの表から始まる作業ならVBAがいいとおもうよ
例えば客からの電話注文をエクセルに一度まとめていて、それを管理画面に反映させる作業とか・・・
スクリプトを動かす必要のないサイトならブラウザ開かずにボタンポチで完了するし
(いつもちゃんと登録されてるのか不安がられるが)
- 324 :
- 俺ならそういうのはGoogle Spreadsheet使うかな
一旦ローカルに置くのは無駄
- 325 :
- >>324
みんなエクセルで管理したがるので
- 326 :
- まぁVBAやって育ってくるとその内
VB.Netとかやるようになって
Web系を扱うようになると
ASP.Netとかやる機会も出て来るから
SQLと同じようにHTMLとかCSSとか
JavaScriptとか必要に迫られて
片手間で覚えるようになるから大丈夫。
別に今のままで良ければそのまま
VBAやってればいいわけだし。
- 327 :
- VBAの最大のデメリットは何でもVBAでやろうとする脳になる事
こんな化石のような言語でやるのは苦行そのもの
今更覚える意味すらない
- 328 :
- そんな意味のないもののスレをわざわざ見に来る意味はあるの
- 329 :
- >>322
さすがにエクセルで納品ってわけにいかないから
適当にインターフェースつくるが中身はVBAで
十分ってのはあるな
>>327
そんなに言語仕様クソか?
小綺麗にまとまってると思うけどな
純粋さはないが使い勝手は悪くない
- 330 :
- 時代遅れ感があるのと、どう書くべきかが分かりにくいのと、エラーメッセージがクソなのを除けばそこまででもないな
シートモジュールやブックモジュールが邪魔すぎる。標準モジュールだけで良かった
そしてエラーメッセージの「修正:式」はあまりに不親切。ここはアップデートかけてくれてもいいのに
- 331 :
- 他の言語と比較すればマトモだと思う
- 332 :
- >どう書くべきかが分かりにくいのと
それは言語の問題じゃない。
英語の文法はわかりにくい → そりゃお前が日本人だからそう思うだけだろ!
日本語の文法はわかりにくい → そりゃお前がアメリカ人だからそう思うだけだろ!
- 333 :
- 出ました定義したがりw
- 334 :
- >>333
え?
違うの?
じゃあわかりにくいのは、あんたの能力の問題だね。
俺にはわかりやすいから。
- 335 :
- シートモジュールとブックモジュールはただのクラスモジュールだからなぁ
コンストラクタとデストラクタがないぶんシートモジュールだけが特殊だが
- 336 :
- そう、オブジェクトが何か分かっていれば何の問題もない
しかし現実問題、Excelを使うのは一般事務。setっていつ使うのかなかなか理解できない層が中心なのだ
- 337 :
- implementsステートメントで組み込みのワークシートオブジェクトのインターフェースを継承すればシート用モジュールになります、って感じの仕組みならよかったよな
ユーザー定義クラスだって属性宣言を先頭に持って来ればクラス用モジュールになりますって感じの扱いで良かったし
- 338 :
- オマイラのスーパーテクを俺に継承してくれや。
- 339 :
- >>338
VBAを上手く使うというのはつまるところ「可能な限りVBAを使わない」なので教えろと言われても難しいな
業務フローのレベルからVBAが最小限になるように設計するんだよ
- 340 :
- PowerQueryとかPowerPivotとか標準的なExcelの組み込み機能で出来る作業をVBAでやってるのを見るけどああいうのも時間の無駄だわな
- 341 :
- vbaで何でも出来るから全部vbaでやる・・・それがシンプルでカッコイイ事だと思いこんでいた時期がありました
- 342 :
- 武器を持った奴が相手ならVBAを使わざるを得ない
- 343 :
- >>339
>>340
>>341
レスありがとう。万能なExcelに選ばれた言語、それが、VBA!
VBA王に俺はなる!
- 344 :
- >>343
そんなこと言わんと
VBAをとっとと卒業してC#辺りに入りなさいな。
他の言語も勉強するとVBAのコードの組み方もガラッと変わるよ。
例えば.Net系をやればクラスやインターフェースの理解がグッと深まるから
テスト項目も減らせる組み方が出来るし、変更点の改修も少ない組み方が出来るようになる。
- 345 :
- そういう所まで進みたい人とそうでも無い人がいるって事を理解しなよ
- 346 :
- >>345
どちらにせよVBAを極めても意味はないという帰結に違いはないな
- 347 :
- 本当にプログラミング好きな人はVBAじゃ満足しないだろ
VBAを極めるとはどういう状態かわかりませんが
- 348 :
- >>346
ちょっと理解出来ないです
- 349 :
- 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を通れば変数を定義出来ると思っていたのですが、どのようにすれば解決できますか?
よろしくお願いします
- 350 :
- 改行エラーが出てしまったため2つに分けました
VBAを使い始めて1ヶ月弱なのですがC#でエクセルを操作出来るようになりたいと考えております
VBAで作ったプログラムを元にして、C#を学ぶ方法は無いでしょうか?
書き方が全然違うとの話を聞いたので、諦めて最初から覚えるしかないかと途方に暮れております
よろしくお願いします
- 351 :
- なんでvbaでできる事をいちいちC#でやろうとするか意味解らんよ
- 352 :
- 今後C#を使う予定であれば、VBAで出来る事だとしてもC#を使う時間を増やした方が習得が早いと思ったからです
- 353 :
- >>349
一番目のIF文の条件間違えてね?
これだとNothingのときに中で使うことになっちゃうよ
- 354 :
- 文法が全く違う言語だから何をどう頑張ろうがベースにはできない。
せいぜい同じ結果を出せるかどうかの演習材料にしかならんよ。
- 355 :
- >>350
覚えるっていうか移植先の作法に従って書き換えるだけ
- 356 :
- >>349 書き直すけど
If ws1cell Is Nothing And ws2.Cells(r, 10) < 1 Then は
ws1cellがNothingのときじゃないと通らない。なのにそのあとでws1cell.Range〜とかws1cell.Offsetなんてやると当然エラーになる。
Not ws1cell Is Nothing みたいに反転させないと。
- 357 :
- セルがどういう時にnothingになるのか分かって条件に指定してるのか怪しい気がする
- 358 :
- >>350
VBAやって一ヶ月ならそのままVBAやっておけばいいよ。別に急いでるわけでもないんでしょ?
VBAやってツールの幾つかでも作って、コードがそらで書けるようになったらまずVB.Netをやる。
文法はそっくりだけど構成が違うし見たこともない命令も沢山あるから多分苦労すると思う。
でもここさえ乗り越えてしまえばObject指向の何たるかが大体解るようになるからそうしたらC#に入ればいいよ。
C#はVBA→VB.Netのときとは逆に構成がVB.Netとよく似ていて文法が違う。あと型が厳しい。
でも、ま、VB.Netを覚えてしまえばC#も7割方理解したって言えると思う。
何も手を着けてない状態なら最初からC#をやることを勧めるけど
折角VBA始めたんだから遠回りにはなるかも知れないけどそういう楽な方法もあるよ。
- 359 :
- それ以前に>>349は
> 項目名が違う時にエラーが出てしまいます
じゃなくてどの行でどんなエラーが出てるのかを書けよ
ID:Kd4kiXAf0は超親切だからレスしてくれてるけど普通はスルーされて終わりだよ
- 360 :
- >>356
条件が反対だったんですね…
If文の条件をもう一度書き直してみます
丁寧にありがとうございます
>>355
>>358
将来的にはエクセルに集約しすぎて重くなってしまっているデータを、誰でも使えるように軽くしたいと考えている位なので、まずはプログラムに慣れて行きます
プログラムの考え方だけでも次のステップの練習問題には使えると思うので、数をこなしてみます
ありがとうございます
>>359
すみませんでした
次から質問する時は気をつけます
- 361 :
- >>349
関係ないけど変数の中に何か入れることを定義とは言わない
定義はDimの行でやっている
- 362 :
- >>361
もっと細かく言うとDimでやっているのは定義ではなく、あらかじめ定義されたデータ型の適用を宣言してその型に適合したメモリ領域を確保することなんだけどな
未知の型を宣言するとエンジン側で型検査できずにコンパイルエラーになることを考えたら分かる
- 363 :
- >>360
そういう目的があるならまず覚えるべきはSQLだね
VBAだろうがJavaだろうが.Netだろうが
どの言語をやっていてもデータベースを扱う限り
SQLはまず使わないことがない。
ま、中にはEntityFreamworkなんてSQLを使わずにDBに同期してデータを
引っ張るなんて場合もあったりするけどSQLは最初の内に覚えておいて絶対損はしないよ。
- 364 :
- >>363
VB系言語はそれだけやってると変な癖がついて他言語への適応が困難になるから、
プログラミングの基礎の基礎だけ習得したらあまり使い込まないですぐに他に移った方がいいよ
- 365 :
- >>364
そこは割り切り。
どうせどんな言語やってたってちょろっとしたツールを作るには
VBAでやった方が手っ取り早いことの方が多いんだから。
どの仕事場でも大概Excelは入っているしね。
それにVB系は癖が強いから他言語の習得を阻害するというのも
個人の適応能力やセンスによるものも大きいからちょっと何とも言えないし。
むしろ俺みたいに適応力やセンスが皆無なら
やれ構造化言語だ、object指向だ、関数型言語だって変わるたびにチンプンカンプンなところから始めるから
結局否応なくその言語に合わせることになるんだけどね。
- 366 :
- .netを始める上での壁は文法や型なんかより膨大なクラスを把握することだからVBでもC#でも手間は変わらん
しかも日々増殖したり仕様が変わったりするから手に負えない
- 367 :
- VBAは枯れに枯れた技術って意味で物凄い安定感がある
>>365
さすがに関数型言語はもう無いんじゃね?
一時遊びでlispやってたけどあれは頭の切り替えに難儀した。あれが業務だったら退職しますわ
- 368 :
- >>367
ちょい前までExcelに入るんじゃないかって噂で騒がれてたPython、あれ関数型言語だよ
- 369 :
- >>368
あれ、まだ関数型言語に分類されるのか
2の頃はそうなんかなl−と思ってたけど、3になるとすっかりオブジェクト指向担ったと思っていたのに
- 370 :
- うーん、なんて言うか
Microsoftが出してる言語、複数やったことがある人なら何となく知ってると思うんだけど
何か中途半端にとどめておくのが好きみたいな傾向があって、
例えばVBAや旧VB6なんかでもObject指向の概念は
取り入れてるんだけどインターフェースはあるけど
.Netでいう継承は出来ないとか
.Netでも関数型言語の概念は取り入れててlinqやrambda式が使えるけどデータ分析や機械学習が
出来ないって訳じゃないけど苦手だったり。
次に何か出るときはその変のことが統合されて
いい感じになったものが出るんだろうけど
多分次もその次に出て来る新しい概念を
中途半端に取り入れたところで落ち着くような
そんなことを繰り返すような気がするね。
- 371 :
- >>365, >>368
Pythonが関数型とか適応力やセンスの問題じゃなくて単なるアホやろw
- 372 :
- >>371
何となく言いたいことは解るけど
一応パラダイム対応してるからObject指向でも書けるけど
それだけだったら他に洗練された言語いっぱいあるしやっぱり関数型色が強いしね
- 373 :
- ここの人たちはどんなシステム作ろうとしてるんだ
事務処理をちょい効率化したい程度の簡単なプログラムならVBAが最高
- 374 :
- >>373
そうなんだよね。
よく「別言語の〜でやれば〜行で出来るのに」って
言う人がいるけどあれは違うと思う。
VBAは凄く間口が広い言語で
EXCELが有ればどこでも組める言語。
手軽だから何かをちょろっとやらせるには
非常に使い勝手のいい言語なんだよね。
特にExcelが絡んだときは。
間口が広いってことは初心者からお年寄りまで
誰にでも優しい言語だからそりゃ至らない部分も沢山あるけど
他の言語で簡単に出来る部分でExcelが苦手な部分を
どうやっていい感じに作りこんで行くかを考えるのもまた醍醐味。
例えばXNAとかでテトリス作った後でもう一回
じゃ、今度はVBAで作って見ようかなと思わせる
何かがある言語だと思う。
- 375 :
- >>372
どこを見て関数型と言ってるんだ?
パラダイムとか言いたいだけやろw
- 376 :
- VBAのいいところはほぼ会社のPCで普通にはいっているExcelでいろんなことができるようになることだろ
C#だなんだっていうやつは職場のPCにかってにVSとかいれていいとでも思ってるのかな
それをわかってないバカが多すぎ
- 377 :
- データの整理とか手作業でやらされてるのを、ちょっと自動化して楽したいだけなのに、なんでC#とか使わなあかんの
- 378 :
- >>376
今時のWindowsにはC#コンパイラは標準で入ってますけど?
> それをわかってないバカが多すぎ
自己紹介乙w
- 379 :
- ちょっとした処理のためにCOMのOfficeのGUIを起動させ続けなきゃいけないってのがVBAの最大の難点でしよ
単なるデータ整理をする環境として見るとOfficeは高機能すぎるし効率が悪い
PowerShellなんてWindows標準でSDKとCUIがインストールされてるしマルチプロセスもOKだからな
- 380 :
- Powershellは.NetFramework抜いたらただのshell
.NetFrameworkにへばりついてるただの寄生虫
- 381 :
- >>378
そのC#コンパイラが使いにくいw
メモ帳で頑張るのが苦痛だw
- 382 :
- >>379
寧ろ、OfficeのGUIが起動してるのが前提だよ。
ExcelのファイルをどうにかしたいだけだったらVBAである必要全く無いんだから。
- 383 :
- ちなみにここはVBAのスレであってExcelブックをどうにかしたいスレじゃない。
でも、なぜか競合しないのにVBAでないものを書く人が沸いてくるね。
- 384 :
- >>380
> Powershellは.NetFramework抜いたらただのshell
流石にそれはアホすぎ
パイプにオブジェクト流せるとか配列処理とか従来のshellとはかなり違う
- 385 :
- >>381
面倒と言うならわかる
VSなんて要らんよっていうだけの話だし
- 386 :
- パワーシェルってなんだよ
難しいな
- 387 :
- 理解したわ
- 388 :
- >>373
開発職やってるが、Excelじゃなくて他の環境で作るべきではと思うようなシステムをExcelて依頼されることがよくある
Excelっていう環境が使う側にとっても手軽で都合がいいんだろう
- 389 :
- >>388
俺は逆に発注側だけど、Excelの方が都合が良いというより、Excelしか想像できない奴に要件整理のタスクを与えて社内稟議まで通してRFP出してしまう感じ
Excelで作ろうが他のシステムで作ろうが発注側は中身が理解できないから取捨選択すらしてない
- 390 :
- ある意味閉じた環境だからテストが楽なんだよ
もちろん完全なサンドボックスではないけど
- 391 :
- >>388
それあるね。
ネットワークとユーザー認証絡む奴でExcelには向かないからWebとかで作った方が良いって言ったんだけどさ、予算が無いんだってさ。
- 392 :
- csc教えてくれてありがとう。世界が広がったわ。
エクセルで社内chatアプリとか作り放題できそう。
- 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)
- 394 :
- ↑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)
- 395 :
- ↑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)
- 396 :
- ハイパーリンクでどこへ飛ぼうとしているのか?
天国か?
- 397 :
- mychkbook.activate
range~
- 398 :
- >>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
- 399 :
- どうせ設定とかじゃね
- 400 :
- プログラムじゃなくて、プログラミング言語とは…驚いた
学生の頃、友人が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(青い芝)」からもじったもので、隣の芝が青く見えるほど、既存の言語の
不満を解消できるような良い言語にしたい気持ちを込めたという心憎い演出もあった。
- 401 :
- なぜ天才は日本語プログラミング言語を作ってくれないのか
- 402 :
- 日本語プログラム言語あるけど流行ってない
- 403 :
- 変数に2バイト文字使えるだけでもかなりありがたいぞ
- 404 :
- >>401
日本語が曖昧で向いてないだろ
- 405 :
- 自然言語のルールそのままでプログラミング言語を実装するわけじゃないから日本語が曖昧云々ってのはズレてる
英語のit とかtheyとかbeだって曖昧極まりないし
- 406 :
- >>403
> 変数に2バイト文字使えるだけでもかなりありがたいぞ
今時使える処理系の方が多いだろ
- 407 :
- >>404みたいなのは何も考えてない+自分に自信を持てないアホだから相手しても時間の無駄だぞ
- 408 :
- >>406
え、マジかわざわざ挑戦するようなことでもないから知らんかった、スマン
.NETはともかく他に何かあるんか?web系は全滅と思うけど変わってるのだろうか
- 409 :
- >>397 >>398
ありがとう。解決しました
- 410 :
- >>408
それこそVBAでも使えるしVisual Studioで使えるC/C++, C#, VB.NETはもとより、GCCとかPython3でも使える
- 411 :
- vlookupを最下行まで入れたくて、検索範囲を絶対参照にしたいんだけどできるの?
$maxrow$じゃだめだよね
- 412 :
- >>411
.Rows.Count
- 413 :
- 108万行探すつもりかよww
A:Aとかじゃダメなのか。
- 414 :
- 100行しかデータが入ってなくても、A:Aみたいに列全体にすれば自動的にA1:A100みたいに解釈してくれるよ
- 415 :
- >>409
どっちもあまり良いコードとは言えんよ。
activateは使わない方が良い。
その後のRangeの前を省略しない書き方のが良い。
- 416 :
- >>415
ApplicationレベルのWorkbookActivateイベントで何らかの処理を噛ませている可能性があるから、Activateメソッドが無意味とは言いきれない
- 417 :
- それは考えすぎw
ハンドラまで作れる人ならこんな質問しないよ
- 418 :
- Excelで、「行ごとに違う色をつけるが、1行目だけ何も色を付けない」というVBAの書き方を教えてくんさい。
- 419 :
- >>418
https://support.office.com/ja-jp/article/-1-行おきまたは-1-列おきに色を設定する-30002ce0-7a1c-4d70-a70c-4b6232f09f5e
VBAなど不要
どうしても一発でやりたいならマクロの記録を使えばいい
- 420 :
- >>418
3行目から始まる、4行ごとのsannpuru
色(65535の部分)はマクロの記録で取ってくれ
あともう少し真面目に聞いたほうが回答が尽きやすい
For i = 3 To 100 Step 4
Rows(i & ":" & i).Interior.Color = 65535
Next
End Sub
- 421 :
- >>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
- 422 :
- >>421
Ifにする必要がわからない
Range(Cells(1, 1), Cells(1, y)).Interior.ColorIndex = 0 を最後に入れるか、
最初に入れてForの開始行を1にしなければいいと思うんだが
上手くいかないとはどういかないの?
- 423 :
- そもそも2行目からスタートすればいいのでは
- 424 :
- 縞模様のテーブルスタイルをあらかじめ定義しておいて、テーブル変換してスタイルを適用してからテーブルを範囲に転換するのが一番楽だよ
- 425 :
- >>421
ifは見づらいだけだよ
100%、forを2から始めた方が良い
For i = 1 To z '繰り返し処理を使い、変数は1〜500
if i >1 then
'ここに全部入れる
endif
Next i
- 426 :
- >>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であったとと決めつけて処理するのはよろしくない。
- 427 :
- >>422-425
有難うございます。
間違いなく、Forのところを2行目からにする方が簡潔でいいと思うのですが、無理矢理if文を入れるとするとどうすべきかを知りたかった部分もあったので、大変助かりました。
- 428 :
- >>426
全く仰る通りです。
「00で塗らなければならない」ではなく、「何もしない」なのだから、そのように書くのが筋ですよね。
有難うございます!
- 429 :
- 奇遇判定なら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
- 430 :
- リーダブルコードとか読んでみたらいいんじゃないか
- 431 :
- z = 500 '最大行数
For r = 2 To z Step 2
'偶数
Next
For r = 3 To z Step 2
'奇数
Next
- 432 :
- Rangeをつかってセルの範囲を指定した後に
条件を付け加えて条件に合うまで自動で繰り返し処理を行って条件通りになった時に選択セルに文字や数字を入れるにはその下にIfとかで条件を増やしていけばいいの?
- 433 :
- >>432
条件が簡単で範囲が狭ければ上にあるようにselect caseが分かりやすい
for each c in range("a5:b20")
select case c
case 1
c=c+1
end select
next
- 434 :
- >>432
選択セルに入れるというのがナンセンス。
今、ユーザーが選択したセルに入れるという処理はあり得るけど、普通は選択せずに入れる。
- 435 :
- ExcelでOutlookのメールを処理することについての質問なのですが、ここのスレでよろしいでしょうか。
https://docs.microsoft.com/ja-jp/office/vba/api/outlook.items.getlast
getlastメソッドで、メールを取得するのですが、たまに取得できないことがあります。(たぶんNothing?が帰ってくる。Nothingでない可能性もある。)(メールアイテム以外でも動作確認済。)
getlastメソッドで、取得失敗した場合には5秒待機してもう一度getlastメソッドを行い、最大20回繰り返す処理にしても、たまにメールの取得に失敗します。
ログを確認すると、メールを受信した時間にエラーが起きているようでした。(自身が送信したメールであるかは未確認)
ちなみに、共有受信フォルダに対して処理を行なっています。
メールの取得がうまくいかない原因として何が考えられるでしょうか?
また対策もお教えいただければ。
よろしくお願いします。
- 436 :
- getlastしようとしてるオブジェクトが空なんじゃないの
当然何度やってもダメでしょうし
オブジェクトの指定を見直すしかないのでは
- 437 :
- >>435
マクロ実行のタイミングで新着がある場合に失敗することがある
- 438 :
- >>435
outlookの受信処理と競合して、完全にダウンロードされていないアイテムを掴んで処理が失敗してしまってるんじゃないかな
ActiveExplorer.CommandBars.ExecuteMso ("ToggleOnline")でオンライン/オフラインのモードを切り替えられるので、オフラインモードにしてから受信済のアイテムを操作してみたらどうかな
- 439 :
- >>438
解決に近い具体的な解決策ありがとうございます。
少し調べてみて明日組み込んでみます!
- 440 :
- >>439
438をポストした者だけど、共有メールボックスではコマンドバー操作を試していないので、うまくいかなかったら申し訳ない
- 441 :
- >>434
どういう事?
- 442 :
- 選択されてる範囲に勝手に入力されるのは困ると捉えるか
使う側が指定した範囲に効果を適用したいと捉えるかの違いでは
- 443 :
- >>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することはよくある
- 444 :
- このまえ職場のITの人が
「サーバがコケた」と言ってました。
「コケた」とはなんですか?
サーバに足が二本あってその足がもつれてサーバが倒れた?
- 445 :
- すいません
「いま選択しているセル(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の左端]を指定するのに
[選択範囲の右までの距離から、選択範囲の右までの距離を引いたもの]で
距離がゼロになったはウフフ としているのも
「・・・他にビシッとした命令文があるんじゃないかね」と思っているので
ここもご教示いただければ幸いです
- 446 :
- >>374
殿堂入りのコピペにしよう
- 447 :
- >>445
印刷範囲はActiveSheet.PageSetup.PrintAreaで取得できる
印刷範囲の右端列のうち選択セルRと同じ行にあるセル範囲を取得するならば、こんな感じになるかな
試してないのでうまくいかなかったらごめん
With ActiveSheet
.Cells(R.Row, .PageSetup.PrintArea.Columns(.PageSetup.PrintArea.Columns.Count).Column)
End With
- 448 :
- 列の右端左端の値を取ろうとxltoright/xltoleftを使ったやり方したんだけど、普通に値が入ってるのは大丈夫だったのだけど、計算式が入っているのはダメだった…
どうしたら計算式でも値が入ってる最終、最初の列の値を取れるのでしょう…
一応値貼り付けをしてみたけどダメでした。
- 449 :
- >>448
RangeオブジェクトのCurrentRegionプロパティで解決できる
- 450 :
- listviewが使えない状態でフルパスをドラッグドロップで取得したいんですが可能ですか。
vbsでバッチファイル経由でも良いのですが
excel上にマクロボタンを設置し
listviewのようにバッチファイル自体にドラッグドロップするのではなく
エクセル内にドラッグドロップしフルパスを取得したいです。
ご教示お願いします。
- 451 :
- OutlookとかVBAとかいつの時代を生きてんの?
そろそろ進もうよ
- 452 :
- うちもOutlook。しかも2007
- 453 :
- >>451
Office365でOutlookクライアントネイティブでマクロ実行するときもOutlook VBAが使えて便利だぞ
Excel VBAでもPowerPivotや PowerQueryみたいなモダンな機能を扱えるし何かと便利
あとVBAは古くて癖があるけど、やっぱりMS Office自体は有用だし、他言語でCOM生成したりMS Office Interopを使ったりする手間を考えたらVBAを使う手間と大差ない
- 454 :
- 【1 OSの種類 .】 Windows10
【2 Excelのバージョン 】 Excel2019
【3 VBAが使えるか .】 はい
【4 VBAでの回答の可否】 可
ちょっと頭のおかしい感じにしてみたんですけど、どうでしょう?
Sub 猿()
'@@@@@@@@@@@@@@@@@@
Dim 日本脳炎, 邪教, 脳梗塞
'@@@@@@@@@@@@@@@@@@
End Sub
Sub 呪呪呪呪呪呪呪呪()
'死死死死死死死死死死死死
Dim あああああああああああ
'死死死死死死死死死死死死
End Sub
- 455 :
- >>454
ここはExcelスレじゃない
- 456 :
- 33sands's blog: VBAでpushやpopができる配列クラスを実装しました
http://33sands.blogspot.com/2012/03/vbapushpop.html
このブログで、VBA自作配列クラスが公開されていたようですが、ファイルが消えていました。
ここで公開されていたファイルをお持ちの方はいませんでしょうか?
- 457 :
- いないよw
- 458 :
- WebArchive
- 459 :
- >>449
月曜日に試してみたいと思います。
ありがとうございます。
- 460 :
- >>456
そこに書いてある Ubound(配列) + 1 ってのは、よく見かける見る例で、
ループ内で使うと思うんだけど、毎回配列の最大数調べてたら遅くならんかなぁ。
俺は a = a + 1 にしちゃうけど、変わらんか?
- 461 :
- >>460
VBAでpushを実装しようと思うとこうするしかないぞ
- 462 :
- >>460
たいして変わらんし、多少変わったとしても次の
ReDim Preserve myArray(newIndex)
に比べたらゴミ
- 463 :
- >>449
currentregionプロパティで下記のは可能でしょうか?
ABCDEFGHI(列名)
q 12 33 q
A〜I列の内、B〜H列内で数字がある最初と最後の列番号を取得したいと思ってます。
通常では448に書いたようにB〜H列を指定して.ENDでxltoleft/rightを使い2行と2つの変数に結果を入れる事でできたのですが、計算式だとNGだったので(どちらもH列が帰ってきました)
- 464 :
- >>456
なんで作者本人に連絡取らんの
- 465 :
- >>463
計算結果が数値の最初と最後の列ってこと?
xlToLeft; xlToRight; はセルが空かどうかでしか判断できないから使えないでしょ?
開始列と終了列からそれぞれなめて、IsNumeric(.value) で判定しないとダメじゃないかな。
なんかいい方法あるけ?
- 466 :
- >>456
よく見てないけど計算量最適化できてなさそうだね
- 467 :
- >>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
- 468 :
- >>466
中身わからんのに計算量を推定できるとかエスパーかよw
- 469 :
- >>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つも無いとエラーになるから事前にチェックしておく
- 470 :
- >>469
これで数値結果を返すセルを拾えるの?
文字列結果を返すセルも捕まえるみたいだけど、、
- 471 :
- 数字限定?なら>>469は忘れて
- 472 :
- 今の時代でマルチスレッドが使えない時点で終わってる
- 473 :
- >>472
マルチスレッドプログラミングは難しいので、なにか適切な抽象化方策が言語でとられるべきかと
- 474 :
- >>468
Redimで連続アドレス領域を都度確保するのが効率悪いって言いたいだけなんだが
- 475 :
- >>467
やはり両方から確認しにいくのが確実ですよね。
他の部署から来るデータで2シートだけは単純に空白と数値だけなのですが、他のファイルにある1シートだけは計算式入ってたので…
まぁ、最初と最後だけ確認してから他の作業をさせればいいので、これ参考にさせていただきます。
ありがとうございました。
- 476 :
- >>469
数値限定なんです。
さらにその数値から●を他のシートに入力していくとかいうメンドクサイ作業も待ってるという…(そっちは早々に作りましたが)
ありがとうございました。
- 477 :
- >>474
どこからその都度確保なんて出てきたんだ?
>>456のリンク先のコードはサンプルでクラスモジュールのコードがそのままとかエスパーならわかるの?
- 478 :
- >>476
その作業、AccessとかPowerQueryでやった方がいいんじゃないの?
VBAだと車輪の再発明になる気がするぞ
- 479 :
- 面倒臭いからVBA使うんだろ
- 480 :
- AccessやPowerQueryを知らずに言ってるんだろうがテーブルへのクエリをExcel VBAでスクラッチする方が遥かに面倒だぞ
- 481 :
- 448のどこがaccess、powerquery向きなのか理解出来ない
- 482 :
- 最初からデータをDBへ入れて扱っていれば「端の値を取る」などというトンデモ要件はそもそも出てこないということだろう
業務ロジックの中でシートの右だの左だの何列目だのとシート上でのレイアウトに依存したコードが散乱するのは典型的な悪夢
- 483 :
- 448です。
元は手作業でやっていたのを自動化?したいとかで外の会社とかも関わってるので、DB化とかそういう話になるとメンドクサイ事になるらしいです。
自分は他から来ているので、あまり口出しできない状態。
あと、作業の行にカレンダーがあって、そのカレンダーに数字が入力されてる感じです。
なので月ごとに場所が変わったりするので…
そんなのが数百行あるので、少しでもその作業の先頭列が分かれば…と思っていたのですが…
- 484 :
- >>482
確かに…
Excelで手作業だったって事もあって、項目によっては行が結合されていたりとかもあってさらにメンドクサイ状態。
そのへんなんとかしてほしいのだが、そうなると外の会社との折衝にもなるらしいのでNGっぽい…orz
- 485 :
- プログラミングスレで聞くのが妥当か分からないけど
マクロの記録を使って「データ分析」ツールをSheet1、Sheet2....Sheet13と起動していくマクロを作ろうとしてるんだけど、どういうわけか「データ分析」で生成された表が現れるSheetと現れないシートにムラがある
規則性はないように思われる
なにかわかることありますかね
- 486 :
- Mac版でcontrol+Shift+5で%が付くようにしたのですがこの設定を元に戻すショートカットってありますか?
- 487 :
- userformの選択されているcheckboxのcaptionを変数にまとめてautofilterでデータ抽出しようとしているのですがうまくいきません
ちなみにそのような方法でautofilterをかけることは可能でしょうか?
よくわかんない質問ですいませんがよろしくお願いします
- 488 :
- >>487
たぶん。
確か、配列にして渡すんだったと思う。
任意の複数選択フィルタリングを記録すればどう書けばいいかすぐわかるハズ。
- 489 :
- 看護師の勤務表を作りたいけど何からやればいいか分からないです。教えてください
- 490 :
- 単純に勤務表ってだけなら表計算でできることなのでエクセルスレへどうぞ(厳密には表計算ですら無いけど)
VBAは大雑把に言うと表計算だけでは実現でいないことをやるための技術です
- 491 :
- VBA使わずに自動で1ヶ月分作れるんですか?
- 492 :
- Office365のカレンダーがいいよ
- 493 :
- その場合は必要
後出しで条件を追加すると話が長くなるし回答も二度手間になるので最初にやりたいことをきっちり説明すべし
- 494 :
- 配列に入ってる値をセルに一個ずつ入れたいのですが、
for i = LBound(配列) to UBound(配列)
Cells(i.1).value = 配列(i)
Next i
こう書くと型が違いますとエラーになります
どうすればいいですか?
- 495 :
- 勤務表を自動で作成したいとなれば、アルゴリズムの知識がないと実装できないと思う。ナース・スケジューリング問題とか調べてみるといい。参考になる文献が出てくる。ただ、いっそのこと有料ソフトを買った方が早い気がする。
- 496 :
- >>494
そらi=0から始まるけどセルに座標0はないんで
- 497 :
- >>494
range("a1").resize(Ubound(配列)ーLbound(配列)) = _
worksheetfunction.transporse(配列)
- 498 :
- 訂正
transpose
- 499 :
- Cells(i+1,1).valueかCells(1,1).Offset(i,0).valueにする
- 500 :
- >>489
馬鹿はR
- 501 :
- エクセル以外のソフトをインストール出来ないってアホみたいな環境はソッコーで辞めた方が良い
VBAなんて将来性もないクソ言語を覚える意味は全くない
本当に他の開発環境は無理なの?
冗談だよね?
- 502 :
- >>500
おう。お前が死んどけ
- 503 :
- >>494
取り敢えずみんなが言ってる通り配列のインデックスは0から始まるし
Cellは行にしても列にしても1から始まるのでそこんとこ気をつけなければいけません。
後はセル指定する際にはブック、シートも指定しておく癖をつけておくことをお勧めします。
- 504 :
- >>501
仕事場によっては、特に銀行系は
使うもの以外勝手にインストールしてはいけないところが多々有ります。
例えばJavascriptだけ使ってればいいのに
勝手にVisualStudoやTOMCATとかをインストールすると怒られるどころか
コンプライアンスの面から仕事場を退場させられる場合もあります。
EXCELは大概どこの仕事場にも入っているから
インストールしなくても使えるだけで、
当然入れてはいけないと言われたら勝手に入れるべきではありません。
むしろ「勝手にどんどん何でもインストールしていいですよ〜」なんて仕事場があったら
そこのセキュリティはどうなってるのか疑うべきと思われます。
- 505 :
- マクロを許可してる方がセキュリティ意識ゼロ
- 506 :
- 開発メンバーは基本何でもできるからしょうがないだろ
Excelマクロがだめなら開発環境の言語使うわ
- 507 :
- cmdとか使える時点でセキュリティも何も合ったもんじゃないと思うけどね
- 508 :
- >>496
>>497
目から鱗ですありがとうございます
早速明日試してみます
- 509 :
- >>503
ご教授ありがとうございます
めっちゃすっきりしました
やっぱり1人でうんうん悩むより聞いた方が早いですね
勉強になります
- 510 :
- 鱗付いてるとか爬虫類かよ
- 511 :
- >>502
R、クズ
- 512 :
- >>510
爬虫類のわけないだろ
- 513 :
- >>441
>>443
少し組める人は絶対にSelectを使わないという姿勢で組むものです。
何故なら無駄である上に速度が低下するので百害あって一利無しだからです。
しかし、ごく一部Selectしないと実現出来ない処理があります。
形式を選択して貼り付ける処理などがそれです。
それから>>443さんのおっしゃるようにユーザーに選択している場所を提示するためにわざとSelectする場合もあります。
- 514 :
- >>501
結構多いし、そもそもExcelだけでどうとでもなるから。
能力の低い奴はExcelのせいにするけど、こっちは君が対応出来ないことも出来るんだよ。
確かにどうにもならないことならその時にはじめて他のソフトを検討するけどね。
- 515 :
- >>503
>>509
配列の設計はどうにもならんの?
別に1始まりにも出来るし、2次元にすればもっと良い。
- 516 :
- >>504
勝手に入れる奴はそもそも居ないでしょ。
Excelは大概どこの仕事場にも入っているのは事実だけど、それが理由ではない。
入っていなければ最初から選択肢に無いし、このスレに書き込んでもいない。
- 517 :
- >>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もかけてしまいます。
どうしたら空白セルを除外することができますか?
- 518 :
- end ifの前にredim preserve 検索値(i)は?
- 519 :
- VBAのユーザーフォームはWindows98の時代で止まったまま
あれじゃあ恥ずかしいよね
- 520 :
- 2019でファイルを開いた時に、勝手にコンボボックスのクリックイベントが発動するんだけど、何で?
もちろん、ワークブックのクラスには何も書いてない状態。
2013ではそんな事なかったと思うんだけど。
このせいで、一切編集せずに閉じようとしても、いちいち保存するか聞いてくる。
- 521 :
- >>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
- 522 :
- >>520
アドインでアプリケーションレベルのイベントハンドラ動かしてるとかじゃないの
- 523 :
- ワークブッククラスの話までできるなら切り分ければいいのに。
- 524 :
- >>522
アドインを無効にしたり、
ワークブックオープンイベントの最初にEnd入れてみたりしたけど、ダメだった。
>>523
最悪は違う手を考えるけど、こんな変な仕様だったのか?と思って。
- 525 :
- ↑ワークブックオープンイベントの最初にEndって、アドインの方ね。
- 526 :
- ↑クリックイベントだけじゃなくて、チェンジイベントもだった。
何もチェンジしてないっての。
- 527 :
- >>525
Worksheet_Activateイベントあたりが悪さしてるんじゃないの
シートイベントってほんとにゴチャゴチャになりやすいから
- 528 :
- ある数値が範囲(***-***)や、範囲と単体の組み合わせを、カンマで区切っているのを降順に配列に格納したいけど、なんか上手くいかないです。
全部VBAでやろうとしているから…なのかな?と思い始めてます。
それ用のシートを作って、そこに1つずつ入れてソートさせた方が簡単…なのでしょうか?
- 529 :
- >>528
10, 5, 1-3, 6 7-9, 11
みたいに数字が並んでるのを、カンマ区切りの文字列ではなく数字の評価をした上で降順ソートしたいってこと?
まず今手元にあるコードを書いてくれ
- 530 :
- >>527
それも見たけど、ないなぁ。
ていうか、コンボボックスが置いてあるシートがアクティブじゃなくても発動するし。
2013では、VBAでオブジェクトにフォーカスを移すと、
初回のみカーソルが見えなくなる現象が起きたと思うけど、
その対策として何かやってたりして。
- 531 :
- >>528
VBAでもシートに書き出してからでもどっちも大した手間は無いよ
まず範囲を1-3なら1,2,3と展開して全体をカンマ区切りだけにしてから、
前者なら配列に格納→配列の中身を降順でソート
後者ならシートに貼り付け→ソート機能使えばいい
- 532 :
- >>530
実装レベルでの不具合の可能性もあるし、ブックのxmlだけが壊れてる可能性もある
コンボボックス以外のオブジェクトの挙動は試してみた?
- 533 :
- >>529
すまん、コード会社にあるから書けないけど、やりたい事はそんな感じ。
最初にカンマでsplitして配列に入れてからfor〜nextで0からuboundで最後まで繰り返して「-」になってる範囲を数字にバラしてその間の数字を作って配列に入れ直して…
とかやってたらコードぐちゃぐちゃ、頭の中もぐちゃぐちゃに…orz
- 534 :
- >>533
馬鹿には無理ってことだよ
- 535 :
- ソートを自前で書くのは速度的にもメリット無いし作業シート用意した方がいいと思う
そういうとこで苦労するのはちょっと時間の無駄かなとも思うし
- 536 :
- >>533
配列を作るところまでは多分いけるんだろうけど、問題はソートなんじゃないの?
配列のソートをサポートしてる.NETのArrayListオブジェクトはVBAでも使えるので、CreateObject("System.Collections.ArrayList")でインスタンス生成してAddメソッドで配列を渡して使うといいよ
Revereメソッドを噛ませてからToArrayメソッドで再度配列化して配列変数に再格納すれば一発で降順ソートされた配列を取得できる
- 537 :
- Excel2016/32bitで作成したマクロをExcel2019/64bitのパソコンに移動すると途中でExcel自体が落ちてしまいます
この場合、2019にしたこと、64bitにしたこと、どちらが原因と考えられるでしょうか?
- 538 :
- そのくらいしらべられないの?
- 539 :
- >>537
動かないマクロファイルのファイル形式は?
- 540 :
- >>538
調べてもわかりませんでした
>>539
xlsmです
- 541 :
- ちなみに動く時もありますがたまに落ちるという不安定な状態です
- 542 :
- また馬鹿が来た
- 543 :
- >>540
何をどう調べてどういう結果になったの?
- 544 :
- 533です。
結局分割をしたデータをセルに置いてソートをさせて配列に入れるコードで問題なく動きました。
ありがとうございました。
変にVBAてわ全てやろうとせずにすればここまで時間かけずに済んだのですね…orz
- 545 :2019/10/31
- どうせマクロ作った奴が手抜きしててエラーになったらApplication.Quit()してるとかじゃね
みんなエスパーじゃないんだからコード上げられないなら自分でチマチマデバッグしなよ
C++相談室 part137
次世代言語15 Go Rust Bosque Kotlin TypeScript
【SL4】Windows Phone 7 アプリ開発スレ Part4【XNA】
C言語なら俺に聞け 155
クロージャって何がいいの?
C++/TemplateMetaProgramming
【糞.NET】裏切り者には死を【アンチゲイツ】
Google App Engine for java
Visual Studio Code / VSCode Part7
本当に必要ものは人工知能ではなくて検索エンジン
--------------------
2ch史編纂室 その3【議論・雑談はこちらで】
作者の執念を感じたフリーゲーム
立川バカ
■■■■ ダラダラハゼ〜ってプーチャカピー2 ■■■■
「連帯ユニオン関西生コン支部」の捜査は、福島みずほ絡みのもよう ネット「笑えるくらいマスコミがだんまり」「みずぽの内縁は中核派」
さすがにパチ屋も新型コロナで着実に危険になってきたな
2019年セ・リーグ限定戦力分析スレPart232
バーチャルYouTuber総合#176
【PS4】Dreams part5
【有機EL】Panasonic有機ELテレビ VIERA総合Part7
【ISLAND】御原凛音はEDでは日光浴びてるかわいい
☆韓ドラファンの雑談スレ・121★
【買うだけ】既製品だけで満足な人いますか?
90ないの和虱 〜飛べないコテはただのコテ!?〜
Steamの面白くて安いゲーム教えて Part260
日本男子プロレスの王者が力道山とすれば女子プロの王者は誰?
特撮視聴率議論・雑談スレッド89%
朝日新聞への批判は「ヘイトスピーチ」である!
7日間スープダイエット42日目
∬∬∬ザスパクサツ群馬294湯目∬∬∬
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼