19/09/16 19:34:59.04 emfTAhXr0.net
!extend:checked:vvvvv:1000:512
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part62
スレリンク(tech板)
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2:デフォルトの名無しさん
19/09/16 19:37:44.33 oeAiWNxe0.net
ぽこちん
3:デフォルトの名無しさん
19/09/16 20:59:24.42 dQXELjkB0.net
ちんぽこ
4:デフォルトの名無しさん
19/09/16 21:35:06.62 umLXld9Q0.net
おつちん
5:デフォルトの名無しさん
19/09/16 21:37:35.26 +LXKkUCe0.net
糞レスで埋めるなら前スレの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:デフォルトの名無しさん
19/09/16 21:50:00.95 oeAiWNxe0.net
ぽこちん
7:デフォルトの名無しさん
19/09/16 22:04:26.30 mBMfeEcT0.net
全部丸投げの教えてクレクレは死ね
8:デフォルトの名無しさん
19/09/17 00:12:51.48 QL/1GsWjx.net
LongLong型に定数値として4,294,967,296を与えておきたいのですがLongの範囲を超えているせいか、必ず後ろに#が付いてしまいます
用途としては強引にunsigned Long的に使う為のオフセットなのですが#を付けない方法はありますか?
9:デフォルトの名無しさん
19/09/17 00:26:07.74 dEY9k2Om0.net
Verylong型
10:デフォルトの名無しさん
19/09/17 01:14:04.05 chWRxzLY0.net
ちんぽこ
11:デフォルトの名無しさん
19/09/17 05:14:20.51 x3oFyaLA0.net
>>8
式は書けないんだったっけ…
12:デフォルトの名無しさん
19/09/17 12:34:56.30 WreyM4md0.net
LongPtr
13:デフォルトの名無しさん
19/09/17 19:25:37.80 gAW2iwiH0.net
前スレの最後でセルに色をつけるコードを作って頂いた者です。職場で試してみましたが思い描いた通りに動いてくれました!これを機に自分で作れるように勉強したいと思います。作って下さった方、本当にありがとうございました…!
14:デフォルトの名無しさん
19/09/17 19:44:50.07 1jOFcYgS0.net
ぽこちん
15:デフォルトの名無しさん
19/09/17 22:00:10.80 g2VoYh6px.net
スレチなのは分かってるけど詳しい人がここにしかいなさそうだから、もし知っていたら教えてほしい
ブックに保存されたクエリをOLAP等で使い回すためにODCファイルとしてエクスポートしたいんだが、「既存の接続」コマンドからクエリのプロパティを開いても「接続のエクスポート」のボタンが無効になっていてうまくエクスポート出来ない
どうしたらうまくエクスポートできるのか知りたい
16:デフォルトの名無しさん
19/09/18 00:53:52.38 2k/sPvaQ0.net
珍ぽこりん
17:デフォルトの名無しさん
19/09/18 02:08:49.51 IoDIi0WV0.net
すみません。
エラーが分からず・・・教えてください。
下記コードで、”型が一致しません”というエラーが出ています。
Dim Ringi1 As Worksheet
ThisWorkbook.Activate
Set Ringi1 = Workbooks(Range("B6")).Worksheet("Sheet1") ←エラー
ThisworkbookのB6には”テストファイル.xlsx”が入っています。
よろしくお願いします。
18:デフォルトの名無しさん
19/09/18 02:37:53.20 6F01cvXOx.net
>>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:デフォルトの名無しさん
19/09/18 06:35:56.16 2k/sPvaQ0.net
ポコポコてぃんてぃむ
20:デフォルトの名無しさん
19/09/18 07:18:06.31 Sjvl4q9oM.net
>>8
つけないのは無理だったと思う
今スマホだから試せないけど # が嫌というだけなら ^ ではどうかな?
URLリンク(docs.microsoft.com)
21:デフォルトの名無しさん
19/09/18 19:03:21.51 2k/sPvaQ0.net
てぃむてぃむ
22:デフォルトの名無しさん
19/09/18 22:18:32.08 TxLlA7PYp.net
ブックAのシート1~iまでのA1セルの数字を合計した数字をブックBのA1セルに転記したいのですが、どう書けばいいでしょうか?
23:デフォルトの名無しさん
19/09/18 22:31:17.98 ZRtblFe80.net
>>22
マルチポストはやめよう
24:デフォルトの名無しさん
19/09/19 00:39:56.20 oPZRSehu0.net
VBAのエディタに未だに慣れない・・・visual studioみたいな至れり尽くせりな開発環境があればなぁ
25:デフォルトの名無しさん
19/09/19 00:47:56.32 ARAzw0xg0.net
>>24
アドオン入れるなり作るなりするとマシになる
26:17
19/09/19 01:19:41.82 vxcA2ILs0.net
>>18
コードをヒントにして、成功しました!
ありがとうございました。
めっちゃお優しいですね!!
27:デフォルトの名無しさん
19/09/19 05:46:15.64 0eG7NBUp0.net
あいうえお
28:デフォルトの名無しさん
19/09/19 07:26:47.06 F8eVIa9Rp.net
>>23
初めてなので許してください
そして教えてください
29:デフォルトの名無しさん
19/09/19 08:12:52.96 wmMzcbeOd.net
>>25
オススメ教えて
30:デフォルトの名無しさん
19/09/19 08:47:06.93 0eG7NBUp0.net
かきくけこ
31:デフォルトの名無しさん
19/09/19 12:51:43.71 sRgRNGS8M.net
なにぬねの
32:デフォルトの名無しさん
19/09/19 14:11:18.92 I3ATuKNad.net
>>22
ブックAのシートでループ
33:デフォルトの名無しさん
19/09/19 14:27:24.46 nfvzk0j90.net
>>28
死ね、馬鹿
34:デフォルトの名無しさん
19/09/19 14:54:49.69 F8eVIa9Rp.net
>>33
うるせえウンコマンクソして寝ろ
35:デフォルトの名無しさん
19/09/19 15:37:32.90 nfvzk0j90.net
馬鹿の本性なんてこんなもん
36:デフォルトの名無しさん
19/09/19 19:53:05.48 ARAzw0xg0.net
>>28
ならマルチポスト放置してないで一つに絞ろう
37:デフォルトの名無しさん
19/09/19 21:51:25.54 0eG7NBUp0.net
らったったっらたた
38:デフォルトの名無しさん
19/09/19 22:19:21.08 vxcA2ILs0.net
すみません。
考えてもわからないので教えてください。
Dim Wb2 As Workbook
Set Wb2 = Workbooks(Range("B7").Value)
エラーメッセージ:インデックスが有効範囲にありません。
B7セルには<テストファイル.xlsx>が入っているとします。
Workbookにワークブック名を入れようとしているのですが、
なぜエラーなのでしょうか・・・?
39:38
19/09/19 22:33:23.12 vxcA2ILs0.net
SetするWorkbooksは、ファイルが開いていないといけなかったんですね。
自己解決しました。
失礼しました。
40:デフォルトの名無しさん
19/09/19 22:48:56.33 NLchELHJr.net
>>39
dドライブ直下にあるとして
Set Wb2 = Workbooks.open ("d:¥" & Range("B7").Value)
なら自動的にファイルを開いてオブジェクト扱いになる
41:38
19/09/19 23:03:19.82 vxcA2ILs0.net
>>40
そんな書き方もあるんですね!
勉強になります。
(私のコードは無駄が多そう・・・。)
42:デフォルトの名無しさん
19/09/20 00:09:35.56 SAxa71i50.net
変に答えると幼稚な馬鹿がつけあがる
43:デフォルトの名無しさん
19/09/20 01:19:15.21 L4svxBEcM.net
と、幼稚な馬鹿が申してます
44:デフォルトの名無しさん
19/09/20 18:45:01.71 nQBbqzQu0.net
あかさたな
45:デフォルトの名無しさん
19/09/20 20:42:04.97 L83O/vz70.net
VBAからIEを操作してhtmlで書かれたデータを取りに行くコードを書いています
ターゲットのサイトでは、一度に20件のデータしか表示されず
一番下までスクロールするたびに20件ずつ追加されます(データは全200件です)
htmlでは、20件のデータの下に「::after」と書かれており、スクロールが一番下に近づくと
新たな20件がロードされ、その下に「::after」が現れます
質問ですが、一度に200件全てのデータを取るためにはIEでスクロールさせる必要があるように思いますが
その場合、SendKeysを使って、SendKeys "{PGDN}" のようにするしかないのでしょうか?
それとも他に、何か良い方法があるようでしたらアドバイスをいただきたくお願い申し上げます
46:デフォルトの名無しさん
19/09/20 21:06:34.17 oAI6ZRfWH.net
querytables.addでCSVファイルをエクセルシートに貼り付けたとき、グループ化で非表示にされている部分に正しく貼り付けられるのはいいのですが、グループ化非表示から表示状態にされてしまいます。
非表示部分に貼り付けつつ、非表示のままにするにはどうしたらいいでしょうか?
貼り付け先シートの元々の表示・非表示状態はそのままにしたいんですがよい方法はありますか?
47:デフォルトの名無しさん
19/09/21 05:45:28.43 8VV0xXKBa.net
sendkeysはなるべく使わない
48:デフォルトの名無しさん
19/09/21 08:35:41.78 /Gx75Cw00.net
abcdefg
49:デフォルトの名無しさん
19/09/21 12:12:30.41 8qwe/SJE0.net
>>45
ページの作りによる。
例えばあなたは20件ずつなどと言っているけど、URLの入力など次第で200件全部表示できるかもしれない。
スクロールが必要かも分からないがSendkeysなんて使うのは子供と考えて良い。
50:デフォルトの名無しさん
19/09/21 13:08:32.19 XrHXKxEM0.net
>>47>>49
レスありがとうございます。
私もSendKeysは使いたくなかったので質問した次第です
> ページの作りによる。
ターゲットサイトは、dアニメのランキングのページです。
URLリンク(anime.dmkt-sp.jp)
ここからランキングのデータを抜き出して来ようと思ってますが、20件ずつしか表示されず…
何かいい方法はないでしょうかねぇ
51:デフォルトの名無しさん
19/09/21 13:10:12.33 /Gx75Cw00.net
あーざーやーかーにー
いーろづいたっ
52:デフォルトの名無しさん
19/09/21 15:10:34.25 AFF+Wq/L0.net
うちの会社に、元SEでVBAバリバリ書ける、という人が
入ってきたんですが、色々Excel作業の自動化をお願いするために
現行の作業手順をお見せしたら、「ここの、Excel関数を使っているところは
意味が分からないので、関数の使い方から説明してください。」といわれ、
VLOOKUPとは、からお話ししないといけないそうで、もう自分でVBA
書こうかと思ってしまいます。
はじめはこういうもので、すぐ慣れてくれるんでしょうか?
「SEの資格」を持っている、という触れ込みの、部長の知り合いなので扱いは
要注意なのです。はぁ。
53:デフォルトの名無しさん
19/09/21 15:31:27.17 idUljkgM0.net
経歴詐称があった場合、解雇はできるのか
結論から言うと、解雇できる場合もあればできない場合もあります。
一口に経歴詐称といっても、軽微なものから重大なものまであり、全てのケースで解雇が可能とすることは合理的ではないからです。
解雇ができるケースは、「重要な経歴」を詐称されたときに限られます(重要な経歴とは何を指すのかは下記で説明します)。
職歴に関する経歴詐称
職歴を詐称していた場合は、採用後の仕事の内容、賃金に直接影響を及ぼすもののため、重要な経歴を詐称していると判断される可能性が高いと言えます。
判例では、グラバス事件(東京地判平成16年12月17日 労判889号52頁)があり、プログラミング能力がなかったにも関わらず、あたかもスキルがあるかのように経歴書に記載。
採用面接でもそのように説明して、ソフトウェア会社に採用されたが、経歴詐称を理由とする懲戒解雇が認められたという事例があります。
54:デフォルトの名無しさん
19/09/21 15:53:55.16 xM/61paW0.net
そもそも触れ込みから嘘だったのかまで疑ったらキリがないから、そこんとこは何とも言えないけど、
元SEが本当なら、少なくともVB(VBAじゃなく)は書けるけど、普通のオフィスワークはあんましてこなかった、とかじゃないの?
そんな感じのSEさんと一緒に仕事したことはある。ちょっと教えてあげたらあっという間に習得したけど。
でもやっぱ利用頻度の低い関数(LOOKUP系)や若干特殊な使い方(SUMPRODUCTを複数条件の判定や抽出に使うとか)には苦慮してた。
55:デフォルトの名無しさん
19/09/21 16:00:48.34 y4wrqwmo0.net
>>52
バリバリ書けるSEならExcelの基本的な関数ぐらい自分で調べられるものだがそれすらできないのはバリバリ具合すら怪しい予感
56:デフォルトの名無しさん
19/09/21 17:02:09.02 GoVsp8loa.net
>>52
バリバリのエンジニアがVBA使う仕事に応募なんてしません
57:デフォルトの名無しさん
19/09/21 17:12:54.75 3YukOVDp0.net
>>52
そもそも謎の「SEの資格」とか言ってるお前も似たようなもんだろ…
58:デフォルトの名無しさん
19/09/21 17:23:57.08 DHk9cejb0.net
知らないことを知らないと言えるやつはまだ大丈夫だわ
ホントにやばいやつってのはな・・・
59:デフォルトの名無しさん
19/09/21 21:02:04.95 p4RfJbo+0.net
もちろんできますよ大丈夫です(やべっ何もわからん どうしよー)
60:49
19/09/21 21:13:01.51 656pPxFFd.net
>>50
スクロールしないで取得したかったんだが解析面倒で断念。
スクロールはSendkeysではなく、HTMLWindow2のscrollToなどを使う。
URLリンク(pastebin.com)
61:デフォルトの名無しさん
19/09/21 21:14:21.75 +OkoEiEq0.net
VBAって必要になったら都度気合いで調べながら書いて、しばらく書かない間に忘れてまた必要になったらまた調べて覚え直すってことを繰り返してる気がする
62:デフォルトの名無しさん
19/09/21 21:59:24.26 656pPxFFd.net
>>52
VBA使いでExcel関数を使わない人もいるからな。
俺はどっちも使うけど両方同時に使うのは避けることが多い。
63:デフォルトの名無しさん
19/09/21 22:06:05.25 656pPxFFd.net
>>59
簡単にそんなこと言うと、その時点でバレるぞ。
普通は分かってたら詳細や、かつてその技術でハマッた体験談を語るもんだ。
64:デフォルトの名無しさん
19/09/21 23:00:31.94 /Gx75Cw00.net
あいうえお
65:デフォルトの名無しさん
19/09/21 23:30:08.68 XrHXKxEM0.net
>>60
> スクロールしないで取得したかったんだが解析面倒で断念。
> URLリンク(pastebin.com)
おお、わざわざここまで!
大変お手数をおかけすることとなってしまい、申し訳ないやら嬉しいやら…ありがとうございます!!
> スクロールはSendkeysではなく、HTMLWindow2のscrollToなどを使う。
最近、ネットのブログなどを参考に
見よう見まねでExcelのVBAとIE操作を両方一緒に始めたのですが…
ループで200項目取り出すまでの条件の書き方、スクロールの書き方、すごく参考になります!
ランキングデータの取り出し方…、ここまでシンプルに書けるものなんですね!!
恥ずかしながら、まだオブジェクトとかコレクションとかアイテムとかがごっちゃになってて頭で整理できておらず
文法エラー(?)の嵐に悩まされつつコードを書いてる段階で…"ChildNodes"とかもまだ使ったことないです…
本当に感謝です。
66:デフォルトの名無しさん
19/09/21 23:32:05.21 JIxctC3M0.net
また幼稚なゆとり世代馬鹿か
67:デフォルトの名無しさん
19/09/22 05:33:04.20 8C/KzzE0a.net
他人の批判しても成果はあがらない
68:デフォルトの名無しさん
19/09/22 17:46:57.02 aib8uIrzr.net
凄く基本的な質問だと思うのですが、
Range("A1".Offset(0,12)).Activate
はだめで、
Range("A1").Offset(0,12).Activate
が正しいのはなんでなのでしょうか?
69:デフォルトの名無しさん
19/09/22 17:53:07.62 7ea+dVk1a.net
>>68
VBAでそのへんを正しく理解するのはまず不可能だしその必要もないから、定型句だと思って暗記しなさい
ちゃんと理解したかったらJavaのようなきちんとしたオブジェクト指向言語を学ぶことをお勧めする
70:デフォルトの名無しさん
19/09/22 18:49:17.99 hRt1URHX0.net
>>68
引数が間違ってるから
71:デフォルトの名無しさん
19/09/22 19:59:23.95 hXw+7SRax.net
>>68
一番目の式の方は、"A1".Offset(0, 12)という表現がVBAの構文上無効で何も値を返さない式になっている
なので、参照先のセル範囲の名前をバリアント型の引数として要求しているRangeプロパティ式の評価に失敗してしまい、Rangeオブジェクトの取得にも失敗する
文字列や数値のリテラルに.(任意の値)と続けて何らかのオブジェクトにアクセスしようとしても、そもそもそのようなアクセスルールが定義されていないので当然失敗する
反対にRange("A1").Offset(0,12)の方は構文上無効な表現がなく、RangeオブジェクトのメンバのOffsetプロパティ式を正しく用いているので、Offsetプロパティを介してA1セルから12列分座標移動したセルを取得することができる
72:デフォルトの名無しさん
19/09/23 08:06:29.00 1/X0hGb20.net
なにぬねの
73:デフォルトの名無しさん
19/09/23 08:16:13.52 DBTsObIXM.net
VBAのリテラルはメンバを持たないから
他言語だと型変換とかあるんだけど
74:デフォルトの名無しさん
19/09/23 14:19:12.95 6dsrIE/rx.net
リテラルがそのままstring型オブジェクトとして使える言語だとメンバアクセスできて楽だよね
75:デフォルトの名無しさん
19/09/23 21:03:41.25 1/X0hGb20.net
たちつてやと
76:デフォルトの名無しさん
19/09/24 00:09:46.67 Knbo6pxK0.net
VBEはインテリセンスがクソ
77:デフォルトの名無しさん
19/09/24 00:31:17.33 dEEBEAN9x.net
VBEは静的に型判定できるリテラルくらいハイライト表示対応してくれと思う
78:デフォルトの名無しさん
19/09/24 01:28:17.40 GahaPn620.net
そもそもExcelのおまけ機能だし
79:デフォルトの名無しさん
19/09/24 12:36:08.37 b0EiNdg20.net
はひふへほ
80:デフォルトの名無しさん
19/09/24 12:41:06.36 jDE40bGiM.net
イミディエイトとローカルのウインドウ、上下にドッキングしてしまったのだけど、左右にドッキングするようにはどうすればいいのだろう…
81:49
19/09/24 12:46:55.24 PfH2ve03d.net
>>80
ドラックすれば良いんじゃない?
位置調整は難しい場合があるけどウィンドウ枠の表示が変わった時に離すとドッキングするから試行錯誤してみれば良い。
82:デフォルトの名無しさん
19/09/24 12:57:05.92 b0EiNdg20.net
やいゆえよ
83:デフォルトの名無しさん
19/09/24 16:39:46.34 Zg6Hxb/Wa.net
いきしちにひみいりい
84:デフォルトの名無しさん
19/09/24 19:07:39.27 GahaPn620.net
>>80
移動させる時に判定のシビアなガイド枠みたいなのが出るから置きたい位置にハマるまで頑張る
85:デフォルトの名無しさん
19/09/25 00:27:11.58 P1Zkaqvu0.net
VBAの代わりにPython実行環境を取り込む動きがあるらしいね
もしそうなったらVBA界隈の閉塞感も変わるかな
86:デフォルトの名無しさん
19/09/25 06:45:55.03 pkvL+Jrla.net
まじ?
エクセルやってる一般社員様がpython始めたらどうなるんだろ
87:デフォルトの名無しさん
19/09/25 08:47:00.45 eyE9qOIMd.net
おっぱいでexcelを自動化する
88:デフォルトの名無しさん
19/09/25 09:19:56.07 XMGhQQhjx.net
Pythonエンジン搭載は色んな理由で見送られたはず
89:デフォルトの名無しさん
19/09/25 13:51:45.80 uf0+2woN0.net
>>85
未だにこういう馬鹿がいるのか
90:デフォルトの名無しさん
19/09/25 17:46:53.71 sp9MNwgvH.net
Python搭載は見送られて代わりにJavaScriptが搭載されるという記事をどこかで見かけましたが。
どなたか>>46わかるかたお願いします。
91:デフォルトの名無しさん
19/09/25 19:10:29.50 lvyCMB6U0.net
>>90
>>89
>>未だにこういう馬鹿がいるのか
92:デフォルトの名無しさん
19/09/26 00:31:10.28 ZFJdpCv/0.net
jsだったらgasと同じような感じになるのかな
gasはそもそもスプレッドシート自体の機能が物足りないからイマイチだったんだけど
93:デフォルトの名無しさん
19/09/26 00:57:48.08 89bcSR2Xx.net
これからJSエンジンが実装されるならTypeScriptベースで型付け強制になるだろうな
94:デフォルトの名無しさん
19/09/26 20:07:07.87 +ztuXuzlM.net
.ClearContents と .Value="" では実行後のセルの状態は異なりますか?
95:デフォルトの名無しさん
19/09/26 20:28:04.65 aKtMMU310.net
何も載らないよ
Excel自体クラウド上で使うようになってきてるから
マクロみたい使うならJavaScriptなのかもね
96:デフォルトの名無しさん
19/09/27 06:06:27.72 sVncIXEy0.net
きーよしー
こーのよーるー
97:デフォルトの名無しさん
19/09/27 07:55:16.60 ccoeIvApM.net
ハーゲーはー ひーかーり
98:デフォルトの名無しさん
19/09/27 08:22:15.68 RTCGxTj8x.net
最近はExcel操作のためにVBAを使うのはもうなんか最後の手段って感じがする
PowerQuery(M言語)、PowerPivot(DAX)、JavaScript、Python、PowerShellのどれかで書く方が楽だしメンテも簡単
99:デフォルトの名無しさん
19/09/27 08:43:34.46 Lnp0vM2Id.net
趣味が大がかりになってきて使う材料の管理が煩雑になってきたのでExcelを使って管理しようかなと考えています
工程が1,2,3…とあって、それぞれの工程で使う部材は今のところ重複はなく(今後どうなるかわからない)部材毎に色違いやグレード違い等の派生品があり、
用途としては工程毎に使う部材を別シートにリストアップしたり、規定量を割ったものをピックアップ
部材の管理番号を振るとき
番号は工程や派生に関わらず一列で一意の連番
3列で工程ー工程内の部材を連番ー派生を枝番
工程に関わらず部材毎に連番ー派生品を枝番
マクロを組むときこれらのうちどうするのがよい構造になるでしょうか?
100:デフォルトの名無しさん
19/09/27 09:04:03.76 ikgA/i06d.net
まず3行にまとめます。
101:デフォルトの名無しさん
19/09/27 12:08:52.99 yAOzGr2R0.net
RDBSを使って合成テーブルを作ります
102:デフォルトの名無しさん
19/09/27 21:25:04.26 yKrr7IDu0.net
>>98
Excelデータ操作するのにか!?
103:デフォルトの名無しさん
19/09/27 21:29:52.64 W7KJhMQF0.net
確かにvlookup関数もCで作ったほうが処理速度速いですし
104:デフォルトの名無しさん
19/09/28 01:10:35.83 vqFcrTxsx.net
>>102
情報取得とかテーブル加工とかならVBAよりQueryTable)PowerPivotの方がよっぽど速いし型安全にデータ処理できる
数万行以上のデータのリレーション構築とテーブル加工をVBAやWorkshhet関数で実現するとか正気の沙汰じゃないぞ
105:デフォルトの名無しさん
19/09/28 07:02:49.99 kCxp0LgMM.net
なんか齢50近くになると新しい言語?を知らない…power query?power pivot?
…後で調べてみないと…
106:デフォルトの名無しさん
19/09/28 07:36:24.34 HGKDuO1d0.net
M言語ってどうやって勉強するのさ
英語の本け?
107:デフォルトの名無しさん
19/09/28 08:34:58.34 oUtMZ4Zg0.net
>>106
マイクロソフトが仕様書公開してる
108:デフォルトの名無しさん
19/09/28 09:58:25.05 OFq3+Dp/x.net
>>106
MSが仕様公開して言語レファレンスまで作ってる
開発&実行環境はExcelのPowerQueryに付いてるので特に余分なものは要らない
109:デフォルトの名無しさん
19/09/28 14:02:31.05 OFq3+Dp/x.net
>>99
一番目の方法でまず一意のIDを持つ部材のマスタを作った方が良い
その上で、派生関係や使用工程は列を分けて部材マスタの属性値として管理する
そうすれば各使用工程で使う部材を抽出するビューが漏れなく簡単に作れるし、部材データの追加も容易
何故他のやり方が良くないかというと、使用工程や派生関係を管理番号で構造的に表そうとしても、一対一の親子関係から外れる複合的な派生関係の表現が難しいし、複数の工程にまたがって使用する部材が登場した場合の付番がとても困難だから
110:デフォルトの名無しさん
19/09/28 16:34:58.82 w31BDneZ0.net
↑仕様もわからないのに勝手に決めつける馬鹿
111:デフォルトの名無しさん
19/09/28 17:19:26.34 OFq3+Dp/x.net
>>110
データ活用のシナリオの説明もある程度書いてくれてるし、3パターンの中からオススメを選んで教えてくれと言われてるんだから根拠を示しながら回答するのはOKだろ
112:デフォルトの名無しさん
19/09/29 08:21:00.73 9ZqWtSe+0.net
馬鹿と言いたいだけの馬鹿は相手にしなくていいよ
113:デフォルトの名無しさん
19/09/29 09:41:07.61 xMtED3CuM.net
> 馬鹿と言いたいだけの馬鹿
>>112の悪口はやめなよ
114:デフォルトの名無しさん
19/09/29 10:19:36.85 whL1Vznb0.net
今、困っていることがあり教えてください。
Excelをオープンした時に、入力規則のリストが設定されているセルに
VBAでリストにある文字列を張り付けるとリストが解除されてしまい困っています。
ただ、Excelを既にオープンしている状態であれば、VBAで文字列を張り付けてもリストは解除されません。
Excelをオープンした際の文字列貼り付けでもリストを解除しない方法、何かないでしょうか。
115:デフォルトの名無しさん
19/09/29 11:49:35.55 mZHqVu1Bx.net
>>114
試してないから自信はないけど配列に文字列の値を格納してからコピー先セルに一括代入してみたらどうかね
116:デフォルトの名無しさん
19/09/29 12:33:57.48 QiINVIOGM.net
計算方法の自動手動を切り替えるとか
doeventsを挟むとか
入力規則を消去して再度設定してみるとか
117:デフォルトの名無しさん
19/09/29 13:40:07.40 whL1Vznb0.net
>>115
適当な配列を用意して、1要素に代入したい文字列を格納した後、該当セルにコピーしたが駄目でした。
もしかして、一括代入の意味の捉え方誤っていますでしょうか?
>>116
計算方法を手動にしてもdoevent挟んでも駄目でした。
入力規則の再設定は大丈夫でしたが、再設定しか駄目なんですかね。
118:デフォルトの名無しさん
19/09/29 16:27:33.03 QiINVIOGM.net
再設定で目的が果たせるならそれでいいんじゃないの
気に入らないかもしれないけど
119:デフォルトの名無しさん
19/09/29 19:28:31.60 whL1Vznb0.net
>>118
目的は達成できるのですが、どうしてそんなことが
起きているのか気持ち悪さが残ってしまって・・・
ひとまずリスト再設定で回避してみようと思います。
皆さん、ありがとうございました。
120:デフォルトの名無しさん
19/09/29 20:52:21.32 /1W8DtBL0.net
1ステップずつ何が起こってるか確認してみた?
121:デフォルトの名無しさん
19/09/29 21:37:57.26 fy6bWXAvx.net
ウォッチ式で入力規則が無効になった瞬間を捕まえたらどのステップで問題が起きてるか分かるよ
あとApplication.EnableEvents=False の状態で入力規則が無効化する症状が同じように出るかどうかを確かめると良いかも
副作用あるから気を付けた方がいいけどね
122:デフォルトの名無しさん
19/09/29 22:03:13.06 sGqY7mop0.net
デバッグは大事
123:デフォルトの名無しさん
19/09/29 23:10:51.27 JC6PY5Dx0.net
Worksheetの表示を縮小したときに名前をつけた範囲名が青文字で表示されますが
あれを縮小表示なしに表示するメソッドとかないですかね?
なければ諦めて作ろうと思って、、
124:デフォルトの名無しさん
19/09/30 09:40:08.63 GRnK7Y6k0.net
以前の勤務表の作成についての質問をしたものです。
指定範囲に対して条件を参照して自動で勤務を組むにはどのようなコードが使えますか。
125:デフォルトの名無しさん
19/09/30 09:44:23.17 5dp60tLcM.net
その通りにコードを組めばいいです
よかったですね
126:デフォルトの名無しさん
19/09/30 14:06:19.14 Xo+EVkfu0.net
そこまでくると質問というより代わりに作ってって感じな気がする
127:デフォルトの名無しさん
19/09/30 14:27:24.46 KUbJhJ6Ud.net
15万ぐらい払えば作ってくれるよ
128:デフォルトの名無しさん
19/09/30 18:03:03.23 uds7JUMo0.net
任意のフォルダを開きたいくて、そのファイルのパスが
A1に書いてあるときにどんなコード書いたらできますか?だれか教えてください。お願いします🥺
129:デフォルトの名無しさん
19/09/30 18:38:27.74 MOVpytTQ0.net
え?w>>124見たいな糞簡単なの作って15万???
うそやろwwwww
130:デフォルトの名無しさん
19/09/30 19:38:06.65 Db1Fe+X90.net
>>128
ファイル形式は?
131:デフォルトの名無しさん
19/09/30 20:42:31.76 rUBZxyEm0.net
>>128
次から次へと現れる馬鹿
132:デフォルトの名無しさん
19/09/30 21:02:52.82 KDJog/g4x.net
>>128
フォルダのフルパスがA1セルに入っているなら、
Shell Range("A1").Value, vbNormalFocus
と書けばとりあえずフォルダを開くことはできる
開いたフォルダの中のファイルを選んで何らかの操作をしたいならファイルそのものを掴む別の工夫が必要
133:デフォルトの名無しさん
19/09/30 21:15:26.21 VO0MeE9M0.net
.Findで検索するマクロ作ってるけど死にそう
全シート検索で結合セル気にしないでいい方法ないですか
一致したの全部もれなくとるだけなのに
なんでこんな大変なんですか
134:デフォルトの名無しさん
19/09/30 22:05:40.31 KDJog/g4x.net
>>133
何がそんなに大変なの?
135:デフォルトの名無しさん
19/09/30 22:43:31.23 VO0MeE9M0.net
初回検索と次項目の検索が別メソッド
検索したあとに問答無用で一周して戻ってくる謎仕様
結合セル最初に見つけたら2週目で見つけられなくて死亡
最初から検索しようとしたら最初の次のセルから開始という超絶理不尽仕様
最終セル開始点にしようとしたら最終セルが結合セルで死亡
136:デフォルトの名無しさん
19/09/30 22:55:52.56 VO0MeE9M0.net
URLリンク(dsp74118.blogspot.com)
ってこれなに
うそだろ
137:デフォルトの名無しさん
19/09/30 23:15:22.35 fjb3wiBS0.net
あるシートから10000行程クリップボードにコピーして別シートに行挿入する事を10回程度繰り返すマクロがメモリ不足で停止してしまいます。
エクセルは32bitですがメモリ使用量は2.5GB程度、使用率は80%程度なので余裕はあります。
コピー&挿入だけでこんなにメモリ食うのは想定外だったのですが何か良い対策ありませんか?
クリップボードを使ってる理由は書式もコピーしたいからです。
138:デフォルトの名無しさん
19/10/01 00:40:37.46 1yOvNLR5x.net
>>137
結合セルがない場合で、書式が行列で統一的に構造化されている(=手動でランダムに設定された書式がない)場合の話だけど、セルの値のコピーはクエリテーブルを使い、セル書式はスタイルとして登録しておいて値をコピーしたあとにテーブル単位で適用するようにする
それができないなら常套手段的な対策として、描画停止、セルの自動計算の無効化、一度のコピー行数の抑制、コピーする情報の量の削減(列を減らす、セルに入れる値の文字列長に上限をつける等)をやるしかない
139:デフォルトの名無しさん
19/10/01 00:48:34.75 1yOvNLR5x.net
>>135
検索対象のセル範囲でループを回して、MergeAreaプロパティから取得できる結合範囲の第一セルの値に対してInStr関数でチェックをかけるほうが簡単に実装できる
一度触った第一セルをDictionaryに突っ込んでおけば重複回避の処理も簡単に書けるし
140:デフォルトの名無しさん
19/10/01 02:44:48.32 xCeEOzji0.net
1000行を100回にすれば解決する気がする
141:デフォルトの名無しさん
19/10/01 20:19:29.97 /ilC+Vr+0.net
>>137
想定して最初から設計しなおした方がいいんじゃね
142:デフォルトの名無しさん
19/10/01 20:26:17.87 zIavCJ+m0.net
>>137
一度に全部やらず少しずつやるとか、挿入やめて別シートに貼り付けていくとか
143:デフォルトの名無しさん
19/10/01 23:46:40.82 SJOrrfFy0.net
vbaできる人は何歳くらいの方が多いのですか?
144:デフォルトの名無しさん
19/10/01 23:51:07.99 0MgRI3uB0.net
100才。
きんは100才100才。ぎんも100才100才。
もう死んじゃいましたけど。
145:デフォルトの名無しさん
19/10/01 23:51:51.43 0MgRI3uB0.net
いまは中曽根元首相が100才だよ。
146:デフォルトの名無しさん
19/10/02 10:56:45.47 BB7vTg8Dd.net
>>145
もう101歳になった
147:デフォルトの名無しさん
19/10/02 16:36:11.08 2/U5/wmB0.net
100才くらいなら健康でも1年後にもまだ生きてる生存率は50%くらいだよな。
そろそろ死神のお迎えがくるかな。
148:デフォルトの名無しさん
19/10/02 19:09:20.31 TvQrnV1i0.net
そんな事言ってる人に来るからな
149:デフォルトの名無しさん
19/10/02 23:17:24.03 gSiaZ46v0.net
直せるものもろくに直さず
超絶くそのまま世界で最も使われる言語の一つになってしまったVBAに
いろいろ思うところがある
俺らがああしろこうしろと習ってることってどこまで本当なのか
150:デフォルトの名無しさん
19/10/03 04:52:33.28 MliRm7Y8d.net
人の言うことなんか信用するな
学校で教えることなんて、諸説あるうちの一つを紹介してるだけ
自分で直接見聞きしたことが真実に一番�
151:゚い
152:137
19/10/03 05:35:40.04 GiO0wfXg0.net
>>138
>>141-142
細かくコピペするよう変えたのですが、今度はメモリを3.5GBくらい使い始めました。
さすがにおかしいので調べた結果、コピー元のシートの1つがバグってたようです。
現在はメモリ使用量が250MB程度に収まりました。
ありがとうございました。
153:デフォルトの名無しさん
19/10/04 08:52:18.52 D6R1G7QwM.net
質問させてください。
シート上に簡単なHTMLを表示させたいのですが、そのようなコントロールはありますでしょうか?
必要なタグは、br font(color属性のみ) bold div(改行の代わり)くらいです。
目的としては、WEBデータベースに登録されているリッチテキストフィールドをダウンロードして表示することになります。
危ないタグはWEBサービス側で排除されていると思います。
154:デフォルトの名無しさん
19/10/04 10:46:00.35 oVJ/Q3fQ0.net
>>152
Microsoft Web Browserコントロールというのがあります
ただしHTMLの設定や変更にはVBAが必要です
155:デフォルトの名無しさん
19/10/04 20:22:42.36 vt9px/Y/0.net
>>152
簡単なHTMLと簡単でないHTMLの違いがわからん
156:デフォルトの名無しさん
19/10/05 10:01:54.14 TWDKigvVd.net
MSはC#とかTSとか素性のよい言語開発してるのにどうしてマクロは頑なにVBAのみなのか…
157:デフォルトの名無しさん
19/10/05 10:16:11.22 U/TjAS/YM.net
企業ユーザーは既存資産が動く事が大事
新しい事は求めていない
158:デフォルトの名無しさん
19/10/05 10:21:54.58 yF+AhEbea.net
c#でexcelの読み書きすればいい
159:デフォルトの名無しさん
19/10/05 11:06:04.60 do1ONn360.net
>>157
それならそれでいいんだけどMarshall.ComReleaseが面倒すぎる
160:デフォルトの名無しさん
19/10/05 14:26:52.59 pEFp3YWl0.net
""とclearcontentsって別物だったんだな。
一部書籍で扱いが同じだったが新刊書で違いが明らかになった。
161:デフォルトの名無しさん
19/10/05 15:04:12.76 /n5ffSwIx.net
>>159
どう違うんだ?
162:デフォルトの名無しさん
19/10/05 15:20:21.70 6m4y9GjGp.net
長さ0の文字列と値・数式のクリア
163:デフォルトの名無しさん
19/10/05 15:24:12.24 YItdpMcG0.net
>>161
何を入れてクリアしてるかを聞いてるのでは
164:デフォルトの名無しさん
19/10/05 15:52:41.48 /n5ffSwIx.net
ClearContentsでクリアするとValueプロパティの中身が型未定義のEmpty値になるってことか?
165:デフォルトの名無しさん
19/10/05 15:53:36.09 U/TjAS/YM.net
>>161
この2つで異なる結果を返す関数、演算は何ですか?
166:デフォルトの名無しさん
19/10/05 18:14:16.86 pEFp3YWl0.net
並べ替え、重複削除、ピボットテーブル、COUNTA関数
167:デフォルトの名無しさん
19/10/05 18:21:34.50 zs2CzSXz0.net
違うかなぁ?
typenameは、どちらもEmptyだし。並び替えにも影響しないみたいだけど、、
168:デフォルトの名無しさん
19/10/05 19:16:42.87 do1ONn360.net
""のTypeNameはvbStringじゃないの?
169:デフォルトの名無しさん
19/10/05 22:49:37.62 cygEmLxv0.net
特定フォルダの中のファイル名を取得したくて、A1にファイルパスが書いてあってあったとき
Dim fname As String fname = "DirSample.xlsx"
の"DirSample.xlsx"の部分をA1のパスにしたいのですが、どうやった良いですか?
170:デフォルトの名無しさん
19/10/05 23:05:00.52 I+mWDivyr.net
fname = range("a1").value & "¥DirSample.xlsx"
171:デフォルトの名無しさん
19/10/06 00:21:58.24 DJJ/a1MV0.net
>>164
=type(a1)
書式を文字列にしてからやってみ
172:デフォルトの名無しさん
19/10/06 01:50:18.38 yv4ZtA4Er.net
>>5
このQueryTablesなんですけど、セル内改行を含むCSVを読み込む
173:にはどうしたらいいですかね? 改行コードをいじってみたりしたけど駄目でした
174:デフォルトの名無しさん
19/10/06 08:08:24.51 eVUjMqzVM.net
>>171
CSVで「セル内改行」?
意味が分からん
175:デフォルトの名無しさん
19/10/06 09:32:50.86 Lxoa9KpRM.net
>>172
Excel セル内改行 csv
でググっておいで
176:デフォルトの名無しさん
19/10/06 12:19:22.67 /4diLxRX0.net
>>171
Excelのセル内改行コードとテキストファイルの改行コードは違う
177:デフォルトの名無しさん
19/10/06 13:05:06.23 RDxNCESt0.net
>>171
CSVのパーサーを自分で書けばいいです
178:デフォルトの名無しさん
19/10/06 13:10:14.83 H1C9JflMx.net
>>171
QueryTableをコード内でAddするんじゃなくて、予めPowerQueryでセル内改行の処理を埋め込んだ接続を作っておいて、コード実行時にデータの読み込みとテーブル出力だけすればいいんじゃないの
179:デフォルトの名無しさん
19/10/06 21:50:03.52 yv4ZtA4Er.net
>>174
セル内改行をLFにしたり色々試したんですけど駄目でした
結局一時ファイルを作って開いてからコピペという泥臭い処理に…
180:デフォルトの名無しさん
19/10/06 21:50:35.79 yv4ZtA4Er.net
>>176
PowerQueryですか
調べてみます
181:デフォルトの名無しさん
19/10/06 22:04:38.99 lVV4IJR90.net
VBAある表のデータで行と列が一致する列の値を返すコードを書きたいのですがどうしたらいいでしょうか?
行だけならVLOOKUPで行けると思うのですが列になるとどうしてラいいのかわかりません。
該当するセルの値を返したいです。
182:デフォルトの名無しさん
19/10/06 22:26:25.54 yDN+2LYi0.net
rangeをfor eachで巡回すればいいんじゃないの
183:デフォルトの名無しさん
19/10/06 22:28:18.73 H1C9JflMx.net
>>179
行と列が一致するってどういうこと?
行インデックスと列インデックスが一緒ってこと?
それとも、行と列を特定するための条件が個別にあって、それらの条件を満たすってこと?
184:デフォルトの名無しさん
19/10/06 22:57:39.08 /4diLxRX0.net
>>177
コピペするならファイル作らなくてもクリップボードに送ってテキスト取り出し貼ればセル内改行も反映される
185:デフォルトの名無しさん
19/10/06 22:59:41.24 /4diLxRX0.net
>>179
何がしたいのか知らないけどVLOOKUPの横版ならHLOOKUP
186:デフォルトの名無しさん
19/10/06 23:02:28.07 lVV4IJR90.net
>>181
後者です。
シートに参照する表がありユーザーフォームで作った入力表がコンボボックスとなり
一つ目のコンボボックスが行とリンクしていて、二つめのコンボボックスが列と連動して言いて
行と列の一致した値をテキストボックスに表示させたい。
一つだけならVLOOOKUPでできるのですが表となると私の力だと全く思い浮かびません。
力といってもちょっと基本がわかって参考書とインターネットの中から使えそうなコード
を引っ張ってきて使えるように修正するくらいで一から工程を考え出す事は難しいです。
187:デフォルトの名無しさん
19/10/06 23:09:13.37 ZjSVYIsg0.net
ワークシートの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をおしたら対象となるセルに反映されました。
これもどうしたら普通通りになりますか?
188:デフォルトの名無しさん
19/10/06 23:14:57.48 lVV4IJR90.net
>>183
しいて言うならVLOOKUPとHLOOKUPの合わせる感じ?
189:デフォルトの名無しさん
19/10/06 23:34:28.13 DJJ/a1MV0.net
>>185
うまくいきませんとは?
一部だけ反応?反応の範囲が逆?
190:デフォルトの名無しさん
19/10/06 23:45:45.30 /4diLxRX0.net
>>186
関数でできないからVBAでやろうとしてるだけなら関数でできる
表がA1:D5だった場合、
=VLOOKUP(列の条件,A1:D5,MATCH(行の条件,A1:D1))
191:デフォルトの名無しさん
19/10/06 23:45:57.04 ddN6w
192:FVd0.net
193:デフォルトの名無しさん
19/10/07 07:20:54.28 W+vOSLuyr.net
>>184
重複無しなら、コンボボックスの値が行、列の並びと
同じになるように設定して
listindexを取得
offsetで値を取るとか
194:デフォルトの名無しさん
19/10/07 08:45:07.25 s6G9KopOM.net
見出し行の値をkeyにしてrowを取り出すdictionaryを作る
列も同じ様に配列を作る
で、コンボボックスで選択した値で配列から行列番号を取り出す
195:49
19/10/07 13:22:02.42 paP7R7pw0.net
>>177
まず考えるべきはバイナリエディタで該当ファイルを開いて、どういう構造になってるのかを確認することだよ。
196:デフォルトの名無しさん
19/10/07 19:22:21.76 T7P1X7tV0.net
>>185
Not抜けてる
197:デフォルトの名無しさん
19/10/07 21:18:32.84 YYJJYJ590.net
>186 change自体が動きません
>193 マジッスカ!どこに入れたらいいですか?
198:デフォルトの名無しさん
19/10/07 21:59:12.85 DI7aKBabr.net
>>194
ifのあと
199:デフォルトの名無しさん
19/10/08 00:24:14.75 HDWpL7A50.net
〉〉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
200:デフォルトの名無しさん
19/10/08 02:02:42.66 l+0JwRkcx.net
>>196
たぶんMatchの行条件がおかしいけど、どんな問題が起きてるのか分からないから何とも言えない
それから、haihhunとかsiriaruとかhanni_seruとか変数の名前がちょっと酷い
HyphenとかSerialとかとかCellとか英語をきちんと使う意識を持つのが上達の近道だと思う
201:デフォルトの名無しさん
19/10/08 07:19:14.43 EnS6DjXJ0.net
〉〉196
その前にまず安価というのはだな・・・
202:デフォルトの名無しさん
19/10/08 07:24:09.57 XnwML2Ug0.net
別モジュールに書いたprivate subをcallする方法ってありませんか?
publicにするしか無いでしょうか
203:デフォルトの名無しさん
19/10/08 07:37:46.07 wEzHRAYiM.net
〉〉196です。
変数名もそんなルールが?
なんとなく日本語はよくないなーと思って自分で分かるローマ字で表記しようと思ったんですが、後ダメな理由がマッチ関数にワークシート指定してないからかと推察。後で試します。
204:デフォルトの名無しさん
19/10/08 07:52:03.60 o1U1FjwuM.net
無理に英語やローマ字にするくらいなら日本語でいいと思うけど
あとrangeだけじゃなくてcellsも覚えれば目的達成するんじゃないか
cellsのrowとcolumnで行と列を取得出来るからね
205:デフォルトの名無しさん
19/10/08 08:16:32.23 l+0JwRkcx.net
>>199
ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
Publicにするのが嫌なら、呼び出したいPrivate Subが定義されたモジュールにコールバック用の引数付きでPublic Subを定義して、呼び出したい任意のPrivate Subを引数で指定して呼び出せるようにする
それも嫌ならクラスを作ってPrivate Subをメソッド化する
どちらもコーディングや保守の工数は大して変わらない
206:デフォルトの名無しさん
19/10/08 20:03:58.77 XnwML2Ug0.net
>>202
>ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
まさにこれです!privateにしなくても出来たんですね、勉強になりました。ありがとうございました
他の方法も勉強になりました
207:デフォルトの名無しさん
19/10/08 20:07:56.35 Uz+DmrF+0.net
>>200
決まった名前ルールは無い
人それぞれに拘りがあるだけ
たぶんみんなに共通する拘りは分かり易さ
他人が見て混乱しないか、半年後に自分が見てすぐに理解できるか
208:デフォルトの名無しさん
19/10/08 21:30:26.55 HDWpL7A50.net
>>200
ありがとうございます。
コメントつけまくって分かるようにしてます。
まぁ詳しい人が見たらめっちゃくちゃで分かりにくいと思うのですが、
自分用で自分が分かればいいので動くようにして少しづつ改良していきます。
多分、めっちゃ不具合あります。
209:デフォルトの名無しさん
19/10/08 22:01:56.51 HDWpL7A50.net
データベースから原本のシートに転記する場合表内でのループは可能ですか?
但し、実際に転記する表の上下に題名や表題があります。
例えば1行から20行での表があり繰り返すデータが21行目なったら2ページめの1行目
にするという事は可能でしょうか?
出来なさそうなのでリストボックスで見やすく作ろうかと思ったのですが、印刷用でも
作成したいのでできるのであればご教授お願いします。
上だけなら、forの頭を指定して10番目ならfor i = 10TO 最終行
で行けると思うのですが表の最後の指定がわかりません。
forをネストすればできそうですが、それでも20番目でおわる形にする感じ?
21行目を2ページ目の1行目を指定するのは難しそう
210:デフォルトの名無しさん
19/10/08 22:10:00.62 QtXyLjSg0.net
伝え方って大事だよね
211:デフォルトの名無しさん
19/10/08 22:11:56.81 Uz+DmrF+0.net
>>206
21行目になったら次の改ページ位置を貼り付け先にする
212:デフォルトの名無しさん
19/10/08 22:13:49.93 Uz+DmrF+0.net
または上下の題名をヘッダフッタに指定して改ページを気にせず貼り付ける
213:デフォルトの名無しさん
19/10/08 22:46:38.31 IntPDsvb0.net
>>194
出来ました。大変ありがとう😊
214:デフォルトの名無しさん
19/10/10 21:20:24.18 gS7zDweR0.net
たまにpowershellの話題出るから聞きたいんだけどpowershellってUWSC見たいなことできるの?
215:デフォルトの名無しさん
19/10/10 21:36:10.47 LC0PLrJI0.net
特化してるUWSCみたいに簡単ではないけど
がんばればできる
216:デフォルトの名無しさん
19/10/10 21:48:01.84 5Xxw1b5M0.net
頑張れば何でもできるだろうな。
VBSではWindowsAPIが使えない! → 裏でこっそりエクセル起動すれば使えるじゃん。
VBAではjavascriptが使えない! → ExecuteThisJavaScript使えば出来るじゃん。
殆ど屁理屈だけど。
217:デフォルトの名無しさん
19/10/10 22:44:29.41 g+4V+XU10.net
要は徒歩でも世界一周できますよねってこと
218:デフォルトの名無しさん
19/10/10 23:00:49.96 0ZKFmSv+0.net
ジョジョ、逆に考えるんだ、『vbaの下に便利APIのExcelやAccessが付いているのさ』と考えるんだ
219:49
19/10/11 15:44:34.63 3jXa2BKX0.net
>>211
>>212
>>213
出来るぜ。
-応ここVBAのスレだから言うけどVBAでも全部できる。
今流行りのRPAがやってることは全部出来る。
220:49
19/10/11 15:50:38.03 3jXa2BKX0.net
ただ、VBSでWindowsAPIは苦肉の策というか、敬遠したい気持ちもある。
まっ、VBSが最適な話なら結局使うけどね。
VBAでJavaScriptも同様だね。
こっちの方が敬遠したい。
まずはVBAだけで何とかならないかを考える。
221:デフォルトの名無しさん
19/10/11 17:59:50.09 l8XLJu9S0.net
>>216
まじかー
vbaでやれるっていうことはwinapiを使うって事だよね?
スクリーン上の指定座標の色の識別とかもできたりするの?
222:デフォルトの名無しさん
19/10/11 18:32:21.51 cTW5CNRi0.net
特定のアプリのウィンドウに対してキー入力するとかVBAでやってるよ
223:デフォルトの名無しさん
19/10/11 20:26:26.20 WXbKDhhqM.net
Cells(1,"A")と書かず、判りにくいCells(1,1)と書くのはなぜ?
ネットの記述とか見ててもCells(1,"A")と書いてるの見たこと無い
224:デフォルトの名無しさん
19/10/11 20:52:13.81 zntJ+vZ40.net
マルチかよw
225:
19/10/11 22:18:32 thcocK/e0.net
はわわ~
226:デフォルトの名無しさん
19/10/11 23:28:47.56 CLF8jhxua.net
RPAは所詮VBAに勝てないか
っしゃああ
227:デフォルトの名無しさん
19/10/12 02:44:28.24 o9i+oJev0.net
forでまわせんだろうが
個人的にrangeをなぜ使うかの方がわからん
228:デフォルトの名無しさん
19/10/12 02:45:37.39 o9i+oJev0.net
ああ、cellsで表現できるのをrangeで表現するのが解らんってことね
229:
19/10/12 06:05:16 ghJl2hig0.net
Range("B2:E6").Interior.Color = 65535
こんな場合は使うかな
見た目というかデータに影響を与えない部分はrangeの方が読みやすい、気がする
230:
19/10/12 06:55:20 aSZCz9kN0.net
朕も同じくだわ
231:
19/10/12 11:15:14 Wxq9g5aB0.net
Cells(1, "a")と書くならRangeを使えばいい
232:
19/10/12 11:19:09 cp8dvw0gd.net
マルチする迷惑な質問者多いな…
233:
19/10/12 11:58:45 6ww4xfxmM.net
繰り返すときCells(i, 1)よりCells(i, "A")の方が判りやすいと思うけど
234:
19/10/12 12:34:57 ghJl2hig0.net
列方向に繰り返す時はどうするの
235:
19/10/12 12:37:13 O9HuO9geM.net
むしろexcel側でR1C1形式がデフォルトになれば良いのに
236:
19/10/12 12:44:34 9l3IvWTz0.net
列は作りながら足したり順番変えたりする事が多いので最初からenum作って管理する
cells(i, cols.hoge)みたいにしてる
237:
19/10/12 12:46:15 ghJl2hig0.net
>>232
三四郎に対抗するためにこうなった
結果、シェアを勝ち取ったけど負の遺産として残ってしまったね
238:デフォルトの名無しさん
19/10/12 19:24:53.26 E5CVP1ep0.net
アホか
239:デフォルトの名無しさん
19/10/12 20:28:16.78 grx7Z1qlx.net
経験則から言うと、エクセルのシートを入力フォームや書類のフォーマットのように捉えてる人はRangeを使いがちで、配列やテーブルとして扱えるオブジェクトの塊だと捉えてる人はCellsを使う傾向がある
240:デフォルトの名無しさん
19/10/13 00:25:27.70 ZLXCWom40.net
あるリストをユーザーフォームで絞り込んでそのユーザーフォームのリストボックスに
リスト内容を表示させたいのですがオートフィルタの表示はうまくいくってるのですがリストの表示
先がうまく表示されません。どうしたらいいでしょうか?
以下がコードです
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
241:デフォルトの名無しさん
19/10/13 04:36:36.74 PQpo0fQ70.net
変数で回す時はCells
セル位置が固定の時、範囲指定する時はRange
1行ごとにコード入力が楽な方を選んでる
242:デフォルトの名無しさん
19/10/13 09:40:37.82 EzRorSmA0.net
>>237
myData(Range型)にはフィルター設定情報は入ってない
一行一行をRow.Hidden判定しながら範囲内ループさせて取り込むしかないね
243:デフォルトの名無しさん
19/10/13 09:49:37.23 EzRorSmA0.net
間違えたmyDataは配列か
それでもフィルター情報は乗らないね
リストボックスの.RowSourceに範囲アドレス入れて連動させる方法あるけど
これフィルターも連動したっけ?
244:
19/10/13 15:30:11 8j4dObBs0.net
セルC5:C17に数値が入ってます(A)
セルF5:F21に数値が入ってます (B)
セルY5:Y25に数値が入ってます (C)
AとBの数値のうちCにない数値をセルO5から順番に下に抜き出したいんです
cを配列で格納するまでは出来たのですがそれ以降がわかりません
よろしくお願いします
初心者です
245:
19/10/13 15:41:29 tc/0x//C0.net
配列を検索すればいいだけでは
246:デフォルトの名無しさん
19/10/13 15:45:58.47 8j4dObBs0.net
>>242
すみません
その配列の検索が上手くいかなくて…
247:デフォルトの名無しさん
19/10/13 16:03:13.56 TBfrTFPMd.net
配列よりコレクションの方が楽では
248:デフォルトの名無しさん
19/10/13 16:05:31.06 tc/0x//C0.net
for i = 0 to ubound(配列)
if 配列(i) <> 検索したい値 then
どこかに出力
end if
next
こういう感じでいいんじゃないの
249:
19/10/13 16:45:22 8j4dObBs0.net
>>244
コレクションっていうのがあるんですね
調べてみます
ありがとうございます
250:デフォルトの名無しさん
19/10/13 18:24:09.39 0JmSqCe7x.net
普通のCollectionや配列よりも、Cの値をKeyにしてDictionaryオブジェクトを作る発想の方がいいと思う
Dictionary.ExistsメソッドでKeyの存在確認ができるからコードが簡単になる
251:
19/10/13 20:43:23 2Iz5cpana.net
Dictionaryは平均的なVBAerには理解できないから却下
他人に理解できないもん作るんならVBAを選ぶ意味がない
252:デフォルトの名無しさん
19/10/13 21:17:01.40 GzZlIE9V0.net
dictionary楽なのに
253:
19/10/13 21:32:01 z6dVpON+0.net
連想配列の事をdictionaryって呼ぶんだっけか
すごい便利だけど、シートあるんだからシート使った方がいいんでない?と思う
二次配列が目に見えて編集し放題とか楽ちんすぎる
254:
19/10/13 21:38:36 a37CwINqa.net
みんなどうやってVBAそんなに詳しくなったの?
255:
19/10/13 21:44:04 exOKfr5u0.net
必要に迫られて作ってるうちに
256:
19/10/13 21:48:31 TUjSthkJ0.net
休日まで費やして2000行くらいコード書いてるけどそろそろ嫌になってきた
257:
19/10/13 21:50:43 z6dVpON+0.net
そのうち、休日に働いて会社でのんびりするようになるよ
あんまり良くないんだけど、プログラムは家じゃないと集中して掛けないんだよな
258:デフォルトの名無しさん
19/10/13 21:54:03.90 a37CwINqa.net
>>254
あー、すごいよくわかる
259:
19/10/13 22:03:41 0JmSqCe7x.net
>>248
平均的なVBAerってのがどんな層を指してるかちょっと分からないが、Dictionaryが理解できない人ってそもそも配列やCollectionも理解できないんじゃないの?
260:
19/10/13 22:05:54 VDajUcWs0.net
dictionaryの替わりにシートを使うという発想は無かったな
261:デフォルトの名無しさん
19/10/13 22:13:33.97 0JmSqCe7x.net
シートが可視化された配列だってのはその通りなんだけど誰でもGUIで簡単に編集できてしまう点が逆に弱点でもある
値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし
262:デフォルトの名無しさん
19/10/13 22:23:41.04 z6dVpON+0.net
>>258
まぁねぇ。その辺は考えながらうまく付き合って行きたい所
263:
19/10/13 22:44:44 Sc8Blp8e0.net
連想配列ってどういうとき便利なの?
いまいち基本書の記述じゃメリットとか使い道とかがイメージできないんだけど
264:デフォルトの名無しさん
19/10/13 23:07:03.97 exOKfr5u0.net
>>260
配列で数字の添え字じゃなくて好きなワードを使いたい時に
あとDictionaryの場合は検索がめちゃくちゃ速いから大量データの検索に
265:デフォルトの名無しさん
19/10/13 23:09:26.19 YeAfr+Aea.net
>>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
266:デフォルトの名無しさん
19/10/13 23:09:42.80 YeAfr+Aea.net
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
267:
19/10/13 23:20:25 rkAEaYhN0.net
>>260
Keywordが重複できないから必ず一意なデータセットができる。
268:
19/10/14 00:48:24 2bLpiP0X0.net
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の動作をよく分かっていません
269:
19/10/14 01:24:56 wVIK+1B50.net
>>260
existsが便利
数数えたり、行番号取り出したり、キャッシュの管理に使ったり
for eachで中身を全部取り出そうとしたら投入順が保証されないのが少し残念
270:デフォルトの名無しさん
19/10/14 09:29:31.58 +oSE7p5I0.net
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
271:
19/10/14 09:38:41 LU4QFSeP0.net
>>254
>>255
ホント。
プログラムに対する理解のないバカ上司とか、
コーディングの真っ最中に、平気でコピー取りを要求してきたりするからな。
272:
19/10/14 12:22:02 UlmNQm1da.net
>>267
ファイル番号は1-255の範囲で常に固定値でやるなら引数で渡さずにどこも#1でいいかと思う
FreeFileって関数があってこれは番号を任意に付番してくれるので
たとえば
Dim nNo as Integer
nNo = FreeFile
Open .... #nNo
って書くこともできる
このnNoを引数に指定してもいいかもね
273:デフォルトの名無しさん
19/10/14 12:27:42.70 +oSE7p5I0.net
>>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
274:デフォルトの名無しさん
19/10/14 14:39:32.50 aC+4aHxsx.net
>>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の方が動作も早いしね
275:
19/10/14 14:43:11 ghhHmrX1a.net
>>270
自分は見たことないですね
なんとなくですが自分は常に#をつける派です
それとcloseも#nNoかと
276:
19/10/14 15:37:37 g9W5x9G3d.net
言語リファレンスでも#は省略可能となっているだけで、説明はどこにも見当たらない
古いBASICとの互換性で残してあるだけだと思う
277:
19/10/14 15:51:24 +oSE7p5I0.net
>>272-273
あれ、じゃあなんでしょうねこれ
コンソールで
?#1
ではエラーになるので、ただの数値ではなくなるみたい
#1=2
も出来ない。なんとなくリテラルか参照っぽいですが、何でしょうね
openなどの時にしか使えないのでしょうか
278:デフォルトの名無しさん
19/10/14 15:54:12.83 2bLpiP0X0.net
>>271
ありがとうございます
コレクションを選択した理由は特にありません
(あえて挙げるなら、コレクションにまとめるリファレンスが最初に目に付いた です)
>pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
言葉足らずですみません。Diaryクラス側ではpIDが重複しdIDが主キーとなるので、一意に取得できません。(この認識も間違っていたらすみません...)
エラー処理がExistsで済むのは明確なメリットですね。Collectionでは、調べた限りではOnErrorGoToで飛ばす方法しか見つけられませんでした
ひとまず、Diary側のループで取得したpIDでPersonDictionaryにExistsをかける 方法を試してみようと思います。
279:
19/10/14 16:00:13 pMfnFO5+0.net
>>274
#1の中身は文字列じゃないよ
280:
19/10/14 16:32:13 9SF/tSaH0.net
>>274
> openなどの時にしか使えないのでしょうか
そう言うことだろ
281:
19/10/14 17:26:42 J7mWSp9Bx.net
>>275
複数のDiaryインスタンスが共通のpIDを持つならば、連結を二重化したらいいんじゃないだろうか
まずpIDをキーとするDiary用のDictionaryをまず作っておいて、
同じpIDを持つDiaryインスタンスをまとめたDictionaryかCollectionをItemとして持たせる形にすればいいと思う
構造的に表すと
(Key[i] = pID, Item[i] = (Key[j] = dID, Item[j] = Diary))
みたいな感じ
282:デフォルトの名無しさん (ワッチョイ bfad-la4p)
19/10/14 22:48:09 PwgP8aUB0.net
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
では表示はされるのですがうまくいきませんでした。
283:
19/10/14 23:16:54 2bLpiP0X0.net
>>278
重ねてありがとうございます。
なるほど。Dictionaryの各要素を、そのkeyに対応するインスタンスの集合とするんですね
1key対1レコード という考えしか無かったので目から鱗です
284:デフォルトの名無しさん
19/10/15 00:00:45.56 Nq3iWAMG0.net
>>279
説明する時「うまくいく」とか「うまくいかない」という単語は使ってはいけない
285:デフォルトの名無しさん
19/10/15 00:02:27.41 0b9bW6T40.net
>>279
どういった表示がされて、実際に欲しい情報とどこが違うでしょうか?
Range("D:L")をken4で完全一致検索をかけ、最初に見つかったセルの行番号を取得
その行のC列セルの値をsiriaruに代入
という点ではプログラムに間違いはありません
286:デフォルトの名無しさん
19/10/15 00:30:22.92 i09LlRYux.net
>>280
その通り
そのようにすれば、Diaryのインスタンス集合全体に対してpIDの存在確認をすることも出来るし、pID, dIDという2つのプロパティ値を使って目的のDiaryオブジェクトを取り出すこともできる
287:デフォルトの名無しさん
19/10/15 04:19:47.75 /i2LKWgur.net
>>279
siriaru=ws_siriaru.Range("C" & rng.Row).Value
288:デフォルトの名無しさん
19/10/15 08:12:41.36 /HnZFUztx.net
>>279
siriaruに値を代入するときに参照しているシートがシリアルのシートじゃなくて別シートになってると思う
siriaru = ws_siriaru.Range("C" & rng.Row).Value
に変えたらうまくいくのでは
289:
19/10/15 18:45:11 opa9jcIha.net
>>270
close もopenと同じ番号のnNo によ
290:
19/10/15 21:12:27 OH7oWYO6r.net
>>236
最初からVariantに入れるのが正解では?
291:
19/10/15 21:28:52 NB8YI5GFx.net
>>287
Variant型は便利だけどRangeオブジェクトを突っ込むためだけの変数で使用するにはねぇ
実際のデータ型を明示しないぶんコードが読みにくくなるしコーティング時にインテリセンスも利かなかったりとデメリットの方が目立つ
実行時エラーの原因って感じ
292:デフォルトの名無しさん
19/10/15 22:36:34.14 LwOOuMgG0.net
リストの表示について
以下の表示の際最終行後ろのセルが空白だった場合最終行が表示されません。
なぜでしょうか?
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
293:
19/10/15 22:58:43 Nq3iWAMG0.net
>>289
M列で値が入ってる一番下のセルまでが範囲のようだが
294:デフォルトの名無しさん
19/10/15 23:33:50.79 NB8YI5GFx.net
>>289
あなたsiriaruの人でしょ
もういい加減お金払って誰かに教えてもらうか、MSDNのVBAのリファレンスを読み込んできちんと勉強すべきだとおもうよ
会社で使ってるマクロのコードベタ貼りしてるのも本当に宜しくない
今回の問題は、せっかくLastRowにA列の使用セルの最終行の行インデックスを格納しているのに、myDataに入れる値のセル範囲指定でそのLastRowの値を使っていないことが原因でしょ
自分の頭をちゃんと使って書いてる?
myData = .Range(.Cells(1, 1), .Cells(LastRow, 13)).Value
と書き直せば終わり
295:デフォルトの名無しさん
19/10/16 00:02:02.46 TVv1yadl0.net
この人の問題は質問内容よりも質問文が意味不明なこと
状況を全く何も知らない相手に説明するということを考えながら質問文を書くようにしよう
296:
19/10/16 00:19:19 GI0GqC4Qx.net
こういう構造的思考力のない人がコピペ&コピペで作り上げた野良マクロが企業の負債になっていくんだよね
297:デフォルトの名無しさん
19/10/16 00:30:12.53 4U9etGee0.net
ワークシートのスクリーンショットとか図で説明してもらわないと訳がわからない
298:デフォルトの名無しさん
19/10/16 07:23:15.57 Qp+et4KT0.net
.Net系もやってる人に質問です
列挙体に属性付けて指定すると数値の他に定義した文字列返す方法があると思うんですけど
アレをVBAで行う方法は有りますか?
Constで定義すれば出来ないことは無いんですがなんかダサくて・・・
299:デフォルトの名無しさん
19/10/16 08:23:24.91 GI0GqC4Qx.net
>>295
構造体配列とかクラスとかで擬似的に再現するしかないんじゃないの
300:デフォルトの名無しさん
19/10/16 08:32:09.52 M09TXdK2a.net
>>295
どうでもいいだろ
VBAなんか使ってること自体が恥辱なのに何を今更
301:
19/10/16 12:35:11 IY04c/q/M.net
>>295
簡単には無理でしょ
.NETも取得するのはそれなりに面倒だし
302:
19/10/16 12:54:37 swoRisr+p.net
>>296
そのためにクラスを作るとVBAの場合はひとクラス1モジュールファイルを切らないといけないし、
フォルダ分けも出来ないので、クラスを作る方法は後々クラスファイルが煩雑になる可能性があるのでやめておきます。
構造体や配列を使うのは少し大掛かりな気もしますが、お陰で何となくイメージがわきました。
DictionaryとかCollectionとかのValueペアのオブジェクトを使って、key側にenumで使用している番号、
Value側に文字列を設定して、enumに紐付けてやるような感じでやろうかなと。
ただ、修正が入るときに手間が掛かるようだとあまり意味がないのでその辺の構成は気をつけて作るような
感じですかね。ありがとうございました。
>>297
どんな言語だろうと自分なりに構成を考えて作っていくのは大事だと思いますよ。
今回の件は無理して作る程のものではありませんが
きちんと部品化しておけばまた違った局面で使うことが出来るので、
自分のためにも、引き継ぐ人のためにも大事だと思います。それはどの言語でも同じでしょう。
303:
19/10/16 13:35:11 QJqyol2eM.net
引き継ぎを考えるなら郷に入れば郷に従えで普通にプレーンに書いた方がいい
VBAに限ったことではないけど、変なオナニーされるのが一番迷惑なんだよ
304:
19/10/16 18:05:45 vKUJ5JTra.net
>>297
なんでここに居るん?
305:
19/10/16 18:50:39 QVKO1shPa.net
>>295
ダサくてもそれが今の実力だからな
306:
19/10/16 19:41:40 3AmZTcsu0.net
>>295
それは.NetでExcelを動かせばいいんじゃ・・。
307:
19/10/16 22:11:30 Y2Xm51x3x.net
>>299
値のペアを返す参照構造を作りたいんだったらワークシートを素直に使ってハッシュテーブルで運用した方がメンテ工数が少ないのでは
ワークシートはGUI化された多次元配列なのでね
セルの値の読み書きでイベントハンドラに制御が渡るのが嫌なら別だが
308:
19/10/16 22:19:50 IiLmkjOX0.net
フィルタされたデータをシート上で複数繋がった状態で選択したとする。その場合にそれら『のみ』を取得することはできるんだろか?教えていただきたいです。
バージョンはexcel2016です。
例)
以下がフィルタされたセル。
A1←選択
A4←選択
A5
上の場合にA1とA4のみを取得する。A2とA3は取得しない。
309:
19/10/16 22:43:21 Y2Xm51x3x.net
フィルタ抽出されたセル範囲だけを取得したいなら、
Range("A1:A5").SpecialCells(xlCellTypeVisible).Select
の一行で終わると思う
Range.SpecialCellsプロパティが可視セルだけを返すよう、引数に列挙定数xlCellTypeVisibleを渡せばいい
Range("A1:A5")のフィルタ範囲は必要に応じて変えてね
310:デフォルトの名無しさん (ワッチョイ bfad-la4p)
19/10/16 23:52:50 e5YHiPLP0.net
>>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
最終列の最終行を取得してたのでそこが空白だと最終列が反映されないことが判明しました
311:デフォルトの名無しさん
19/10/17 01:09:44.53 QyNdzX/10.net
>>307
間違ってるけど…
312:デフォルトの名無しさん
19/10/17 01:12:20.23 cDk85Tz1x.net
>>307
読んでて頭痛のするような酷い文章だな
デバックじゃなくてデバッグだろ
しかも単なるコード改変のことをデバッグとか言ってるしさ
本気でデバッグしなきゃならないときにスキルのないこういうコピペコーダーは何の役にも立たないのに
会社の資産であるコードをこんな掲示板に晒しといて何やってんだか
313:デフォルトの名無しさん
19/10/17 01:14:14.21 cDk85Tz1x.net
>>307
しかもコード間違ってるし
314:デフォルトの名無しさん (ワッチョイ 1ead-b2ak)
19/10/17 01:19:38 KClIintl0.net
>>309
会社の資産でもなんでもないけど?
1から自分で休日に作ってるんだけど?会社で使うものでもないんでw
315:
19/10/17 01:23:29 cDk85Tz1x.net
>>311
仕事でもないのにわざわざVBAを使うってただの苦行じゃん
PythonとかJavaScriptとか使えばいいのに
316:
19/10/17 01:26:24 QyNdzX/10.net
インターネットからまるまるパクることを1から自分で作るとは言わない
317:
19/10/17 01:28:05 cDk85Tz1x.net
控え目に言ってアホだよな
318:デフォルトの名無しさん
19/10/17 07:12:10.84 f3ZcAy7Ha.net
vbaの話で別の言語とか出してマウント取りたい人って何なんだろうね
職場の同僚も大変そうw
319:
19/10/17 07:30:47 cDk85Tz1x.net
何か心に刺さったのかな?
他言語持ち出されたときにマウント取られたと思うのは大抵そう受け取る側に問題があるぞ
320:デフォルトの名無しさん
19/10/17 08:03:49.72 p8i0Yvjup.net
>>316
一応ここVBAのスレだから
せめてJavascriptやPythonでExcelが扱えるようになってから来なさい
321:
19/10/17 08:25:30 kDxfJkPvM.net
前提もなしに>>312みたいなこと書くやつは要らんっていう話だろ
322:デフォルトの名無しさん
19/10/17 08:36:06.38 GRl5SZlQM.net
結局なんらかの形で表データを閲覧するならエクセルで閉じた方が楽だなと思う
323:
19/10/17 10:14:17 V7Fv8DAn0.net
結局、表入力が簡単で確実なんだよな
なんつか心配がいらない
処理はpythonのほうが楽だがエクセル
ファイルのみで管理できるってことも含め
総合的にはVBAいいんだよね 雑な意味で
データと処理が一つにまとまってるんで
オブジャクト思考的ってか
324:
19/10/17 10:31:18 fkyJRw1v0.net
発音に「ャ」の要素はないかと。
325:
19/10/17 10:39:10 V7Fv8DAn0.net
API呼び出せるんだから
大概のことはVBAでどうにか
なってしまうんだよな。小さい会社、つまり
会社の9割以上はVBA程度で
十分なんだよな まあVBAがおもちゃで
なくてはならないって立場は分からんでもないがw
326:
19/10/17 15:37:20 e7g1u0+T0.net
エクセルの表から始まる作業ならVBAがいいとおもうよ
例えば客からの電話注文をエクセルに一度まとめていて、それを管理画面に反映させる作業とか・・・
スクリプトを動かす必要のないサイトならブラウザ開かずにボタンポチで完了するし
(いつもちゃんと登録されてるのか不安がられるが)
327:
19/10/17 16:07:50 gr44XWYWM.net
俺ならそういうのはGoogle Spreadsheet使うかな
一旦ローカルに置くのは無駄
328:デフォルトの名無しさん
19/10/17 16:46:25.92 e7g1u0+T0.net
>>324
みんなエクセルで管理したがるので
329:
19/10/17 18:09:32 p8i0Yvjup.net
まぁVBAやって育ってくるとその内
VB.Netとかやるようになって
Web系を扱うようになると
ASP.Netとかやる機会も出て来るから
SQLと同じようにHTMLとかCSSとか
JavaScriptとか必要に迫られて
片手間で覚えるようになるから大丈夫。
別に今のままで良ければそのまま
VBAやってればいいわけだし。
330:デフォルトの名無しさん (ワッチョイ 9f94-vCPd)
19/10/17 19:58:00 EDPspb6d0.net
VBAの最大のデメリットは何でもVBAでやろうとする脳になる事
こんな化石のような言語でやるのは苦行そのもの
今更覚える意味すらない
331:
19/10/17 20:00:11 2ydjDz1a0.net
そんな意味のないもののスレをわざわざ見に来る意味はあるの
332:
19/10/17 20:41:45 j32AuqLC0.net
>>322
さすがにエクセルで納品ってわけにいかないから
適当にインターフェースつくるが中身はVBAで
十分ってのはあるな
>>327
そんなに言語仕様クソか?
小綺麗にまとまってると思うけどな
純粋さはないが使い勝手は悪くない
333:デフォルトの名無しさん
19/10/17 20:55:38.52 a6vhi3mO0.net
時代遅れ感があるのと、どう書くべきかが分かりにくいのと、エラーメッセージがクソなのを除けばそこまででもないな
シートモジュールやブックモジュールが邪魔すぎる。標準モジュールだけで良かった
そしてエラーメッセージの「修正:式」はあまりに不親切。ここはアップデートかけてくれてもいいのに
334:デフォルトの名無しさん
19/10/17 21:02:24.20 9rn0DJ5qa.net
他の言語と比較すればマトモだと思う
335:デフォルトの名無しさん
19/10/17 21:18:35.64 uSN2w5EG0.net
>どう書くべきかが分かりにくいのと
それは言語の問題じゃない。
英語の文法はわかりにくい → そりゃお前が日本人だからそう思うだけだろ!
日本語の文法はわかりにくい → そりゃお前がアメリカ人だからそう思うだけだろ!
336:デフォルトの名無しさん
19/10/17 21:22:30.75 a6vhi3mO0.net
出ました定義したがりw
337:デフォルトの名無しさん
19/10/17 22:03:59.43 uSN2w5EG0.net
>>333
え?
違うの?
じゃあわかりにくいのは、あんたの能力の問題だね。
俺にはわかりやすいから。
338:デフォルトの名無しさん
19/10/17 22:53:38.34 lelQayoPx.net
シートモジュールとブックモジュールはただのクラスモジュールだからなぁ
コンストラクタとデストラクタがないぶんシートモジュールだけが特殊だが
339:デフォルトの名無しさん
19/10/17 23:08:12.09 a6vhi3mO0.net
そう、オブジェクトが何か分かっていれば何の問題もない
しかし現実問題、Excelを使うのは一般事務。setっていつ使うのかなかなか理解できない層が中心なのだ
340:デフォルトの名無しさん
19/10/17 23:49:25.80 lelQayoPx.net
implementsステートメントで組み込みのワークシートオブジェクトのインターフェースを継承すればシート用モジュールになります、って感じの仕組みならよかったよな
ユーザー定義クラスだって属性宣言を先頭に持って来ればクラス用モジュールになりますって感じの扱いで良かったし
341:デフォルトの名無しさん
19/10/18 00:09:11.06 RulO09Tc0.net
オマイラのスーパーテクを俺に継承してくれや。
342:
19/10/18 01:12:13 Kn6PgWdna.net
>>338
VBAを上手く使うというのはつまるところ「可能な限りVBAを使わない」なので教えろと言われても難しいな
業務フローのレベルからVBAが最小限になるように設計するんだよ
343:
19/10/18 01:29:19 sk0uHZY+x.net
PowerQueryとかPowerPivotとか標準的なExcelの組み込み機能で出来る作業をVBAでやってるのを見るけどああいうのも時間の無駄だわな
344:デフォルトの名無しさん
19/10/18 06:28:43.63 rwfK/g890.net
vbaで何でも出来るから全部vbaでやる・・・それがシンプルでカッコイイ事だと思いこんでいた時期がありました
345:
19/10/18 08:24:07 RulO09Tc0.net
武器を持った奴が相手ならVBAを使わざるを得ない
346:デフォルトの名無しさん
19/10/18 08:28:11.67 RulO09Tc0.net
>>339
>>340
>>341
レスありがとう。万能なExcelに選ばれた言語、それが、VBA!
VBA王に俺はなる!
347:
19/10/18 12:32:43 xgSV8V5dp.net
>>343
そんなこと言わんと
VBAをとっとと卒業してC#辺りに入りなさいな。
他の言語も勉強するとVBAのコードの組み方もガラッと変わるよ。
例えば.Net系をやればクラスやインターフェースの理解がグッと深まるから
テスト項目も減らせる組み方が出来るし、変更点の改修も少ない組み方が出来るようになる。
348:
19/10/18 12:35:35 YN+VnyL5M.net
そういう所まで進みたい人とそうでも無い人がいるって事を理解しなよ
349:
19/10/18 12:45:18 dVFolCOsM.net
>>345
どちらにせよVBAを極めても意味はないという帰結に違いはないな
350:
19/10/18 12:47:17 as8acMuSa.net
本当にプログラミング好きな人はVBAじゃ満足しないだろ
VBAを極めるとはどういう状態かわかりませんが
351:
19/10/18 12:55:00 YN+VnyL5M.net
>>346
ちょっと理解出来ないです
352:デフォルトの名無しさん
19/10/18 14:34:31.34 C4vTbpVj0.net
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を通れば変数を定義出来ると思っていたのですが、どのようにすれば解決できますか?
よろしくお願いします
353:
19/10/18 14:35:51 C4vTbpVj0.net
改行エラーが出てしまったため2つに分けました
VBAを使い始めて1ヶ月弱なのですがC#でエクセルを操作出来るようになりたいと考えております
VBAで作ったプログラムを元にして、C#を学ぶ方法は無いでしょうか?
書き方が全然違うとの話を聞いたので、諦めて最初から覚えるしかないかと途方に暮れております
よろしくお願いします