20/05/21 12:46:28 /CAIZx5s.net
日本語よりはるかに簡単
202:デフォルトの名無しさん
20/05/21 18:17:58 uS9Lfycl.net
パワークエリでデータモデルに読み込んだ後ファイル移動等して元ファイルを参照できない状態からデータをシートに書き出したいのですがvbaで出来ますか?
手動では既存の接続からテーブルとして書き出せるのですがマクロ化するとクエリの更新処理でパスが見つかりませんというエラーになります
203:デフォルトの名無しさん
20/05/21 20:15:46.18 2OHs6iV3.net
>>189
その文章そのまんま単純に処理に起こすだけでいけるだろ�
204:、
205:デフォルトの名無しさん
20/05/21 20:23:35 L96ERFQO.net
>>194
読込時にテーブルデータを別シートにコピーするようにしとけば?
206:デフォルトの名無しさん
20/05/21 21:28:40.44 1bkcSVS7.net
>>194
Excel.Currentworkbookで、テーブルの値をパスとして読み込むようにしておいて、ファイル移動したらVBAでそのテーブルの値を書き換えるようにする
207:デフォルトの名無しさん
20/05/21 22:27:29 eV6pHfb6.net
銀行まるめ型だっけ
仕事で四捨五入多用する俺はあの機能がうざすぎる
Format関数使ってるけど素直にRound関数はエクセルと同じ機能にしろよマジで
208:デフォルトの名無しさん
20/05/21 23:25:30 uS9Lfycl.net
>>196
容量がでかいのでどうしても必要なときだけシートに書き出す形にしたいんです
>>197
元ファイルは自分のローカルにあって共有フォルダで別の人が使う想定なので
209:デフォルトの名無しさん
20/05/21 23:51:59.74 g1Bqd7P3.net
ある何かをやりたいときに骨子になるコードが完成するともうそこから手直しが楽しくて止まらないわ
210:デフォルトの名無しさん
20/05/22 00:18:17 TbAUFCKp.net
プロパティと引数の使い分けがいまいちわからん
クラス内の一つのプロシージャで利用する変数なら引数で渡してよいの?
211:デフォルトの名無しさん
20/05/22 03:00:05 qVNfs0Gr.net
動けばいいんじゃね
212:デフォルトの名無しさん
20/05/22 04:52:54.15 HmQhS1LZ.net
プロパティ
とりあえず1個ずつセットしといて、処理の開始は後回しにできる
順番を意識しなくていい
引数
複数の変数を参照渡ししたい時、構造体やサブプロパティは微妙にめんどくさい
セット忘れが防げそう(願望
213:デフォルトの名無しさん
20/05/22 06:38:47 mpVA2e0J.net
>>201
一応定義としては、プロパティはオブジェクトの設定や状態を見たり書いたりするものという事になってる
一度設定したら変えることが殆どない設定はプロパティ、
ちょくちょく変える設定は引数、
みたいな感じでいいと思う
214:デフォルトの名無しさん
20/05/22 07:33:08.57 TbAUFCKp.net
>>203>>204
ありがとう
厳密に使い分けは難しそう
動くけど、他人が読んだら混乱するんだろうなと思いながら書いてる
215:デフォルトの名無しさん
20/05/22 11:06:37 y/Lzet5S.net
>>205
色々作ってるとそのうちなんとなくどっちにした方がいいかわかってくると思うよ
216:デフォルトの名無しさん
20/05/22 13:23:07 DQGXczns.net
変数ってみんなどんな付け方してんの
My~とかそういう変数付けたりしてるサイトもあれば色々だね
217:デフォルトの名無しさん
20/05/22 13:55:43 uqJ26gv2.net
日本語で
「わたしの~」とかそういう変数名を付けたりしてる。
218:デフォルトの名無しさん
20/05/22 18:08:02 FMkBDb3b.net
拙者も
219:デフォルトの名無しさん
20/05/22 18:16:23 CsJitSv2.net
我(われ)
某(それがし)
拙(せつ)
朕(ちん)
220:デフォルトの名無しさん
20/05/22 21:51:59 Cbv5LLjj.net
セルの数式中で条件成立時のみHYPERLINK関数を生成してるのですが、
?HYPERLINK関数が生成された事を確認
?リンク切れが無いか確認
する事は可能でしょうか?
イメージは下記ですが、数式は複数のパターンがあり困っています
=if (A1<>"", HYPERLINK(A1&B1,B1),B1)
221:デフォルトの名無しさん
20/05/22 23:34:25.54 xc22QBUa.net
未だに二つのセルの掛け算を電卓で計算してて手入力する50歳のおじさんがいる職場なんだよな
222:デフォルトの名無しさん
20/05/23 01:03:15 pi9ABoQN.net
?HYPERLINK関数が生成された事を確認 -> 隣のセルに If (xxx, 1, 0) とかやっとけばいいんじゃないの
?リンク切れが無いか確認 -> マクロでHTTPリクエストしてステータスコード見ないと駄目だろうね
223:デフォルトの名無しさん
20/05/23 04:02:16 TU97qQFp.net
>>205
プロパティは根幹部分を触らせるメンテ用メソッド的な意味合いで用
224:意するといいよ。 例えば「何かを〇倍にする」というメソッドを持つクラスがあったとして、 この「何か」部分が引数で、「〇倍」部分がプロパティ。 利用者はプロパティで「〇倍」を「二倍」等に変えて異なる機能を持つインスタンスを作る事が出来る。 もちろん予め二倍や三倍に設定済みのクラスを作ってもいいんだけど、 プロパティで変更出来るようにすれば一つのクラスで済むという利点がある。 インスタンス化してプロパティを変えたオブジェクトを返す関数(コンストラクタ関数)を作れば凄く便利だよ
225:デフォルトの名無しさん
20/05/23 04:04:50 TU97qQFp.net
インスタンス化は new クラス名 でオブジェクトを作ることで、
インスタンスはその作成したオブジェクトのことね
226:デフォルトの名無しさん
20/05/23 17:42:06 x2nf7i64.net
ExcelVBAでCSVファイルを2次元配列に格納しようと思い、そこまで作成はできました。
ここを参照しました:URLリンク(ateitexe.com)
その配列に格納した後、特定の文字列がある行を削除しようと思うと、配列だとかなり手間だと感じました。
(文字列を検索、行を削除、詰める作業が必要)
だったら、そもそも配列に入れる前にそのcsvの行を無視しようと思うのですが、どうしてもうまくいきません。
どうしたらいいのでしょうか?
227:デフォルトの名無しさん
20/05/23 17:46:18 105ldQbQ.net
文字列を検索、行を削除、詰める作業をお勧めします
228:デフォルトの名無しさん
20/05/23 18:20:37 RvKaLrIF.net
>>216
馬鹿過ぎて話しにならない
少しは学んでから出直せ
229:デフォルトの名無しさん
20/05/23 18:40:31.27 0VGwJWuY.net
>>216
if(文字列.含んでるよ("RegExp") )then
continue;
で済む(VBAにはcontinue無いけど概念的には)処理を
「どうしてもうまくいきません」と言ってるわけ?
230:デフォルトの名無しさん
20/05/23 18:49:52.27 J+1ULzMv.net
特定の文字列がある行は空にすればええやん
それとも別に空の行も含まれてるんか
231:デフォルトの名無しさん
20/05/23 19:27:43 n1v+MUu8.net
>>216
そのどうしてもうまくいかない部分を書けよ…
232:デフォルトの名無しさん
20/05/23 19:33:17 P5e4K719.net
例えば、Ruby で、入力ファイルが、
あ,いう
a,bc
1,23
require 'csv'
ary = [ ]
CSV.foreach( "input.csv" ) do |row| # 1行ずつ処理する
next if row[ 1 ] == "bc" # skip
ary.push row # 追加
end
p ary #=> [["あ", "いう"], ["1", "23"]]
233:デフォルトの名無しさん
20/05/23 20:02:14.42 FaM1nYaB.net
要素数を変えるような操作を配列にする場合、
VBAだと大抵は新しい配列を作るような処理にしたほうが楽
foreachで条件にあえば追加する、そんな感じ
234:デフォルトの名無しさん
20/05/23 20:16:37 +RVUJGzG.net
配列に入れる前にそのcsvの行を無視しようという発想は正しいと思うぞ
Splitする前に文字列判定して、無かったときのみ n=n+1 まで実行するようにすればいけるはずだよ
それと、ary(n, i) = tmp(i) のところは要注意
csvの列数がRedimの行で設定した数分を越えると、配列の範囲外エラーが起きるので
235:デフォルトの名無しさん
20/05/23 21:48:22 GhgCxwTJ.net
B列の2行目から最終行に「2020/5/23」のような文字列が入力されているので
この文字列を「2020/5/23」に変換するコードを教えてください
236:デフォルトの名無しさん
20/05/23 22:07:45 DEt0hEL0.net
>>225
Sub Sample1()
End Sub
237:デフォルトの名無しさん
20/05/23 22:09:12 YkB5QRvg.net
>>226
ありがとうございます!
238:225
20/05/23 22:38:35 GhgCxwTJ.net
>>226
>>227
すみません。「文字列を日付型」に変換でしたm(__)m
239:デフォルトの名無しさん
20/05/23 23:15:23 RvKaLrIF.net
>>228
馬鹿は死ねよ
どうしてこう次から次へと馬鹿が来るんだ?
240:デフォルトの名無しさん
20/05/23 23:49:07 DwihZV3Z.net
例
数値 1500
期間 2020/05/21~2023/02/12
この期間のセル数に数値1500の値を 均等割で入れる場合のセル数の計算方法がわかりません。
※用意してるセルの期間
2020年1月から2022年12月まで。
※ひと月3分割で1年36マス。
上旬1~10 中旬11~20 下旬21~末
※2022年を超えた場合はそこまでの均等割を入れそれ以降は入れない。
※開始期間が2020年1月以前の場合は1月からの均等割を割り振る。
こんな感じの事をしたいんですけど、期間の計算方法の伝授願います。
241:デフォルトの名無しさん
20/05/23 23:51:24.02 GhgCxwTJ.net
>>225
Sub Test()
Dim cnt As Long
Dim da As Date
For cnt = 2 To Cells(Rows.Count, 2).End(xlUp).Row
da = CDate(Cells(cnt, 2))
Range("B" & cnt) = da
Next cnt
End Sub
242:デフォルトの名無しさん
20/05/24 00:33:29.03 jgkofs6w.net
>>230
VBA関係ないただの算数ないか
243:デフォルトの名無しさん
20/05/24 05:46:51.68 kGXS6p+T.net
>>229
君がつけ上がってる限り現れるね
244:デフォルトの名無しさん
20/05/24 06:12:40 VMYRmKv4.net
謙虚にしてたらもっとひどかった
245:デフォルトの名無しさん
20/05/24 06:15:08 A7TYPIWJ.net
Ruby の、clamp みたいな関数だろ
clamp(min, max) -> object
self を範囲内に収めます。
self <=> min が負数を返したときは min を、 self <=> max が正数を返したときは max を、
それ以外の場合は self を返します
1.clamp(0, 100) #=> 1
101.clamp(0, 100) #=> 100
-1.clamp(0, 100) #=> 0
246:デフォルトの名無しさん
20/05/24 09:33:40 ozGH/zB/.net
やたらrubyで表したがるやつなんなの?
無意味だし完全にスレチなんだけど
247:デフォルトの名無しさん
20/05/24 09:52:14 tKHuSqSe.net
それこのスレの透明人間
248:デフォルトの名無しさん
20/05/24 09:56:21 Aun0kaOs.net
「おれRuby知ってるんだ(どやぁ)」
じゃね?
249:デフォルトの名無しさん
20/05/24 11:44:26 0I4G4YZw.net
>>238
え?たかだか一つ言語知ってるだけでどや顔なんて…ありえるかもな。
250:デフォルトの名無しさん
20/05/24 15:25:32 ZTIdhNvp.net
>>230
説明がよくわからない。
サンプルを用意するなど、読み手にわかりやすい工夫をすること。
(期間が複数あってよくわからん、期間の基準が上中下旬なのか2023/2/12みたいな細かい日付もあるのか、
「この期間のセル数に」とか、36「マス」とか。
自分で作ったような言葉を、相手はまず理解できないと思うこと。)
最大限理解しようとして作ってみた。
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
251:デフォルトの名無しさん
20/05/24 17:31:52 aHD8sbyt.net
>>230
ひと月を3分割って、微妙に面倒だったりするね
質問は期間の求め方なので、こんな感じでいいと思う
簡単な流れは、月の差-1を出して*3し、開始と終了の日-1を10で割って半端な分を補正する感じ
計算上、初回分も算入する必要がある事に注意(例えば、 5/24 ~ 5/24 の場合、単純に引くと0 になるから+1する必要がある)
あと、月の上中下旬単位でのみ考える(2/12 は2/20と同等に扱う)
Function kikan(date1 As Date, date2 As Date) As Integer
Dim res As Integer
res = DateDiff("m", date1, date2) - 1 'VBAでは単純な月の差なのでDay(開始日)>Day(終了日) となる場合を気にしなくていい
If res < 0 Then '同じ月
252:res = min2((Day(date2) - 1) \ 10, 2) + 1 res = res - min2((Day(date1) - 1) \ 10, 2) Else res = res * 3 res = res + 3 - min2((Day(date1) - 1) \ 10, 2) res = res + 1 + min2((Day(date2) - 1) \ 10, 2) End If kikan = res End Function Function min2(a, b) : min2 = IIf(a < b, a, b) : End Function あと、各(月3分割)の均等割を出すとき、単純に等分した数値を次々加算していくと誤差が出る可能性があるので、その都度かけ算で計算しなおした方がいいよ
253:デフォルトの名無しさん
20/05/24 18:45:45 X8IGI7Pl.net
均等ではなくなることが分かっているのに均等割というのは一体
均等ではないなら分割の明確なルールと呈示するのが先だろうに
254:デフォルトの名無しさん
20/05/24 20:23:46.09 Ij6CWItZ.net
select case iDay
case 1 to 10
’上旬
case 11 to 20
’中旬
case else
'下旬
end select
こんなんでいいんじゃねーの
255:デフォルトの名無しさん
20/05/24 20:26:51.14 WNKMZrc1.net
理解ができるのがすげぇよ
俺には文章から何がしたいのか分からん
256:デフォルトの名無しさん
20/05/24 20:35:05 CLZ8mfOM.net
me,too
257:デフォルトの名無しさん
20/05/24 20:45:14 i+YVCLEB.net
セルに値を手動入力中にVBAから別のセルにアクセスがあるとエラー落ちするんだけど、非同期に処理する方法はないんかね。
VBA側はインターバルタイマーでデータ処理させてて、一方でユーザーはメモ入れたり諸作業したいんだ。
258:デフォルトの名無しさん
20/05/24 20:46:27 8AgUd6nh.net
vb全然知らないんだけどサクッと教えてほしい
Range("C2").AutoFill Destination:=Range("C2:C804"), Type:=xlFillDefault
というオートフィル用をするコードがあるとする。
このコードの804部分はいつでも固定値だからセル内の数字を参照するような可変にしたい
一応このコードの前に
Volume = Range("J5").Value
として数字があるセルから数値をVolumeに得てるんだけど
このVolumeを804の部分に当てはめたい
どうしたらいい?
259:デフォルトの名無しさん
20/05/24 21:22:14.11 xjag2nx7.net
>>247
馬鹿は死ねよ
260:デフォルトの名無しさん
20/05/24 21:26:46.69 YjTDgAdj.net
>>247
" "は文字列を表す
261:デフォルトの名無しさん
20/05/24 21:29:42.85 IJT9Ws79.net
>>247
C2からvolume個の連続データ(volumeは可変)を作りたいんだとしたら
.AutoFill Destination:=.Resize(volume)
とかどうやろね
262:デフォルトの名無しさん
20/05/24 21:35:15.28 IJT9Ws79.net
>>246
セマフォ(いわゆる排他処理)をエクセルでやるのか
実現するのは結構テクニカルになるね
仮にAccessが使えるなら使ったほうがすっきりするかと
263:デフォルトの名無しさん
20/05/24 21:50:08.32 8AgUd6nh.net
>>250
C2から始める場合はどうしたらいい?
264:デフォルトの名無しさん
20/05/24 22:01:27.85 IJT9Ws79.net
volume = Range("j5")
With Range("c10")
.AutoFill Destination:=.Resize(volume)
これでだめ?
265:デフォルトの名無しさん
20/05/24 22:42:24 Ij6CWItZ.net
Volume = Range("J5").Value
Range("C2").AutoFill Destination:=Range("C2:C" & cCtr(Volume)), Type:=xlFillDefault
こういうことじゃね
266:デフォルトの名無しさん
20/05/24 22:43:40 Ij6CWItZ.net
× cCtr
〇 cStr
267:デフォルトの名無しさん
20/05/24 23:13:25.93 FPjhV5Sl.net
>>246
VBAでブックへの書き込みがないなら、外部から読み取り専用で開いてデータだけ頂いて処理する方法がある
例えばVBScriptならVBAからソースをコピペできる部分も多い
後はChangeイベントで変更が行われた時に、バックエンドとデータを同期する。
処理自体はバックエンドが行う。
サーバーは空いてるPCに(VBA�
268:ナ実行したければ)Excelをインストールして使えばいい。
269:デフォルトの名無しさん
20/05/25 03:36:22.58 fpmiA/eB.net
セルに手入力してるんだから保存するんじゃね
270:デフォルトの名無しさん
20/05/25 07:55:53 2rkq/dFE.net
>>240
遅くなり申し訳ないです。説明が下手すみません。後でゆっくり読んで理解してみます。
271:デフォルトの名無しさん
20/05/25 07:58:34 2rkq/dFE.net
>>241
知らないコードあるので調べて見ます。
272:デフォルトの名無しさん
20/05/25 13:23:07 arQu/7J9.net
セルの入力規則の選択項目をコンボボックスのListindexみたいに番号抽出って出来ないんでしょうか
273:デフォルトの名無しさん
20/05/25 15:12:23 TkkoIJYG.net
できる
274:デフォルトの名無しさん
20/05/25 15:21:07 TNrQR7ea.net
"セルの入力規則の選択項目"と言っているのは、
データの入力規則ウインドウ-設定タブ-条件の設定について、
入力値の種類を"リスト"にしたときの"元の値"に入力した各値のこと?
あとわざわざ番号で抽出する意味は?
この"元の値"をVBAでセル(range)のプロパティから取得すると、だいたい下のどちらかのパターンのStringとなる。
1 "元の値"に入れたそのままのリスト用文字列(「a,b,c」など)
2 "元の値"に入れた参照セル範囲(「=$A$1:$A$5」など)
「番号抽出」とかいう言葉がよく分からんけど、上記で
1なら文字列を配列にするなどで解析して、セルの値(Value)で取得する
2なら参照先を取得して配列にするなどする
とかで"元の値"を利用できるはず
わざわざIndexを取りたいならその配列なりから取ればいい
目的がおかしくなってる可能性がある
275:デフォルトの名無しさん
20/05/25 16:03:17 WdAmw2Xs.net
>>260
Function validFormula(c as Range) '選択セルの入力規則式を取得(簡易版)
validFormula = Evaluate(c.Validation.Formula1)
End Function
というユーザー定義関数を用意して
=MATCH(A1,validFormula(A1),FALSE)
の様な感じ
276:デフォルトの名無しさん
20/05/25 16:41:06 arQu/7J9.net
>>262
説明が下手ですいません
やりたい事は以下のとおりです。
?表示する場合
・機器と通信して、通信データ読み出すとIndex(数値)が取得できる。(変更不可)
・取得値が1の場合、選択リスト要素が"aa,bb,cc,dd"とするとセルにはaaが選択される。
?取得する場合
・セルの選択リストの選択要素が"dd"だった場合、4を返すとなる
・Index=4を通信で送る
コンボボックスだと楽に出来るのですが、セルを使った場合の対処に困っています。大量に項目があるのでコンボボックス一つずつ作成は対応できなくて。
277:デフォルトの名無しさん
20/05/25 18:18:30 pvRy3Vo6.net
PDF出力をするときに、ファイル名をBK19にして、同じフォルダ内の、
"納品書"というフォルダ内に保存したいのですが、保存場所が同じフォルダの同じ階層になってしまいます。
"納品書"フォルダに保存する方法をお願いします
Dim PATH_ As String 'このブックと同じフォルダの"納品書"フォルダ
~途中省略
PATH_ = ThisWorkbook.Path & "\" & 納品書
~途中省略
sh.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PATH_ & Range("BK19"), OpenAfterPublish:=False
それと、ネット上のサンプルの中に、For文のNextの後の変数が書いていないものがありますが、どういう時に書かなくていいんですか
278:260
20/05/25 18:21:44 arQu/7J9.net
出来ました。
279:デフォルトの名無しさん
20/05/25 19:12:11.07 kYm8Dr+5.net
> PATH_ = ThisWorkbook.Path & "\" & 納品書
PATH_ = ThisWorkbook.Path & "\納品書"
280:デフォルトの名無しさん
20/05/25 19:17:16.20 0mNo0xGU.net
すみませんエクセルですが教えてください
セルに2020/5/25と入っている。
2020/5/25(月)というテキストにしたい。
281:265
20/05/25 19:27:24.37 pvRy3Vo6.net
>>267
試しましたが、納品書フォルダには保存されず、同じ階層に保存されてしまいます。
282:デフォルトの名無しさん
20/05/25 19:32:32.8
283:0 ID:RZDTWD0g.net
284:デフォルトの名無しさん
20/05/25 19:37:30.13 voBvEsJz.net
ごめ
PATH_ = ThisWorkbook.Path & "\納品書\"
これは?
285:265
20/05/25 19:45:38 pvRy3Vo6.net
>>271
ありがとうございます。納品書フォルダに入るようになりました。
286:デフォルトの名無しさん
20/05/25 20:09:54 0mNo0xGU.net
>>270
さらに、テキスト化は
できますか?
287:デフォルトの名無しさん
20/05/25 20:55:09 +lR6vdzO.net
>>273
text関数
288:デフォルトの名無しさん
20/05/25 21:16:44 Xi2PhkBU.net
>>273
死ね
289:デフォルトの名無しさん
20/05/25 21:40:54 oBwL7wIu.net
>>275
この馬鹿モンが!
290:デフォルトの名無しさん
20/05/25 22:09:44 5DLeDpsM.net
dim sine as object
291:デフォルトの名無しさん
20/05/25 22:59:11 SN+Wx3Rt.net
Set sine = Nothing
292:デフォルトの名無しさん
20/05/25 23:18:40.90 jPur8MoZ.net
テンプレから複数作ってく場合テンプレの右にどんどんコピーしていって
あとでテンプレシート以外を新しいブックに保存
これだとなぁ、おばちゃんがややこしいと文句言うかも
悩むなぁ
293:デフォルトの名無しさん
20/05/26 10:12:12.68 TGtSSAvG.net
ややこしや
294:デフォルトの名無しさん
20/05/26 12:54:30.53 aCjjmYBU.net
所属してる部署や業務によってやりたい処理が違うから全部まんべんなく覚えていきたいという無駄な欲を捨てんといかんなぁ
はぁぁ大学行かずに専門とかで情シス専攻すればよかった
295:デフォルトの名無しさん
20/05/26 15:22:17 QaHLpt3K.net
アホはしね
296:デフォルトの名無しさん
20/05/26 15:33:26 aCjjmYBU.net
毎回それ言うためだけに見に来てるんなら
見なきゃいいのに
297:デフォルトの名無しさん
20/05/26 17:01:22 xe35/PQB.net
IT畑の人間は既存の業務フローを神聖不可侵な絶対的公理と考えてそれを自動化しようという発想をしがちだけど、それは注意が必要だと思うわ
自動化以前にそもそも無駄な業務って沢山ある
特にVBAで安易に自動化したくなるような業務はその傾向が強くて、現場の人間とちゃんと話せばあっさり消滅したりするもんだ
298:デフォルトの名無しさん
20/05/26 17:18:49.31 2eoVc4aq.net
客の業務自体の改善に付き合うなんていうめんどくさい事はしないよ
299:デフォルトの名無しさん
20/05/26 18:59:45.92 LKm82hyE.net
客じゃなくて自分の会社なんだろ
300:デフォルトの名無しさん
20/05/26 19:26:44.98 VDow7UZ6.net
これはおかしくね?と思っても依頼されたように作るしかない
301:デフォルトの名無しさん
20/05/26 19:38:37 4UYpyuwL.net
ああ、上司の命令ならな。
反論しろって?
10個の工程をPGが3工程くらいに短縮すると、理解できなかったりするんだよな。
302:デフォルトの名無しさん
20/05/26 19:50:36.19 e8iGmvo7.net
そりゃおまいさんが問題の分離ができてないのでは
303:デフォルトの名無しさん
20/05/26 19:52:38.59 MDEhHweB.net
自社の業務改善って自分もしくは管理下の範疇でしかしないわな
責任取れる範囲でやらないと痛い目みるし、ドキュメントだ体制だルールだなんだ面倒だしな
基本周りは全部敵だよ
304:デフォルトの名無しさん
20/05/26 20:18:36 l4mmL3sO.net
そういう組織は長生きしないだろうな
305:デフォルトの名無しさん
20/05/26 20:25:34 EtaD8bXQ.net
>>230
Ruby で作ってみたけど、めちゃめちゃ複雑な仕様だった!
2020/05/21 ~ 2023/02/12
を以下の、3つの期間に分けて、[0, 94, 5] となった!
~2019/12/31
2020/1/1~2022/12/31
2023/1/1~
306:292
20/05/26 20:30:27.90 EtaD8bXQ.net
10日ごとの期間の数が、[0, 94, 5]
307:デフォルトの名無しさん
20/05/26 20:41:03.58 I81g2H63.net
所定のフォルダの中に「AAA.xl�
308:唐�」という名前のエクセルファイルがあった場合、そのファイルを削除し、 その後同一フォルダ内のエクセルファイルを「AAA.xlsx」というファイル名に変更する、という処理を しています。マクロ作成当初は問題なく処理できていたのですが、数日前からファイルを削除した後 実際にはエクセルファイルがあるにもかかわらず「エラー53 ファイルが見つかりません」とエラーが でるようになりました。終了ボタンを押してエラーウィンドウを閉じた後、同じ処理をすると今度は エラーが出ずに処理できます。 コード自体は変更していないのですが、このように実際には該当するファイルがあるにもかかわらず、 1度目(ファイル削除後ファイル名変更。ファイル削除処理は正常終了)はファイルが見つからずエラー、 2度目(削除するファイルがない状態でファイル名変更)は正常に処理が終了、となってしまう原因で なにか思い当たるものがある人いますか? 具体的には AAA.xlsx 20200526.xlsx ↓(AAA.xlsxを削除)←1回目はこの処理の後エラー53 20200526.xlsx ↓(ファイル名変更) AAA.xlsx となり、2回目は 20200526.xlsx ↓ AAA.xlsx で正常に処理ができます。 ファイル名変更は Name "*.xlsx" as "AAA.xlsx" で処理しています
309:デフォルトの名無しさん
20/05/26 20:46:55.97 VDow7UZ6.net
>>294
エラーが出るコードを見なきゃわからん
310:デフォルトの名無しさん
20/05/26 21:22:32.89 EtaD8bXQ.net
>Name "*.xlsx" as "AAA.xlsx"
何となく、この、* がヤバそうw
311:デフォルトの名無しさん
20/05/26 21:32:47.20 PZVl0MiE.net
プロパティのセットで配列や複数の引数を渡したいんだけど、送り手側の構文エラーにしかならない
調べても見つからないんだけど普通やらないの?
Variantで宣言しておけば通るっぽいけど
312:デフォルトの名無しさん
20/05/26 22:38:28 3xGTmG1z.net
Sub テキストをエクセル() 'txtをエクセル化
With CreateObject("wscript.shell")
.currentdirectory = "C:\"
End With
Application.Dialogs(xlDialogOpen).Show "*txt.*"
End Sub
色々調べて作ってみたんですが
テキストファイルウィザードのウィンドウが出て完了を押す という手間が残りやす…
この手間をスキップというか直接Excelにデータ変換…教えてください
313:デフォルトの名無しさん
20/05/26 23:46:26.84 l/nHkMvV.net
また馬鹿が来た
馬鹿は何をやりたいかすら自分で把握すらしていないから馬鹿なんだよ
314:292
20/05/26 23:56:54 EtaD8bXQ.net
>>230
Ruby で作ってみたけど、めちゃめちゃ複雑な仕様だった!
URLリンク(paiza.io)
315:デフォルトの名無しさん
20/05/27 01:10:50.60 bxZskA6m.net
>>291
組織なんて巨大になるほど無駄が増えていくもんだ
316:デフォルトの名無しさん
20/05/27 15:11:46 ILM8Kvmo.net
>>298
開きかたがそもそも違う
317:デフォルトの名無しさん
20/05/27 20:47:31 5ROZxNJ2.net
>>297
配列のプロパティは代入と同じくLet(値渡し)での宣言になる
でも配列は参照渡ししかできないので矛盾が起きて渡せない(ByRel宣言しろと怒られる)
Variantか、インスタンス変数をPublicにするか、Javaみたいにアクセスメソッドを作る
SetterがあるならGetterもあるだろうからPublic宣言がいいんじゃないかな
318:デフォルトの名無しさん
20/05/27 20:55:13.77 trt6Afr5.net
294です。エラーが出るコードは以下です
--------------------------------------------------------------------
Sub 入力用フォルダ内の入力用ファイル削除()
Dim myPath As String
myPath = ThisWorkbook.Path & "\入力用\" '入力用.xlsxがすでに存在したら削除
If Dir(myPath & "入力用.xlsx") <> "" Then
Kill myPath & "入力用.xlsx"
End If
End Sub
--------------------------------------------------------------------
Sub 入力用フォルダ内のファイル名変更()
Dim myPath As String
Dim myFile As String
myPath = ThisWorkbook.Path & "\入力用\" '事前にこのフォルダにファイルを入れておく
myFile = Dir(myPath & "*.xlsx")
Call 入力用フォルダ内の入力用ファイル削除 '前回の入力用.xlsxが残っていたら先に削除
Name myPath & myFile As myPath & "入力用.xlsx" 'ファイル名変更
・
・
--------------------------------------------------------------------
エラー53の際にデバッグボタンを押すと最後の
319: Name myPath & myFile As myPath & "入力用.xlsx" の行が選択されているので。「myPath」内に「*.xlsx」がない、ということでエラーになっていると 思いますが、実際にはファイルはあるのでもう一度マクロを実行するとファイル名が変更される という状況です
320:デフォルトの名無しさん
20/05/27 21:41:05 d63wepvX.net
>>298
>色々調べて作ってみたんですが
他にもあったろうに、よくそんな奇抜な方法を見つけ出したなw
そのインポートウィザード自体をマクロで記録して改造すればいいんだよ。
321:デフォルトの名無しさん
20/05/27 22:17:38.57 auut2Mwo.net
>>304
なぜエラーになった時のmyFileの値を確認しないの?
322:デフォルトの名無しさん
20/05/28 09:11:03 oSYrowbf.net
Dir関数って何でコレクション返さずに、あんな奇妙な実装なんだろ
なんか訳があるのか
323:デフォルトの名無しさん
20/05/28 09:41:03 2MUNkHgk.net
>>307
ファイルが大量にあるとコレクション取得に時間がかかる
イテレータがないVBAとかCだとDir()みたいな方式は珍しくないよ
324:デフォルトの名無しさん
20/05/28 09:59:38.59 8QzLeV6c.net
FDなんかでディレクトリエントリの順番変えて高速化とかの時代
325:デフォルトの名無しさん
20/05/28 12:03:25.03 u/WM2FVL.net
vlookupの参照値がエラーの場合に違うところに飛んでしまいます。エクセルの関数みたいにIFERROE(VLOOKUP(**,**,3,FALSE),"")みたいな処理をするためのコードを教えてください
Dim bigcnt As Long
Sub test()
Dim Pagecnt As Long
Dim rycnt As Long
Dim syouhin As Long
Dim Rowcnt As Long
For Pagecnt = 1 To MaxPage Step 1
Range("DX8").Value = Pagecnt
Rowcnt = 1
For tycnt = 12 To 30 Step 2
On Error Resume Next
Range("K" & tycnt).Value = _
Application.WorksheetFunction.VLookup( _
Application.WorksheetFunction.VLookup(bigcnt,Sheets("uuu").Range("A:C"), 2, False) & "P" & (Pagecnt * 10) - 10 + Rowcnt, _
Sheets("list").Range("B:FU"), 107, False)
Rowcnt = Rowcnt + 1
Next tyucnt
326:310
20/05/28 12:03:59.29 u/WM2FVL.net
つづき
Rowcnt = 1
For syouhin = 12 To 30 Step 2
On Error Resume Next
Range("AC" & syouhin).Value = _
Application.WorksheetFunction.VLookup( _
Application.WorksheetFunction.VLookup(bigcnt, Sheets("uuu").Range("A:C"), 2, False) & "P" & (Pagecnt * 10) - 10 + Rowcnt, _
Sheets("list").Range("B:FU"), 63, False)
Rowcnt = Rowcnt + 1
Next syouhina
Next Pagecnt
End Sub
↓のこの変でエラーがでると、次の処理が予測不能な参照値に飛びます
bigcnt,Sheets("uuu").Range("A:C"), 2, False) & "P" & (Pagecnt * 10) - 10 + Rowcnt, _
"On Error GoTo 0"にしてもvlookupで参照できずにとまり、やはり予測不能な参照値に飛びます
bigcntは正しい値に更新されていました
327:デフォルトの名無しさん
20/05/28 12:27:26 CwUX9Txr.net
next に変なカウンタつけるなよ
328:310
20/05/28 13:05:26.67 u/WM2FVL.net
すみません。
rycnt→tycnt
tyucnt→tycnt
syouhina→syouhin
329:デフォルトの名無しさん
20/05/28 13:15:00 8QzLeV6c.net
読む気無いけどvlookup使うのは高速化とかが目的?
VBAerなら自分で探したほうが融通効かないか?
330:デフォルトの名無しさん
20/05/28 13:28:52.23 VMjOSmuX.net
悪いけど、vlookup使う方がセンスいいと思うよ
331:デフォルトの名無しさん
20/05/28 13:51:27 EbwElpou.net
俺もそう思う
332:デフォルトの名無しさん
20/05/28 14:17:55.81 fQiHMFwM.net
正直まともに読む気がしなくなる
・誤字が多すぎてエラーにならないわけがない(手打ちしてるんだろ)
・シート上の範囲とかシート名、構成が不明すぎる
・同じく変数が不明すぎる(こちらはbigcntとかmaxpageとか全く知らない)
・何でデバッグで一時変数に入れるとかしないのか(二つめと四つめのVlookupは返り値とれるやろ。エラーがでるならそこかもしれんやろ、しらんが)
・なんでon errorはその二つしか試してないの、てかデバッグするなら回避しなければいいのに
速度求めるのにworksheetfunction使うのはいいけど、
こんな感じで雑に使うと可読性下がるから、そこは理解して�
333:ツかって
334:デフォルトの名無しさん
20/05/28 14:35:32.74 1No7OPPN.net
こんな感じかな
Function myVLookup(lookup, tbl As Range, col As Integer, Optional flg = True) '個人的にはflg=Falsebノしたいけど
On Error GoTo err1
myVLookup = WorksheetFunction.VLookup(lookup, tbl, col, flg)
Exit Function
err1:
'Debug.Print lookup, tbl.Address
myVLookup = ""
End Function
335:デフォルトの名無しさん
20/05/28 14:55:35.18 1No7OPPN.net
訂正
× Optional flg=True
○ Optional flg=1
VBAだから、True=-1だっけ
336:デフォルトの名無しさん
20/05/28 15:47:43 A0D9Z3DQ.net
vbaerってなんでしょうか?
337:デフォルトの名無しさん
20/05/28 16:26:49 Xg+0aVY9.net
>>320
URLリンク(google.com)
338:デフォルトの名無しさん
20/05/28 17:23:33.07 vsv+AImU.net
測定系の部署だから
エクセル関数でもリスト作ったりとかそういうのは使わないんだよぁ
計算系はすんげぇ使う
339:デフォルトの名無しさん
20/05/28 17:32:02 NxeE/SGI.net
100万行以上ある表で特定の範囲に太字があるセルがある場合にTrueを返却したいのですが、
セルをループする以外で判定する方法はないでしょうか。
ループだと遅いので他の方法を探しています。
340:デフォルトの名無しさん
20/05/28 17:40:50.70 YLdey8mA.net
太字で判定するしかない設計を見直す
341:デフォルトの名無しさん
20/05/28 17:53:26 6oAsq0wQ.net
>>323
俺も色やフォントでデータを判定する方式はExcelには向いてないから今すぐやめるべきだと思う
とりあえず、名前を付けて保存、範囲指定で太字を解除してもう一度別名保存、ファイルサイズの比較
342:デフォルトの名無しさん
20/05/28 18:24:58.06 NxeE/SGI.net
>>324-325
私もすごくそう思います。ほんとアホな現場です。
vbaや関数で高速判定する術は無いということになりますかね…
343:デフォルトの名無しさん
20/05/28 18:33:29.93 1No7OPPN.net
例えば、セルB1にして =GET.CELL(20,A1)*1 を LeftIsBold とでも名前定義
太字を確認したい列の右隣に、=LeftIsBold と入力して、それを合計する
遅いか速いかは知らないけど、Excel4.0マクロだから、ユーザー定義関数関数使うよりは早いと思う
あと、文字単位の太字には未対応
太字で判定する設計が良くないのは同意
344:デフォルトの名無しさん
20/05/28 18:44:24.85 nu6DWAbq.net
ユーザーフォームを印刷したいんだけどA4横印刷で一枚に収まるように倍率変更って出来ない?
ちょろっと調べると印刷設定に依存するとか書いてある。
吐き出し用のシートやらコード書くの面倒だし、フォームだけが印刷出来ればいいんだが本当に無理?
345:デフォルトの名無しさん
20/05/28 19:09:14 HPtbnCn7.net
>>328
1回PDFにして、PDFビューアの機能でA4フィット印刷 じゃだめ?
346:デフォルトの名無しさん
20/05/28 19:19:51 GEIkGrn6.net
>>326
XMLで読み込めば判るんじゃないの?
347:デフォルトの名無しさん
20/05/28 20:56:43 0S10FlCu.net
>>330
100万行のワークシートをXMLにするとデータ量が10陪ぐらいになることもあるから、たぶんワークシートをVBAで直接調べた方が早い
348:デフォルトの名無しさん
20/05/28 21:21:26 PIoPunSP.net
>>323
usedrangeの範囲を太字で検索してあればtrueは?
349:デフォルトの名無しさん
20/05/28 21:44:10.77 GEIkGrn6.net
>>331
じゃあXMLを自分宛てにメールで送って、Gmailで検索するのは?
ってもうExcelじゃないわ。
350:デフォルトの名無しさん
20/05/28 22:37:07 0S10FlCu.net
>>333
ネットを経由したらもっと遅くなると思うぞ
351:デフォルトの名無しさん
20/05/28 22:48:39 0S10FlCu.net
>>323
100万セルのBoldプロパティを調べるコードを作って実験してみたけど数秒で終わったぞ
範囲が限られてるなら一瞬で終わるんじゃない?
これより早くする方法はないと思うぞ
352:323
20/05/28 23:44:38 AwZmzoZa.net
みなさんいろいろありがとうございます。
結局ループですることになりそうです
>>335さんのコードと同じような気がしますが、その数秒~十数秒が短縮できないかなと思ってました。
ありがとうございました。
353:デフォルトの名無しさん
20/05/29 00:08:23 QVnkNeSg.net
まあどう考えても>>324
354:デフォルトの名無しさん
20/05/29 06:08:45 OHJZg62K.net
業務上100万件のデータ処理が必要なら専用のソフトを独自に作るべきだろう
初心者にVBAでやらせる上司が無能としか言いようがない
今までその業務手作業でやってたんだとしたらそのままのやり方続けていればいいんじゃね
355:デフォルトの名無しさん
20/05/29 06:43:32.30 z6j/3IlC.net
>>329
印刷出来れば構いません。
356:310
20/05/29 10:32:29 I8K8veff.net
>>318
ありがとうございます。エラーを回避できました
357:デフォルトの名無しさん
20/05/29 12:52:21 UXGV4L+b.net
物凄いコードを3つ
前スレで教えてくれたあの人たちが
今でもここを見てくれてますように
358:デフォルトの名無しさん
20/05/29 12:59:11 wRO7TzMi.net
>>323
その範囲.Font.Bold
359:デフォルトの名無しさん
20/05/29 13:16:11 I8K8veff.net
指定したフォルダ内の"B"で始まるxlsファイルの"表紙"シートの各箇所を
このブックの"comp"シートA~C列の2行目以降に書き出していくコードを教えてください
Dim path As String ,buf As String, i As Long
Dim mysheet As Worksheet, srcbook As Workbook, srcsheet As Worksheet
With Application.FileDialog(msoFileDialogFolderPicker)'フォルダを選択する
If .Show = 0 Then
MsgBox "キャンセルされました。"
Exit Sub
End If
path = .SelectedItems(1)
End With
Set mysheet = ThisWorkbook.Worksheets("comp")
buf = Dir(path & "B*.xls")
Do While buf <> ""
i = i + 1
Set srcbook = Workbook.Open(path + buf)
Set srcsheet = srcbook.Worksheets("表紙")
mysheet.Cells(i, 1).Value = srcsheet.Cells(3, 13)
mysheet.Cells(i, 2).Value = srcsheet.Cells(5, 2)
mysheet.Cells(i, 3).Value = srcsheet.Cells(7, 2)
srcbook.Close False
buf = Dir()
Loop
を試したのですが、だめでした
360:デフォルトの名無しさん
20/05/29 13:36:39 Afg8U+25.net
debug.print入れまくれ
で、どこがどうだめだったの?
361:デフォルトの名無しさん
20/05/29 13:38:45 x/xJoOz3.net
buf = Dir(path & "B*.xls")
の後ろに、
Debug.print buf
Debug.print path & "B○○.xls" <--実際のファイル名を入れる
で、何か気づくと思うよ
362:デフォルトの名無しさん
20/05/29 14:59:14 4ofbCjLS.net
xls形式って古くね
363:デフォルトの名無しさん
20/05/29 15:00:54 xfksWnzq.net
Dir君はいい加減デバッグ機能覚えようぜ
ローカルウインドウ見ながらステップイン連打しよう
364:343
20/05/29 16:23:07 I8K8veff.net
>>344,345,346,347
できました!ありがとうございます。
path & "B*.xls"
↓↓↓↓↓↓
path & "\B*.xls"
Workbook.Open(path + buf)
↓↓↓↓↓↓
Workbooks.Open(path &"\"& buf)
だったみたいです
365:デフォルトの名無しさん
20/05/29 18:24:55.94 ofRjPTJp.net
教えてください
クリップボードにあるキャプチャを全て貼り付けるマクロできますか。
ちなみに、win+Vで、過去のキャプチャ履歴が出てきます
366:デフォルトの名無しさん
20/05/29 18:44:55 FhfEW/N2.net
過去の履歴はクリップボードにはもうありません
367:デフォルトの名無しさん
20/05/29 19:17:03 /mLagXjz.net
馬鹿の特徴
教えて、助けて系で始まる書き込みをする
368:デフォルトの名無しさん
20/05/29 19:46:11 ofRjPTJp.net
>>350
win+Vやってみれば分かります。
蓄積していきます。
369:デフォルトの名無しさん
20/05/29 20:15:13 o3jQNOd+.net
>>350
昔はフリーウェアで対応してたけど、Win10のクリップボードには履歴機能が標準で付いた
370:デフォルトの名無しさん
20/05/29 20:22:58 rds5fVij.net
馬鹿は、Win10全て
371:が同じだと思っている
372:デフォルトの名無しさん
20/05/29 21:14:41.12 Z5PYtswD.net
なるほどね
APIが公開されているからそれを使えばいいと思うよ
373:デフォルトの名無しさん
20/05/29 21:47:35 be+QuDfe.net
Debug.Printの代わりにMsgbox
↓
うっかりループで使う
↓
必死に×とかEsc連打
374:デフォルトの名無しさん
20/05/30 00:10:31 r1iWOzqa.net
VBAで親クラスのインスタンスを子クラスに渡して子クラスから親クラスのメソッドにアクセスする方法ってあります?
375:デフォルトの名無しさん
20/05/30 05:29:34.61 n48qxrxQ.net
母のパンティを娘に渡して
娘から母のセックスにチェンジする方法はあるよ
376:デフォルトの名無しさん
20/05/30 06:41:58 lz52cF2O.net
>>350
いつまでXP使ってるんだよ
377:デフォルトの名無しさん
20/05/30 10:18:37 Lg+IyK0J.net
仕様書みたいの書かないとダメだな
数年前に自分で作ったの手直ししなきゃなんだけど
結構でかいんでコード理解して全体像を把握するのが大変だわ
仕様書とかそういうのってたぶん書き方があるんだろうね
その辺勉強しなきゃダメだね
378:デフォルトの名無しさん
20/05/30 10:44:24 A129boaw.net
過去の自分が書いたソースは他人が書いた物
379:デフォルトの名無しさん
20/05/30 10:47:20 gDHPXROS.net
?画面をプリントスクリーン
?エクセルなりを開いてペースト
?戻る
??がいちいち面倒くさいので、理想的にはプリントスクリーンすれば勝手にそれがペーストされていけば良いのですが。できないかな。
380:デフォルトの名無しさん
20/05/30 11:13:20 gDHPXROS.net
続き
あるいはwin+Vで貯まってるキャプチャを自動的にダウンロード出来れば、と思いました
381:デフォルトの名無しさん
20/05/30 11:26:13.81 4gyXKXc6.net
>>362
URLリンク(github.com)
382:デフォルトの名無しさん
20/05/30 11:40:59.92 Lg+IyK0J.net
氏名住所をユーザーフォームで連続入力してリストに登録するじゃん
んで、フォーム上の印刷ボタンを押すと、ワークシート上に用意されてるテンプレ書類に
氏名住所が必要な箇所に順次記入されて印刷される
ていうよくありがちなプログラムあるでしょ
このテンプレ書類に数式を使って氏名住所を別のセルにも転記するようにしておく
例えば、VBAでA1に氏名が記入されるとすると
B1に =A1 って書いておけばB1にも氏名が記入されて印刷される
これも当たり前なんだけど
このB1に入る数式にユーザー定義関数使うと、うまく動かないのな
Application.Calculate とかもうまくいかなかったわ
うまくいかないってのは計算してくれないってことだけど
383:デフォルトの名無しさん
20/05/30 12:46:49.94 gDHPXROS.net
>>364
サンキューさん
これなら使えそうです。
384:デフォルトの名無しさん
20/05/30 13:37:34.40 VTd6O4v1.net
同じなんだけどVBAで膨大な演算処理をコード組んでプロシージャ合わせて作っても
おっさんから
「ああ、マクロの記録して作ったやつね」
て言われると少しイラつく
記録じゃつくれねーほど汎用性高くしてんだろうがボケが
385:デフォルトの名無しさん
20/05/30 13:50:56.52 LDe7UQpm.net
vbaごときでイキっててわろた
386:デフォルトの名無しさん
20/05/30 14:27:17 +Oty3aJ4.net
無知は罪
387:デフォルトの名無しさん
20/05/30 14:46:50 A129boaw.net
そこでイラついてるうちはまだまだ
388:デフォルトの名無しさん
20/05/30 15:22:49 uSpMLuhJ.net
VBAはOLさんでも出来る(正論)
389:デフォルトの名無しさん
20/05/30 15:27:58 4gyXKXc6.net
マクロの記録しかできない人、Win32APIを使いこなす人、どっちも「VBAができる人」と言われてしまう
390:デフォルトの名無しさん
20/05/30 15:39:22.28 49ARh1d+.net
トリッキーなことはやらない方がいい
391:デフォルトの名無しさん
20/05/30 15:45:07 49ARh1d+.net
>>365
個人情報とかちゃんと管理しないと流出した場合責任とれる?
392:デフォルトの名無しさん
20/05/30 16:36:13 PhwvBcVJ.net
>>365
393:Application.Calculate じゃなくて、Application.Volatileだぞ ワークシートの数式の方に、 &REPT("",NOW()) とかでもいいはず
394:デフォルトの名無しさん
20/05/30 16:55:50.78 NW87G0lL.net
>>367
そんなことでイラつく自分を見直そう
395:デフォルトの名無しさん
20/05/30 17:00:12.37 EKBxQQvi.net
14列目から全てセルの巾15ピクセルで固定されてます。指定したピクセル数に伸ばしたり縮めたりしたいんですがどうしたらいいですか?
privata Function AAA(objTarSht,intPicel)
clmTar=14
do until objTarSht.Cells(1,clmTar)=空
ここ
clmTar=clmTar + 1
loop
396:デフォルトの名無しさん
20/05/30 17:25:53.46 4gyXKXc6.net
>>377
Private Function AAA(objTarSht, intPixel)
clmTar = 14
Do Until objTarSht.Cells(1, clmTar) = ""
Columns(clmTar).ColumnWidth = intPixel * 0.118
clmTar = clmTar + 1
Loop
397:デフォルトの名無しさん
20/05/30 17:36:07 x6N4SK2n.net
セルのHJ1に式で「=TEXT(EDATE(DE2,(DAY(DE2)>20)+(DT2<>"")),"yyyy""_""m")」をいれて、
最下行までオートフィルをして、HJ列をコピペで値だけにしていますが
vbaのforで作ってみたいので、この部分をVBAにした場合のコードを教えてください
「=TEXT(EDATE(DE2,(DAY(DE2)>20)+(DT2<>"")),"yyyy""_""m")」
398:デフォルトの名無しさん
20/05/30 17:41:18 NW87G0lL.net
いやまず自分で作ってみろよ…
399:デフォルトの名無しさん
20/05/30 18:14:09.22 HFWpOc40.net
>>359
馬鹿は書かなければいいのに
400:379
20/05/30 18:40:42.91 x6N4SK2n.net
=TEXT(
EDATE(DE2,
(DAY(DE2)>20)+(DT2<>""))
,"yyyy""_""m")
の並び順で
For cnt = 2 To i
Range("HJ1") =
Format( _'「=TEXT(」にあたる部分
**********'「EDATE(DE2,」EDATEにあたる部分
'「(DAY(DE2)>20)+(DT2<>""))」にあたる部分
DateSerial(Range("DE" & cnt) > 20 + (Range("DT" & cnt) <> "")
,"yyyy""_""m" '「,"yyyy""_""m")」にあたる部分
Next cnt
401:デフォルトの名無しさん
20/05/30 18:59:33.29 IeNY1P6O.net
>>367
それ本当にマクロか?っていう圧倒的なものを作ってみるといい。
402:デフォルトの名無しさん
20/05/30 19:06:40 RuztwjMU.net
>>383
ユーザーフォームのボタンにあてがうと
有り難みが薄れるらしく
最近作るのを断ってるわ
403:デフォルトの名無しさん
20/05/30 19:52:23 NW87G0lL.net
どんだけ人間小さくて承認欲求高いんだよ…
404:デフォルトの名無しさん
20/05/30 20:13:00 v+h7hopE.net
>>367
マクロ記録でできるレベルじゃないから苛ついてんの?できるんなら言われても仕方ないだろ
ソフト屋じゃなけりゃ再利用とか考えるわけないし
405:デフォルトの名無しさん
20/05/30 20:39:02.93 x6N4SK2n.net
>>381
京都のアニメ制作会社に放火とかしそうだなw
406:デフォルトの名無しさん
20/05/30 21:05:02 n48qxrxQ.net
>>372
逆に「VBAができるわたし」は
ExcelやWordの複雑な機能のことに異常に詳しいと思われてて
難解な作業を仕事で依頼される。
それをVBAで解決できるかできないかにかかわらず。
407:デフォルトの名無しさん
20/05/30 21:08:47.70 A129boaw.net
そういう事を防ぐために能鷹隠爪で
408:デフォルトの名無しさん
20/05/30 21:10:58.46 n48qxrxQ.net
>>364
これはなにで動いているのですか?
409:デフォルトの名無しさん
20/05/30 21:14:47 49ARh1d+.net
>>388
仕事で依頼されたなら、仕事やれよ
410:デフォルトの名無しさん
20/05/30 21:45:04 /9v+/+fv.net
>>382
式が何をしようとしているのか不明。
・何でHJ1(1行目)で2行目の値を評価しているの?
・20日以降は次月として捉えているように見えるけどDT列には何が入るの?
空じゃなければ更に月を進める?
Forの使い方という点にコメント
これだけじゃ cnt がどこまで回ればよいかわからんよね。たとえば、
i = 30
For cnt 2 To i
とするか、
For cnt 2 To 30
とかす
411:れば、Loopはする。 でも書き込むセルが Range("HJ1") に固定されてるから、これじゃ同じセルに 30回、延々と上書きするだけになる。 書き込み先を動的に変える場合は、範囲Objectは Range("番地")じゃなくて、 Cells(行番号、列番号)を使うといい。この中でcntを使えば。 EDATE関数にあたるVBA関数はDateAdd TEXT関数はFormatでOK。
412:デフォルトの名無しさん
20/05/30 21:53:02 IeNY1P6O.net
>ExcelやWordの複雑な機能のことに異常に詳しいと思われてて
ありがちな誤解だよな。
プログラムがわかるから細かい機能を知らなくてもどうにか出来るわけで、
413:デフォルトの名無しさん
20/05/30 21:53:27 IeNY1P6O.net
Word、Excelの専門家じゃないってのに。
414:デフォルトの名無しさん
20/05/30 22:38:43.08 I7l9umXM.net
wordの複雑な機能って?
415:デフォルトの名無しさん
20/05/30 23:40:16 JE+7y9de.net
フィールドとか?
416:デフォルトの名無しさん
20/05/31 01:07:44 0lS4xVrw.net
WordVBAとか
417:デフォルトの名無しさん
20/05/31 01:47:47 6kaO8G32.net
初歩的ですみませんが、sub ()の()の中に文字列が入ることありますか?
買った教本の例題にこの中に文字列が書かれてるのが一つだけあるんですが、おそらくそのせいでマクロが動きません
418:デフォルトの名無しさん
20/05/31 02:38:20 2V+gQfrN.net
>>398
理解できない奴には無理
419:デフォルトの名無しさん
20/05/31 02:39:52 86R8wtw/.net
>>391
なんでわたしだけ仕事が増えるんだ
この馬鹿モンが!
420:デフォルトの名無しさん
20/05/31 02:41:39.96 86R8wtw/.net
しかも周りに座ってるような同僚は
わたしより仕事スピードが1/2~1/10の人たちばかりなのに。
421:デフォルトの名無しさん
20/05/31 02:50:27.87 0yzq8zA/.net
>>398
subプロシージャで調べてみ
422:デフォルトの名無しさん
20/05/31 02:50:46.87 6kaO8G32.net
>>399
理解できるように勉強してるので教えてください
図々しいと思いますが
423:デフォルトの名無しさん
20/05/31 02:51:03.70 6kaO8G32.net
>>402
調べてみます!
424:デフォルトの名無しさん
20/05/31 02:52:54 wkpADETk.net
>>401
じゃあ転職しろよw
425:デフォルトの名無しさん
20/05/31 02:56:41.46 2V+gQfrN.net
>>403
この段階でわからないこと自体無理なんだよ
仕組みを理解しなければ無理
公式だけ暗記して終わりの馬鹿には無理なんだよ
426:デフォルトの名無しさん
20/05/31 03:25:44.77 C8J9R7KI.net
>>375
ありがとう
でもだめだったわ
427:デフォルトの名無しさん
20/05/31 03:27:49.96 C8J9R7KI.net
>>403
VBA 引数
でぐぐる
428:蟻人間 ◆T6xkBnTXz7B0
20/05/31 04:00:28 KExNe49d.net
エクセルにはリファレンスマニュアルが付属していて、追加でインストールするとF1ヘルプで言語仕様まで見られる。
マニュアルがパソコンに入ってなかったら、管理者からエクセルのシーディーを借りてね。
429:デフォルトの名無しさん
20/05/31 05:00:56.16 pJwiV8F0.net
>>398
sub() って文法的に作れないはず
マクロが動かないのは文字列のせいじゃないかもよ
430:デフォルトの名無しさん
20/05/31 08:40:31 6kaO8G32.net
ごめんなさい
sub test ()でした
431:デフォルトの名無しさん
20/05/31 08:57:53.05 C8J9R7KI.net
Sub Test0001()
Dim i As Integer
For i = 1 To 2
Dim ary()
MsgBox "ここにブレークポイント設定"
ary = Sheet1.Range(Cells(1, i), Cells(5, i))
Next i
End Sub
A列とB列にあるいずれも5行目までの値を配列に取得するだけのプログラム
For中の一回転目はA列、2回転目はB列
こうやってForの中でaryを宣言し直せば、aryは初期化されると思い込んでたんだけどダメなのな
2回目にMsgBoxで止まったときにaryみるとA列のデータがaryに残ってしまってる
これってメモリ上に残ってて同じ所を参照し直すからなのかな
Eraseすれば消えるからいいんだけど、気づくのに時間かかったわ
こんな初歩的なこと分かってないでよく今まで組んできた
432:もんだ
433:デフォルトの名無しさん
20/05/31 09:44:52 8XtoheO9.net
すんません今時ブロックスコープない方がアレなんで
434:デフォルトの名無しさん
20/05/31 09:49:53 4iioSPSZ.net
>>398
それはLEFT()が動かないのと同じ理屈。
普通LEFT(A1,5)とか書くから。
435:デフォルトの名無しさん
20/05/31 10:44:01.62 GCI/GpSg.net
>>412
そういう動作を知るためのテストなんじゃね
残っていても上書きされるんだから問題ないし
436:デフォルトの名無しさん
20/05/31 10:47:02.74 GCI/GpSg.net
>>411
sub test("文字列")
ってことか?
437:デフォルトの名無しさん
20/05/31 11:53:35 df9CBrpd.net
>>398
呼び出し元とプロシージャそれぞれ一行ずつ書いてくれよ
438:デフォルトの名無しさん
20/05/31 12:34:25 GcFwCYXw.net
>>412
VBAのDimは書いた場所に関係なく、コード開始時に1回だけ実行される仕様
モジュールの最後に書いても結果は変わらない
Sub Test()
Dim a()
For i = 0 To 9
Dim b()
Next
Dim c()
End Sub
439:デフォルトの名無しさん
20/05/31 12:42:20 C8J9R7KI.net
>>413
あーなるほど
そこを考えるんですか、勉強になりましたわ
ただ、改めて疑問に思ったのは、同じブロックスコープ内で再度宣言してもエラーでないのはどういうことなんだろーとか
Forの中での宣言だと繰り返しといっても宣言部分は無視されるってことかな
ま、同じ事しないようにちゃんとおぼえておこ・・・
>>415
このプログラムだとそうなんだけど
ary = Sheet1.Range(Cells(1, i), Cells(5, i))
この部分が、ある条件を満たした場合のみ代入するっていうコードだとします
んで、条件満たさなかった場合には代入されないため、A列のデータがaryに残っちゃっておかしな事になっちゃってたわけですよ
自分で実際に組んでるコードはも少し複雑なものなので
440:デフォルトの名無しさん
20/05/31 12:44:02 C8J9R7KI.net
>>418
ありがとうございます
全然知らなかったです
ちょい調べてみます
441:デフォルトの名無しさん
20/05/31 13:55:17.54 W/GxV3g0.net
>>401
お前は周りにない知識が多少あることに優越感持ってるだけで仕事できる人間の言い分に見えんのよなぁ
442:デフォルトの名無しさん
20/05/31 14:13:51 GcFwCYXw.net
仕事ができる人なら、コードを書くのに何人時かかりますっていう見積もりをざっくりでいいから依頼主にちゃんと提示する
それで依頼を取り下げるかどうかはクライアントの決めること
想定外のトラブルで納期が遅れそうならホウ・レン・ソウして迷惑をかけないようにする
難しいからって愚痴るのはまったく建設的じゃないし、なんの解決にもならない
443:デフォルトの名無しさん
20/05/31 15:00:37 py7qoVDy.net
なんでそんなにかかるの?
どこに時間かかる要素があるの?
やればいいだけでしょ?
○○さんはもっと早かったよ?
次の仕事があるんならそれでいいよ?
444:デフォルトの名無しさん
20/05/31 15:05:53 ztYbO9r8.net
報連相つらいよね…プログラムの難しさよりも報連相の方がつらい…
445:デフォルトの名無しさん
20/05/31 16:55:11 uJxLAScO.net
すみませんド素人ですがご教授下さい。
「あるセルを選択して実行すると選択したセル行のA~D列以外が全て1.1倍される」
というマクロを組みたいです。
ネットで調べて少し作ろうとしてみましたが
知識がありません。
Sub 倍掛け()
Dim SELU As Range '変数名の絶望的センス名
For Each SELU In Selection
SELU.Value = SELU.Value * 1.1
Next SELU
End Sub
Sub 選択したセルの行全選択()
ActiveCell.EntireRow.Select
End Sub
この2つのプロシージャが何となく使えるのかすらわからないのですが試行錯誤しています。
A~D列を除外というやり方もわかりません。
すみませんが
446:教えていただけないでしょうか。
447:蟻人間 ◆T6xkBnTXz7B0
20/05/31 17:39:48 w6MuXuh+.net
>>425
Excel for Windows 95で動作確認。
Sub Record1()
Application.Worksheets(1).Select
For I = 5 To 20
For J = 1 To 20
Cells(J, I).Select
ActiveCell.FormulaR1C1 = Val(ActiveCell.FormulaR1C1) * 1.1
Next J
Next
End Sub
448:蟻人間 ◆T6xkBnTXz7B0
20/05/31 17:50:31 w6MuXuh+.net
>>426 「To 20」のところは適当に変更してね。
449:デフォルトの名無しさん
20/05/31 18:34:56.03 Gn3uBA4V.net
>>425
選択した範囲が処理の起点なので、、
Dim r As Range
For Each r In Selection
If r.colunm < 5 Then GoTo nextLoop
If r.Value = "" Then GoTo nextLoop
r.Value = r.Value * 1.1
nextLoop:
Next
こんな感じ?
行全体を対象にしたいみたいだけど、その時はFor文の前に
Selection.EntireRow.Select
を差し込めばいい。
1万列処理されるけど、、、
450:デフォルトの名無しさん
20/05/31 18:39:34 Gn3uBA4V.net
>>428
綴りを間違っとった
If r.Column < 5 Then GoTo nextLoop
文字列セルを避けたければ、、以下も追加
If Not IsNumeric(r.Value) Then GoTo nextLoop
451:デフォルトの名無しさん
20/05/31 19:13:07.80 4iioSPSZ.net
>>424
ああつらい。
上司がメール読まないタイプだと特に。
452:デフォルトの名無しさん
20/05/31 21:17:59.30 yITbq02Q.net
馬鹿に馬鹿が答えて滅茶苦茶
簡単な質問だとしゃしゃり出てくるからおかしくなる
453:デフォルトの名無しさん
20/05/31 22:48:28.20 6kaO8G32.net
>>416
そうです!!
カッコ内に文字列です!
454:デフォルトの名無しさん
20/05/31 22:49:04.73 6kaO8G32.net
>>417
呼び出し元…すみません、知識不足でした…
455:デフォルトの名無しさん
20/05/31 23:06:33.42 2V+gQfrN.net
>>433
馬鹿には無理だと悟れよ、馬鹿
456:デフォルトの名無しさん
20/06/01 18:21:12.15 JWhdLJJl.net
お前もだ
457:デフォルトの名無しさん
20/06/01 18:38:31 4Uk/Vywe.net
異動した先輩が作ったマクロに少し追加しようと思って標準モジュール見てみたら
乱れ雪月花
地ずり残月
かすみ二段
パリィ
何これ???と思ったらゲームの技名なのか
見事なプロシージャだけど関連性が全くわからんかった…
458:デフォルトの名無しさん
20/06/01 18:48:48 jizMt7mj.net
Sub 乱れ雪月花
風雪即意付け
月影の太刀
三花仙
End Sub
459:デフォルトの名無しさん
20/06/01 19:40:30 o1fpUPSE.net
取り敢えずマジックナンバーだらけのを保守しろとかいうのはやめてー
セル参照も起点ぐらいは定数宣言しといて欲しい
460:デフォルトの名無しさん
20/06/01 19:48:00 xzpno8fJ.net
1列目の2行目から下にEXCELファイル名があります。(同一ファイル名あり)
それらを全て開く、処理、閉じるを繰り返すと時間がかかるので、同一ファイル名は一度だけ開いて閉じるをやりたいのですがどしたらいいですか?
1列目をソート
Do until 1列目
???
処理
loop
ファイル名は数字(000001.xlsなどで桁数は同じ)
???の所で開くor閉じるをやりたいのですがどうしたらいいですか?
461:デフォルトの名無しさん
20/06/01 20:00:55.95 Ct20WAoS.net
パリィは草
462:デフォルトの名無しさん
20/06/01 20:10:21 MDu2hpC8.net
>>439
ひとつ上のセルが同じファイル名なら
なにもせず次へ
463:デフォルトの名無しさん
20/06/01 20:42:10 eRBcTATy.net
重複禁止の処理は連想配列(VBAだとDictionaryオブジェクト)を使うと便利だよ。
既に連想配列に存在するなら何もしない、存在しないなら処理して連想配列に登録する。
Valueに結果を入れておいて、実行結果をシートに出力とかするとカッコイイよ。
464:デフォルトの名無しさん
20/06/01 21:05:54 Otvtnefa.net
結果をシートに出すなら配列使わんと重複削除して�
465:ゥら開いた方が速くて楽じゃん
466:デフォルトの名無しさん
20/06/01 23:34:24 5NIHbXOS.net
まだ22歳の学生社長が得た、23億円の「使い道」
あの橋本環奈をCMに使うバイトアプリの雄
URLリンク(toyokeizai.net)
中学時代の車いす生活から、17歳で起業するまで
URLリンク(www.advertimes.com)
ミャンマー発 AIダイニングアプリ「Yathar」をしかける日本人起業家
URLリンク(roboteer-tokyo.com)
自分の視野は「世の中の0.001%」と自覚せよ。ビジネスチャンスを掴む4つの習慣
URLリンク(headlines.yahoo.co.jp)
アプリの視聴率がわかる 高専卒起業家の独創力
URLリンク(www.nikkei.com)
1万人の若者を支援!インターンが日本を変えるかも!? glowshipの若き創業者・足立卓也氏インタビュー
URLリンク(sogyotecho.jp)
大学生起業家が設立1年で20億円調達! 単発バイトアプリに外食企業など出資【タイミー】
URLリンク(foodfun.jp)
467:デフォルトの名無しさん
20/06/02 00:29:20 hEtyTtKQ.net
俺ならこうかな。
Sub サンペイグッドカメラ()
どっきりカメラのキシフォート
カメラのドイ
End Sub
468:デフォルトの名無しさん
20/06/02 00:35:26 0adtr6kX.net
VBAだしそういう名前面白いかもなw
簡単だけど保守したくないやつは、もう先輩や同僚の連絡先を名前にしようかな
469:デフォルトの名無しさん
20/06/02 01:36:20.19 rfJHDu9M.net
Sub 馬鹿専用()
馬鹿には無理()
馬鹿は帰れ()
End Sub
470:デフォルトの名無しさん
20/06/02 02:01:31.67 cr7Q5ahz.net
Sub 鱸()
鰯()
鰹()
鮪()
End Sub
471:デフォルトの名無しさん
20/06/02 02:07:31.79 SOkkDiQ6.net
>>439
Ruby なら重複要素を許さない、集合を使って、
require 'set'
filenames = <<"EOT"
a/foo.txt
a/bar.txt
a/foo.txt
EOT
set = Set.new
filenames.each_line do |filename| # 1行ずつ処理する
filename.chomp! # 末尾の改行を削除する
# 同じ要素は追加できないので、追加できた時だけ、そのファイルを読み込む
p File.read( filename ) if set.add?( filename )
end
472:デフォルトの名無しさん
20/06/02 02:24:02 cr7Q5ahz.net
>>439
[データ]→[重複の削除] って機能あるけど
473:デフォルトの名無しさん
20/06/02 04:12:46 xDFjMRpH.net
>>439
ファイル名がリストアップされてる列があるなら
そこでまず回して重複排除したファイル名の配列 as Stringをつくればいいだけじゃ
てかその程度も思い浮かばないとなるとプログラミング向いてないような気がするわ
重複排除のプログラムって基礎の基礎でやるよ
便利な機能を使う前に順次・分岐・繰り返しでほぼほぼなんでも出来ちゃうことを学んだ方がいいわ
C言語の勉強するとそういうの鍛えられる感じする
474:デフォルトの名無しさん
20/06/02 08:37:46 ZejDuh3H.net
>>364
Readme読む限り、ちょっとこれはと思う。
一定間隔はあまり良くないな。
出来ればWM_DRAWCLIPBOARD捕まえるのが常套手段。
475:デフォルトの名無しさん
20/06/02 08:39:17 ZejDuh3H.net
>>386
まあ、プログラマ―としては糞コードの見本を強要されるわけだからねえ。
476:デフォルトの名無しさん
20/06/02 08:41:06 ZejDuh3H.net
>>398
引数という言葉を調べてみよう。
477:デフォルトの名無しさん
20/06/02 09:53:39.10 DG4jD+ms.net
い・・引数
478:デフォルトの名無しさん
20/06/02 10:17:05 ZKdkos41.net
いんすう、なの?
勝手に、ひきすう、って読んでた。
479:デフォルトの名無しさん
20/06/02 10:38:01.33 HxakEXb6.net
いんすうだと因数と間違えるから、わざとひきすうと読む慣習
480:デフォルトの名無しさん
20/06/02 11:01:38 P+GfDheU.net
ソヒキスウブンカイとかあったよねー。
481:デフォルトの名無しさん
20/06/02 11:28:56 Bxw1Fg+T.net
淫吸だとエロい言葉に聞こえるからひきすうと読む
482:デフォルトの名無しさん
20/06/02 12:59:58 86yzZ856.net
Sub セル2行を結合して出力()
Sheets("雛型").Select
ActiveSheet.Copy
Dim gg As Long, rr As Long
For gg = Cells(Rows.Count, "E").End(xlUp).Row To 11 Step -1
Rows(gg + 1).Insert
For rr = 5 To 31
Cells(gg, rr).Resize(2).Merge
Next rr
Next gg
HorizontalAlignment = xlCenter
VerticalAlignment = xlCenter
Range("A1") = "2行を結合して出力"
End Sub
すみません、ネットで調べまくってる相変わらずのど初心者です。
セルの行挿入と結合を範囲指定して
2行を結合するのは何とか調べてできたのですが、
「セルの列挿入と結合を繰り返して
2列1行のセルにしたい」
というのができず。。ご教示頂けませんか。
理想は
「セルを2列挿入と結合をして3列1行のセルにする」や
「2列と2行の挿入と結合繰り返して2列2行のセルにする」
など、色々パターンを作りたいのですが。
ネットと入門編の本だとやはり限界を感じます。。
どなかた何卒お願いします。
483:デフォルトの名無しさん
20/06/02 13:09:54.31 YHzZdfxN.net
.resize(1,2).mergeとか
Range(rows(gg+1)rows(gg+2)).insertとか
484:デフォルトの名無しさん
20/06/02 14:39:08.29 cr7Q5ahz.net
セルの結合をマクロでやる設計者ってセンスないね
485:デフォルトの名無しさん
20/06/02 14:42:20 cr7Q5ahz.net
マクロとVBAな
486:デフォルトの名無しさん
20/06/02 16:30:35 wladzkcs.net
セル結合はなあ
487:デフォルトの名無しさん
20/06/02 17:14:02 3pwUYc8f.net
vlookupとセル結合をディスってはじめてexcel使い方として一人前
488:デフォルトの名無しさん
20/06/02 17:30:35.84 ZKdkos41.net
セル結合は帳票イメージでの最終手段。
489:デフォルトの名無しさん
20/06/02 17:36:37.19 86yzZ856.net
セルの結合をする理由は
取引先の提出フォームが客先ごとに
1セルの結合の構成が本当に様々で8種類くらいパターンがあり
元のマクロで出した値の貼り付けが出来ないのが現状です。
なので元のマクロの1行1列のセルの値を
セルの構成を客先のに合わせたシートに出力
そのシートから客先提出フォームに値の貼りつけ
というのをやろうとしています。
490:デフォルトの名無しさん
20/06/02 17:42:54.46 86yzZ856.net
>>461
すみません、どこにどう弄ったらいいか
教えて頂きたいです。
すみません、、
491:デフォルトの名無しさん
20/06/02 17:45:43.97 lB7mMLW8.net
>>468
自分で考えろ
492:デフォルトの名無しさん
20/06/02 18:33:10 0adtr6kX.net
じゃあ8種類のテンプレでよくね
493:デフォルトの名無しさん
20/06/02 18:40:35 bGVvB1yX.net
結合したりvlookupとかしたいから、わざわざエクセル使ってるんじゃないの?
494:デフォルトの名無しさん
20/06/02 18:55:17 R+Y1d9Tj.net
セル結合された部分は別の結合とかできないから
その都度結合解除するとか
行の挿入や削除で表が壊れたり
見えなくなるプロパティがあったり
嫌な思い出しかない
495:デフォルトの名無しさん
20/06/02 19:17:40.08 xDFjMRpH.net
Application.OnKey ってプロシージャに引数渡せないのが残念だなぁ
これってキーごとにプロシージャ作らないといけないかね
496:デフォルトの名無しさん
20/06/02 19:20:48.48 ZejDuh3H.net
>>462
そんなこたぁねえだろ。
確かに問題多いけど、分かった上で使うことあるぜ。
ゴミのSendkeys使うよりはあるね。
497:デフォルトの名無しさん
20/06/02 19:31:05.26 0+iVbcJA.net
Sub 列挿入()
ActiveSheet.Copy
Dim i As Long
For i = 32 To 8 Step -1
Columns(i).Insert
Next
End Sub
ここまでは何とか、、ってとこです。
後は指定したの行を全部何とか
2列1行のセルに
道のりが遠すぎる…
498:デフォルトの名無しさん
20/06/02 19:38:40.44 xX39KyXM.net
データモデルに入れたデータからSQLを使ってシートに出力する方法を教えてください。
ネットになかなか情報がなくて
ListObjects.Add(SourceType:=4, Source:=ActiveWorkbook.Connections("クエリ - パワークエリ名"), Destination:=Range("$A$1")).TableObject
から
.WorkbookConnection.OLEDBConnection.CommandText = "テーブル名" にするとテーブルを出力
.CommandText = Array("EVALUATE CALCULATETABLE('テーブル名' , 'テーブル名'[項目名] =""検索語"" ) ")
.CommandType = xlCmdDAX
のようにするとDAX式で加工したテーブルを出力できるようになりましたが、SQLを使用する方法がわかりません。
499:デフォルトの名無しさん
20/06/03 03:13:14.17 4xNyRocT.net
>>475
Sub 列挿入()
ActiveSheet.Copy
Dim i As Long, c As Long, r As Long 'カウント用
Const n As Long = 2 '列挿入, 列マージ数
Const sC As Long = 8, eC As Long = 32 '開始列, 終了列
Const sR As Long = 2, eR As Long = 10 '開始行, 終了行
With Excel.Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
For c = eC To sC Step -1
For i = 1 To n - 1
Columns(c).Insert
Next i
Next c
For c = eC * n To sC Step -n
For r = sR To eR
Cells(r, c).Resize(1, n).Merge
Next r
Next
With Excel.Application
.DisplayAlerts = True
End With
End Sub
500:デフォルトの名無しさん
20/06/03 03:29:44 4xNyRocT.net
あっ行別の列マージならRange.Merge Across:=Trueってのがあるのか初めて知ったわ
501:デフォルトの名無しさん
20/06/03 17:16:57.27 AwTWg+pQ.net
すいません。関数を使って集計する方法を教えていただけないでしょうか。
index matchの組み合わせもしくは、sumifもしくはindex match sumifの複合で表示させたいです。
画像の出荷と書かれたセルに関数を入れて集計したいです。
集計は参照シートの黄色で書かれた「販売+その他出荷」の合計を表示したいです。
sumifでは縦の計算になってしまい、横の足し算が出来ない印象です。
上の数字はmatchを使った際の引用条件になると思い入れました。
説明わかりづらくてすいません。関数を教えていただけないでしょうか。
具体例のエクセルは簡単に書いてますが、実際に書くエクセルはデータが膨大なものです。
なぜかindexもうまく引用できていませんでした。
URLリンク(d.kuku.lu)
502:デフォルトの名無しさん
20/06/03 17:19:07.42 bl/wSmIk.net
>>479
死ねよ、ここは何のスレかわかっているか?
503:デフォルトの名無しさん
20/06/03 17:31:05 AwTWg+pQ.net
すれ違いでしたか。。 別のスレで質問してみます
失礼します
504:デフォルトの名無しさん
20/06/03 18:58:22.75 ajKAwYcj.net
>>481
説明が下手な質問には答えられない
505:デフォルトの名無しさん
20/06/03 19:02:55.47 4xNyRocT.net
>>479
Offsetっていうセルのサイズを変える関数があるが
この集計を関数でやるのは根本的にムリだね
1,10行目の数字とかに何の関連性もないから列が特定できない
元データ正規化すんのが先だよ
506:デフォルトの名無しさん
20/06/03 21:04:01 Wz
507:EARBto.net
508:デフォルトの名無しさん
20/06/03 21:12:23 eXcAe8GC.net
そういうのは言語関係ない
上級者のコード読むなりプログラミング技法の初歩とかを勉強せえ
509:デフォルトの名無しさん
20/06/03 21:16:06 jxQ4kFWw.net
上級者じゃないんでわからんが
数こなしていくうちに上達するんじゃね
510:デフォルトの名無しさん
20/06/03 22:45:33 DFbqrKTL.net
ネットで勉強してる初心者以前のレベルだけど
変数をiで宣言してるサイトが結構多いけど
テンプレ的な変数名なの?何かの略字?
511:蟻人間 ◆T6xkBnTXz7B0
20/06/03 22:54:44 fRs9+Xkd.net
integer
512:デフォルトの名無しさん
20/06/03 22:55:14 1Bet+/qH.net
>>487
もともとはIntegerの頭文字から
とりあえず整数型変数にはI、もっと必要な時はJ、K以下略を使うというルールを70年ぐらい前にIBMの技術者が決めて、それが今まで慣習として残っている
513:デフォルトの名無しさん
20/06/03 22:58:16 k+INKoSh.net
テーブル(ListObject)の指定列に計算結果値をLoopで書き込む処理を作ったんだけど、
ひどく遅延します。事象の原因と対策わかる方いたら教えてください。
・(同一シートの)テーブルの枠外だと同じ行数でも瞬時に終わります。
・計算結果じゃなくて 1 を埋め込むのでも遅い。
・再計算Off
・ためしにEnableEvents = false もやってみたけど効果なし。
3000行くらいなんですが、しばらく帰ってこない感じ。
結局式埋込に変えたんだけど、その場合だと5~6秒くらい。
テーブルなんてそんなもん、ということであればそう認識します。
詳しい方教えてください。
514:デフォルトの名無しさん
20/06/03 22:59:26 uWfzdzS4.net
>>484
モジュールが増えるのは、
他に流用するからとか、
スクロールが面倒だからとか、
そんな理由だと思うけど。
宣言は一番上派、使用する直前派。
参照設定派、CreateObject(xxx)派、
If a = True Then派、If a Then派、
色々だから気にすんなと。
515:デフォルトの名無しさん
20/06/03 23:02:38.52 k+INKoSh.net
>>489
iteratorが語源かと思った。
516:デフォルトの名無しさん
20/06/03 23:03:56.76 LXJ+6sS7.net
DEFINT A-Z
517:デフォルトの名無しさん
20/06/03 23:35:44.50 6MdsocRT.net
ループ変数にはiもよく使うけど、rとかcも割と使う。
列と行を入れ子にしてループ処理する時は、こちらの方が分かりやすい。
518:デフォルトの名無しさん
20/06/03 23:40:14.49 K30dfupm.net
>>487
古くは Fortran かな
I, J で始まる変数は無条件で整数型だった
Iがアルファベットの10番目だからという
よくわからない説もある
519:デフォルトの名無しさん
20/06/04 00:05:55 k3k6AIFZ.net
実際の慣例ではどうなのか知らないが、i~tまでを使うって教えられた
intのtまでってことで
まあ大抵使ってもi,j,kぐらいだと思うが
520:デフォルトの名無しさん
20/06/04 00:09:42 L9xk6UQ0.net
視認性が悪いから、j とか l とか使いたくない。
なので、 i, k, n, とか適当に飛ばして使ってる。
521:デフォルトの名無しさん
20/06/04 00:09:53 OnK1RXVm.net
自分は最大nまで使うよ。
i、j、k、
522:l、m、n
523:デフォルトの名無しさん
20/06/04 00:14:11 L9xk6UQ0.net
>>494
r は Range Loop用と決めてるから、r, c, はあまり使わない。
そんときは iR, iC ってやるな。
c は1文字入れるとき使うかも。
人それぞれやね。
524:デフォルトの名無しさん
20/06/04 01:00:45 BD433+5i.net
すみません、教えてください。<br>
caseの条件を変数で設定していると条件に一致しなくてelseに流れてしまいます。<br>
ベタ打ちで条件を記載した場合は、正しく処理へ流れるのですが・・・<br>
sub テスト() <br>
Dim a As String <br>
Dim temp As String
a = "みかん"
temp = "りんご"", ""みかん" 'ここはチェックボックスの選択によって可変にする予定
Select Case a
Case temp
Msgbox("冬")
Case Else
Msgbox("冬以外")
End Select
End sub
525:500
20/06/04 01:02:03 BD433+5i.net
<BR>は誤って記載したので無視してください。
すみません。
526:デフォルトの名無しさん
20/06/04 01:05:29 bxYszK7T.net
ダブルクォーテーション大好きなんだな
527:デフォルトの名無しさん
20/06/04 01:09:25.97 22WZQRcv.net
>>490
同じ行やってみたけど一秒かかんない
テーブルに数式列あると遅延したけどcalculation=falseで気にならなくなったし
528:デフォルトの名無しさん
20/06/04 01:47:41.43 OTCVkkK8.net
馬鹿の特徴
教えて、助けて等で始まる書き込みをする
529:デフォルトの名無しさん
20/06/04 02:18:53.76 oqMXr6z+.net
>>500
Caseの条件が変数かどうかは関係ないから、どこか別のところが間違ってる
よく見直せ
530:デフォルトの名無しさん
20/06/04 03:10:03 e1eCmfnY.net
>>496
俺だけかな i1,i2,i3 とか、 iX,,iY, iCnt, iLoop, iStep みたいに使う
531:デフォルトの名無しさん
20/06/04 03:52:02 e1eCmfnY.net
命名規則とかハンガリアン表記とかあるよね
URLリンク(ja.wikipedia.org)命名規則_(プログラミング)
532:デフォルトの名無しさん
20/06/04 07:06:03.13 iR1nViON.net
>>489
Fortranが始まりが正解
533:デフォルトの名無しさん
20/06/04 08:16:07 i/KeU7gc.net
ループのiはindexのiかと思ってたわ
for(i=0;i<10;i++)
value[i] = ~~的な
534:デフォルトの名無しさん
20/06/04 10:24:37 lE9Ts1od.net
C列が変数aと同じ値で、かつD列が変数bと同じ値で、かつE列が変数cと同じ値の各行で
Z列(整数)が最大値の行の行番号を変数iに代入する方法を教えてください
Dim r As Long,i As Long
Dim a As String, b As String, c As String
For r = 5 to lsr
If Cells(r,3) = a And
Cells(r,4) = b And
Cells(r,5) = c Then
Rows(r).???
End If
Next cnt
i = Application.WorksheetFunction.Max(???)
535:デフォルトの名無しさん
20/06/04 12:04:02 0kTawYgE.net
>>510
Z列の"暫定"最大値を保持する変数を使います。
Dim r As Long, i As Long
Dim a As String, b As String, c As String
Dim Z_v As Long '追加部分
Dim lsr As Long '定義漏れですよ
lsr = 処理範囲の最終行をセット
Z_v = 0 ' Z列の最大値が負になりそうなら-9999999999などとしておく
For r = 5 to lsr
If Cells(r, 3).Value = a And _
Cells(r, 4).Value = b And _
Cells(r, 5).Value Then
If Cells(r, "Z").Value > Z_v Then ' 暫定最大値を超えたら
Z_v = Cells(r, "Z").Value ' 暫定最大値を更新
i = r ' 行位置も更新
End If
End If
Next
最大値となる行が複数あった場合は、最初の行位置が i の値となります。
536:デフォルトの名無しさん
20/06/04 12:13:10.50 0kTawYgE.net
>>511 の修正
Cells(r, 5).Value Then
の行は
Cells(r, 5).Value = c Then です
537:510
20/06/04 13:00:40 lE9Ts1od.net
>>511
ありがとうございます!いつも勉強になりますm(__)m
538:デフォルトの名無しさん
20/06/04 14:32:12.42 L9xk6UQ0.net
>>503
レスありがとう。
どうも同時に開いているブックに大量の関数が配置されているとListObject内でLoop入力時に遅延するみたい。再計算Offでも。
まっさらのブックにテーブル1個作ってLoop書き込みしたら瞬時だった。
そこに関数を多く含むブックを同時に開くことで、上記のテーブルで遅延が発生。特に自作関数が影響大きいみたい。
追加で開いたブックからシートを一つずつ削除→計測を繰り返したら、少しずつ早くなって、最終的に瞬時になった。
数行ならパラパラッって感じで気にしなくていいんだろうけど行数が多いとかなり待たされる。
ちなみに対象のテーブルを「範囲に変換」するとどんだけ関数を含んでいようが瞬時に書き込まれる。
こんなもんだと思うしかないのかもだけど、再計算Offでも影響を受けるのが納得いかない。
Win7 on vmwareな環境で試したので自宅のWin10でも試してみる。
539:デフォルトの名無しさん
20/06/04 15:52:15.99 MXeQjX7b.net
おれ、昔は i , j ばかり使ってたけど、最近は回す配列の名前を反映した変数を使ってる
Forブロックが単独で存在するならいいんだけど、if や 他のForブロックと組み合わさって
階層構造になってると、だいぶあとになってメンテするときに理解が遅れる
540:デフォルトの名無しさん
20/06/04 16:42:33 9nIeytil.net
いいね
他にもループ内の処理をそのまま関数にしてしまう方法もある
コメントを書かなくても処理の意味を関数名として記述できるし、再利用性も高まる。
おまけとしてVBAの構文にはないcontinue(処理を中断して次のループへ入る)が行える。
もしくは再帰関数を定義してfor文自体を無くすという凝った方法もある。
541:デフォルトの名無しさん
20/06/04 18:37:05 08KHEEC1.net
データモデルに入れたデータからSQLを使ってシートに出力する方法を教えてください。
ネットになかなか情報がなくて
ListObjects.Add(SourceType:=4, Source:=ActiveWorkbook.Connections("クエリ - パワークエリ名"), Destination:=Range("$A$1")).TableObject
から
.WorkbookConnection.OLEDBConnection.CommandText = "テーブル名" にするとテーブルを出力
.CommandText = Array("EVALUATE CALCULATETABLE('テーブル名' , 'テーブル名'[項目名] =""検索語"" ) ")
.CommandType = xlCmdDAX
のようにするとDAX式で加工したテーブルを出力できるようになりましたが、SQLを使用する方法がわかりません。
542:デフォルトの名無しさん
20/06/04 19:02:46.64 fQr1zLSRu
ガチのにわかでスレチかもしれませんが
エクセル上で123d+789という数字を10進数に直すことはできますか?
543:デフォルトの名無しさん
20/06/04 19:00:14.86 OTCVkkK8.net
馬鹿ではなさそうだが、しつこい教えてクレクレに呆れる
ググれよ
544:デフォルトの名無しさん
20/06/04 19:01:01.58 gQJ1UXfv.net
>ネットになかなか情報がなくて
逆にそれを探し当てる方が難しいと思うんだが・・・。
とりあえず、マクロを記録しながらMSクエリを操作すれば答えが出ると思う。
545:デフォルトの名無しさん
20/06/04 19:03:34.01 gQJ1UXfv.net
>パワークエリ名
あ、2016以上か。
パワークエリがあるせいで、MSクエリにたどり着かなかったということか。
546:デフォルトの名無しさん
20/06/04 19:43:02 ZOeL7/nf.net
>>516
同じ処理を関数にするのはよくあることだけど、同じ処理を括るよりは意味合いで括る方が上策だと思う。
適切に関数に分けていれば、そもそもそんなに入れ子にならんだろう。
再起なんて、それこそ意味合いで自然に出来上がるもんで、無理して作るもんじゃねえと思うんだが。
547:デフォルトの名無しさん
20/06/04 22:08:56.53 uauxSmqO.net
Sub セル構成を2行3列に()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
j = 2 '←ここで何列おき
Set rng = ActiveSheet.UsedRange
For i = rng.Columns.Count To 8 Step -1
rng.Cells(10,i).Resize(10,j).EntireColumn.Insert Next Set rng = Nothing
Range("G10", "I510").Merge Across:=True
Range("J10", "L510").Merge Across:=True
Range("M10", "O510").MergeAcross:=True
Range("P10", "R510").Merge Across:=True
Range("S10", "U510").Merge Across:=True
Range("V10", "X510").Merge Across:=True
Range("Y10", "AA510").MergeAcross:=True
Range("AB10", "AD510").Merge Across:=True
Range("AE10", "AG510").Merge Across:=True
Range("AH10", "AJ510").Merge Across:=True
548:デフォルトの名無しさん
20/06/04 22:10:21.75 uauxSmqO.net
Range("AK10", "AM510").MergeAcross:=True
Range("AN10", "AP510").MergeAcross:=True
Range("AQ10", "AS510").Merge Across:=True
Range("AT10", "AV510").Merge Across:=True
Range("AW10", "AY510").MergeAcross:=True
Range("AZ10", "BB510").Merge Across:=True
Range("BC10", "BE510").Merge Across:=True
Range("BF10", "BH510").Merge Across:=True
Range("BI10", "BK510").Merge Across:=True
Range("BL10", "BN510").Merge Across:=True
Range("BO10", "BQ510").MergeAcross:=True
Range("BR10", "BT510").Merge Across:=True
Range("BU10", "BW510").MergeAcross:=True
Range("BX10", "BZ510").Merge Across:=True
Range("CA10", "CC510").MergeAcross:=True
Dim po As Long, ro As Long
For gg = Cells(Rows.Count, "E").End(xlUp).Row To 11 Step -1
Rows(po + 1).Insert
For ro = 5 To 79
Cells(po, ro).Resize(2).Merge
Next ro Next po
HorizontalAlignment = xlCenter
VerticalAlignment = xlCenter
Application.DisplayAlerts = True
End Sub
VBAの勉強すらしてない俺が10個くらいのサイトからパクってつなげて一応希望通り動いた
setとかレンジ型とか意味わからんわ…
549:デフォルトの名無しさん
20/06/04 22:13:08.78 uauxSmqO.net
For po = Cells(Rows.Count, "E").End(xlUp).Row To 11 Step -1
ここはこうだったな俺の変数癖だわ
なんかもう難しすぎて勉強するよりネットで検索してパクって繋げたほうが楽な気がする
39歳からVBA覚えるって脳みそがついていかんわ
550:デフォルトの名無しさん
20/06/04 22:15:04.15 k3k6AIFZ.net
そんな報告いらん
自分の日記スレでも立てればいい
551:デフォルトの名無しさん
20/06/04 22:15:05.91 OTCVkkK8.net
隙あらば馬鹿が日記を書き込む
552:デフォルトの名無しさん
20/06/04 22:19:18.86 uauxSmqO.net
隙あらば馬鹿って言いにきてんの?
定期的に馬鹿としか書いてないけど
553:デフォルトの名無しさん
20/06/04 22:22:05.20 i/KeU7gc.net
そうして精神を保ってるとでも思っておこう
554:デフォルトの名無しさん
20/06/04 22:43:14 OTCVkkK8.net
>>528
馬鹿は黙っていろよ
555:デフォルトの名無しさん
20/06/04 22:57:09.20 nxAuSZLn.net
セルにコメント挿入して中の文字色を一部だけ変えれる事って出来ますか?
strTxt=111111(vbtab)223(vbtab)8975
例えばこんな文字列の223だけ赤色、それ以外は黒色。
556:デフォルトの名無しさん
20/06/04 22:59:22.67 c/xPJE8L.net
>>528
お前の書き込みは馬鹿の自己満足以外の何物でもないぞ
557:デフォルトの名無しさん
20/06/05 00:25:19 fHeju+Td.net
>>531
Cells(1, 1).AddComment "あいうえおかきくけこさしすせそ"
Dim c As Excel.Characters
Set c = Cells(1, 1).Comment.Shape.TextFrame.Characters(2, 10)
c.Font.ColorIndex = 3
例えばこれだと、コメントを追加して2文字目から10文字のフォント色を色番号3=赤に変える
という処理になるよ。
他にもフォント,太字斜体,サイズとか、fontクラスのものなら何でも変えれるね。
処理的には変更開始と文字数をどう特定するかだけど頑張ってね
558:デフォルトの名無しさん
20/06/05 00:27:45 2CjtUfu9.net
>>531
comment.shape.textFrame.characters
559:デフォルトの名無しさん
20/06/05 00:50:59.98 8UrD2y10.net
39歳で限界とか。元々能力が低いとしか。
560:デフォルトの名無しさん
20/06/05 05:51:53 td6kQI8l.net
>>535
なんだと、このハゲ!
561:デフォルトの名無しさん
20/06/05 06:27:32.36 YMz2fC5g.net
>>523
一応解説すると、、、
値にはいろんな型があるけど、
文字リテラル(例:"Hello")
数値リテラル(例:123)
日付リテラル(例:#2020/6/5#)
真偽値 (例:True)
上記で構成される配列(例:Array("月","火","水") )
これらは(またはこれらの値を返す式)はイコールだけで変数にぶっ込めるけど、
これら以外はすべてオブジェクトと見なされるので、
Set 左辺=右辺
の記述で変数に代入する必要がある。
例えば、ブック、シート、といったものはすべてオブジェクト扱い。
もちろんセル範囲(Range)もオブジェクトなので、Setが必要。
範囲オブジェクトを返すには Range("アドレス記述")で表せるけどこれだと
示してくれた例のように全部書き出す必要がありコードが冗長になる。
そんなときはCells(行,列)の記述で範囲オブジェクトを返すとLoop処理で
簡潔に記述できる。
Cells(行,列)だと1セルしか表せないからRangeと組み合わせて
Range(Cells(行,列),Cells(行,列))
みたいに記述すれば指定範囲を表現できる。
または、
Cells(行,列).Resize(500,3)
みたいに記述すれば範囲サイズを拡張できる。
あとはForで行、列の変数をうまうコントロールすればOK.
理解の助けになるといいけど、、