Excel VBA 質問スレ P ..
[2ch|▼Menu]
163:デフォルトの名無しさん
20/05/19 19:48:13 NEFcECdd.net
>>156
こういう馬鹿が職場にいて余計混乱させているだけだろ

164:デフォルトの名無しさん
20/05/19 20:27:14.48 F1sOO54s.net
そのうち消えた10万円とかなるんじゃね

165:デフォルトの名無しさん
20/05/19 20:56:41 FccdSYLU.net
クルーズ船の消えた弁当

166:デフォルトの名無しさん
20/05/19 21:22:42.73 oItI0x3V.net
絶対にわからん関数ばかり使ってる理解不明なコードをネットからパクって少し弄ったら完全に業務で対応できてラッキー
そこから今日もユーザーフォーム適当に作ってメッセージボックスとインプットボックスを組んでいって
効率化したけど相変わらず上達せん毎日だわ

167:デフォルトの名無しさん
20/05/19 21:40:57 OdQysc5C.net
ここは日記帳ではない

168:デフォルトの名無しさん
20/05/19 22:33:25.66 flKz052u.net
>>156
1億2000万件のデータを、誤読無く、重複無く、生死の年月日まで
勘案して処理する自治体まで勘案してエクセルに食わせろとな?

169:デフォルトの名無しさん
20/05/19 23:58:06 dbsigt0d.net
相談させてください。
羅列されたデータにオートフィルタをかけて、その中でのランダム選択をシートを使わないでやる方法が知りたいです。
A列(1〜6年)、B列(1〜8組)、C列(名前)
みたいな感じで、AとBから複数選択後にCから選び出す感じです。

今までは作業用のシートを設けてオートフィルタをかけたものを別シートにコピーし、その中でrandomで選んでいました。
諸事情により作業用シートが作れないので、おそらく配列内だとは思うのですが・・・・

170:デフォルトの名無しさん
20/05/20 00:07:04 vp7gkhOL.net
>>163
VBAなら、とりあえず乱数を発生して、その行がオートフィルタかかってたらもう一度乱数からやり直せばいいだけ

171:デフォルトの名無しさん
20/05/20 01:09:15.99 0kv4kFzW.net
俺なら配列に入れてからやる

172:デフォルトの名無しさん
20/05/20 02:23:38.33 p47zFM4b.net
>>163
フィルタ掛けた結果をROWだけ配列に抜き出して、乱数で配列の中から一つ選べばいいんじゃね

173:163
20/05/20 06:43:20.78 98prku9b.net
>>166
早速ありがとうございます
そのままだとフィルターかけられたROWも選ばれません?
オートフィルターかけた配列を一旦コピーすればいいのでしょうか?

174:デフォルトの名無しさん
20/05/20 07:03:34.54 skRckF1R.net
ランダム選択が目的なら、そもそも、オートフィルターにこだわる必要あるのかな?
VBA使うなら、オートフィルターを扱うのは微妙に面倒だから、自前でフィルターすればいいと思うぞ

175:デフォルトの名無しさん
20/05/20 08:27:34.61 DAK+DifG.net
オートフィルタやオートフィルタ的コードは使わない
VBAのみで
乱数生成は一度きり
3桁の乱数 a を生成する
まず a を6で割って余りが0〜5まででるんで
0が出たら6年
1が出たら1年
2が出たら2年
3が出たら3年
4が出たら4年
5が出たら5年
とする
例えばここで2が出て2年が選択されたら
さっきの乱数 a をまた使って、組数で割って余りを求める
んで同じようにして
今度は選択された組の人数で割って個人に割り当てられた番号でを特定する
これを繰り返して複数人を選んでいく
選ぶ過程で同じ学年はダメとかあるなら
上の例で言えば一旦2が出たら次は2


176:を排除するとか 繰り返し文の中で if 使って条件つけていく 学年の数、組の数、クラス人数は予めシートに表にしておくこと とかとか



177:デフォルトの名無しさん
20/05/20 08:28:13.58 DAK+DifG.net
一度きりってのは1人選ぶのに一度ってことでしゅ

178:デフォルトの名無しさん
20/05/20 08:30:51.03 DAK+DifG.net
6学年あって6組の学年があったりするとだめか
階層が下がるごとに乱数生成してもいいのかね

179:デフォルトの名無しさん
20/05/20 09:26:22 CH9LsvxQ.net
何年何組は決めておいてから誰にするかを乱数?

180:デフォルトの名無しさん
20/05/20 09:45:48.33 B3VzH1xh.net
A1からオートフィルターをかけて
もし、変数aが空欄でなければ、B列で変数aと同じ値だけにしぼる
もし、変数bが空欄でなければ、C列で変数bと同じ値だけにしぼる
もし、変数cが空欄でなければ、D列で変数cと同じ値だけにしぼる
というような書き方をおしえてください

181:デフォルトの名無しさん
20/05/20 11:11:47 nPhD6zxk.net
>>163
Dim r As Range
Dim n As Long
Dim i As Long

With Range("A1").CurrentRegion
With .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)

n = 0
For Each r In .Rows
n = n + 1
Next
if n = 0 then
exit sub
end if
n = 1以上n以下の乱数

i = 1
For Each r In .Rows
If i = n Then
rを使ってなにかする
Exit Sub
End If
i = i + 1
Next

End With
End With

182:デフォルトの名無しさん
20/05/20 11:23:14.33 qcti6JCq.net
>>173
まず意味が不明 →「変数aが空欄」
よくわかんないけど、
特定の表について、
VBA上で宣言した変数ごとに対応した列をフィルタする簡単なものなら書いてみた。
「空欄」の意味が不明なので、NULLか空文字か、それともセルのことだったのか、
そういうことも質問時に気にするように。
URLリンク(i.imgur.com)

183:173
20/05/20 12:02:23.38 B3VzH1xh.net
>>175
ありがとうございますm(_ _)m

184:デフォルトの名無しさん
20/05/20 15:56:33 a9xbkMkn.net
余談だがグループの中から1人をランダムで選ぶ場合、
同じことを繰り返すと同じ人が選ばれる可能性がでてくる
それを無くしたい場合はシャッフルしてから順番に選ぶといい

185:デフォルトの名無しさん
20/05/20 17:56:09 IoSOKpcA.net
何かをさせるときに一度リセットする的なアレですね。
プロージャくっつけて作ってる初心者だが何となくその感覚
スマホとPCのデータが両方消えて
前スレで乱数の発生教えてくれた人のコードが見れなくなったが、やべえ

186:デフォルトの名無しさん
20/05/20 18:10:15.58 bnGR2vkC.net
いや選ばれる人の立場になると、
俺前回やったのにまた俺?他の選ばれてない人はズルくね?みたいな

187:デフォルトの名無しさん
20/05/20 22:38:53 cJtMR3HM.net
前スレの教えてくれた恩人のコードやっと見つけたあああああ


Sub 乱数発生させる()
  For 項目 = 1 To 6  '項目数を変更
    列 = 項目 + 2
    最小 = WorksheetFunction.Min(Cells(6, 列).Resize(30))
    最大 = WorksheetFunction.Max(Cells(6, 列).Resize(30))
    幅 = 最大 - 最小
    For サンプル = 1 To 25 'サンプル数
      行 = サンプル + 5
      If Cells(行, 列) = "" Then
        Cells(行, 列).NumberFormatLocal = "0.000"
        Cells(行, 列) = Rnd() * 幅 + 最小
        Cells(行, 列) = Round(Rnd() * 幅 + 最小, 3)
      End If
    Next
  Next
End Sub




これがC6がサンプル1の項目1が始まりになるシートで使えてるんだけど
これをC12からとかに変えるにはどこ弄ればいいですか?
誰かコメントをこれに添えてもらえませんか…
前スレの大恩人に救われたコードを更に流用したいです

188:デフォルトの名無しさん
20/05/20 23:01:


189:11 ID:cJtMR3HM.net



190:デフォルトの名無しさん
20/05/20 23:30:59 c0Xo7Xk6.net
自分で考えることもしない厚かましい馬鹿は消えろ

191:デフォルトの名無しさん
20/05/20 23:45:16 cJtMR3HM.net
Sub 乱数発生させる()
  For 項目 = 1 To 20  '項目数を変更
    列 = 項目 +
    最小 = WorksheetFunction.Min(Cells(12, 列).Resize(36))
    最大 = WorksheetFunction.Max(Cells(12, 列).Resize(36))
    幅 = 最大 - 最小
    For サンプル = 1 To 25 'サンプル数
      行 = サンプル + 11
      If Cells(行, 列) = "" Then
        Cells(行, 列).NumberFormatLocal = "0.000"
        Cells(行, 列) = Rnd() * 幅 + 最小
        Cells(行, 列) = Round(Rnd() * 幅 + 最小, 3)
      End If
    Next
  Next
End Sub


考えたけどこれかなぁ
他ののまっさらなシートだと乱数再現できた
けど反映させたいシートだと乱数が狂う
配置も数値も同じなのに
シートの設定かぁ

192:デフォルトの名無しさん
20/05/20 23:49:11 Khp9j2eL.net
数千行〜数万行のデータが格納されてるシートで、
ある特定の範囲で最大文字数を取得するには
配列関数で{Max(Len(A1:A10))}とすれば良いですが(VBA上でEvaluateを用いて実装してます)、その最大文字数があるセルの場所(行番号)を特定する方法はありますか?

最大文字数のセルが複数ある場合はその全てのセルの行番号を取得したいです

最終的に、範囲内の最大文字数のセルの背景色を変えたいのが目的です

193:デフォルトの名無しさん
20/05/21 00:19:06 OWznaKXu.net
>>184
セルの文字数がその最大文字数と同じなら色変えるっていう条件付き書式を設定する

194:デフォルトの名無しさん
20/05/21 00:48:50 V79mjqtT.net
>>185
条件付き書式とは盲点でした。
トライしてみます。ありがとう!

195:デフォルトの名無しさん
20/05/21 01:01:13.95 eV6pHfb6.net
わかった。
けどもう後には引けんほど次元の高い事やらせてて手に負えないわ

196:デフォルトの名無しさん
20/05/21 03:10:09.62 u8xoMicA.net
気づくの遅すぎ

197:デフォルトの名無しさん
20/05/21 06:58:06 Qgph+4Ei.net
フォームのラベルに計算結果を表示について。
結果がプラスならそのまま、マイナスなら赤字にマイナス記号を付けるにはどうしたらいいですか?


350
-350←赤字

198:デフォルトの名無しさん
20/05/21 07:11:40.31 uDeLtUtB.net
>>183
セル範囲の内容で乱数の範囲が設定されているからデータが入力されていないと乱数にならないのに、
そこにデータが入力されていると値が更新されない
なかなかのジレンマだね

余談だけど、直感的にわかりにくいから、ループカウンタは列と行そのものにした方がいいと思うぞ
あと、項目数と基準セルを変えたいなら、それを変数にして、こんな感じ
項目数 = 20
サンプル数 = 25
行0 = Range("C12").Row
列0 = Range("C12").Column
For 列 = 列0 To 列0 + 項目数 - 1
...以降も上記変数で置き換える

199:デフォルトの名無しさん
20/05/21 08:07:12 Sgq4UdRX.net
>>190
ありがとう、全部のコード貰った後に少しずついじる事しかできないレベルだからまた挑戦してみるわ
コメントしっかり残して勉強するべしですな

200:デフォルトの名無しさん
20/05/21 12:39:59 VB42BHka.net
>>190
それとこのコード見てさらっとそうやって理解できるってやっぱすごいね
仰るとおり今記入してある数値はそのまま
で残りその数値を元に乱数で埋めるというのを
前スレの人が教えてくれた
みんな凄いの一言

201:デフォルトの名無しさん
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マクロだから、ユーザー定義関数関数使うよりは早いと思う
あと、文字単位の太字には未対応
太字で判定する設計が良くないのは同意


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

1449日前に更新/267 KB
担当:undef