Excel VBA 質問スレ Part65

■ このスレッドは過去ログ倉庫に格納されています
2020/03/17(火) 16:27:20.88ID:hh8LiIgR0

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part64
https://mevius.5ch.net/test/read.cgi/tech/1575297834/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/04/11(土) 11:45:20.84ID:DIdffniea
GetOpenFilenameメソッドでダイアログで複数のtxtファイルを選択するか、「転記前フォルダ」とかに対象のtxtファイル入れておいて、フォルダ内をfor eachですべて読み込むか。読み込み済みのtxtは自動で「転記済フォルダ」に入れるか削除。
どちらにしてもtxtファイルの名前順に読み込むようになるだろうから、そこを一工夫する必要があるかも。
2020/04/11(土) 12:37:41.59ID:9V4Tv9yv0
>>252
とりあえず、フォルダ内の全テキストを一気に読み込むやつを作った
専用のフォルダに必要なデータだけ入れて、フォルダ名を2行目に書いて

Sub Macro1()
  ChDir "c:\tmp"
  f = Dir("*.txt")
  c = 1
  Do While f <> ""
    Open f For Input As #1
    For r = 1 To 6
      Line Input #1, s
      Cells(r, c) = Split(s, vbTab)(2)
    Next
    Close #1
    f = Dir
    c = c + 1
  Loop
End Sub
2020/04/11(土) 12:48:46.57ID:7ipBnOPU0
>>247
マクロ記録してそれを加工すればいい
2020/04/11(土) 12:55:48.43ID:Zf+aIjAZ0
>>254
うおおおお
マジでありがとうございます!
いま外出中なので帰ったら速攻でVBE開いて取りかかります!!
他のこんな猿にアドバイスくれる人達に感謝のみ
批判されて当然のスキルしかないのでそういう覚悟もして相談させてもらってます

6月くらいまでには形にして自分もある程度
コードのルールや流れを猛勉強します

>>255
それも頑張ります、まず加工する知能を身につけます
2020/04/11(土) 18:21:57.90ID:jjkr4EqGa
個人的にはCHDIRと#1ってのが
気になった
2020/04/11(土) 20:11:07.53ID:Lp6A5Woc0
恋だな
2020/04/11(土) 20:18:04.56ID:7YQkqL610
6月て
こんなんIT系の仕事じゃなくても普通に1日で理解するやろ。。

多分セルごとに書き込むからファイル数とデータによっては遅くなるな
2020/04/11(土) 21:02:43.27ID:Mh4soJ8e0
クリップボードに整形したデータ入れてペーストでもいいのよ
タブで右のセル
改行で次の行
2020/04/12(日) 05:51:52.52ID:2Kcsozov0
VBAについて詳しい方に質問です。
現在VBAでオートフィルタの自動プログラムを組んでいます。
そこで質問があります。以下の様なデータがあったとします。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
私の名前は、太郎です。
私の名前は、岩崎です。
あなたの名前は、太郎です。
あなたの名前は、岩崎です。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
検索ワードとしてスペース区切りで「あなた 太郎」と入力された場合
「あなた」と「太郎」を同時に含む行のみをフィルタリングするには
どういう記述を Criteriaにすれば良いのでしょうか?

Criteria1:="*" & [検索ワード] & "*"

現在こんな感じで記述してますがうまく動きません。
AND条件、そしてOR条件で指定する方法を教えてくださいm(_)m
2020/04/12(日) 08:05:06.29ID:YDpAYAt+0
>>261
それやるならオートフィルタじゃない。
アドバンスフィルタ。
2020/04/12(日) 11:41:12.47ID:QKHzDSq80
>>261
シート上でオートフィルタかける時にできること以外のことはできない
2020/04/12(日) 11:45:08.44ID:QKHzDSq80
どうしてもその記述でやりたいならワードをスペースで分割してから条件2つ指定する
2020/04/12(日) 13:12:18.32ID:2Kcsozov0
ありがとうございます。
アドバンスフィルタとやらを調べてみます。
2020/04/12(日) 13:17:20.10ID:bBYC6g030
>>261
And条件の場合はこう書く
Criteria1:="=*あなた*", Operator:=xlAnd, Criteria2:="=*太郎*"
2020/04/12(日) 13:39:43.30ID:2Kcsozov0
>>266
ありがとうございます!!
2020/04/12(日) 17:59:57.23ID:Vvo4XdlE0
いえいえ
2020/04/13(月) 01:44:02.35ID:sGzWGZEv0
>>254
これを、やってみたけどcellsのところでエラーがでます、うーん
頑張ります
2020/04/13(月) 07:29:10.31ID:aaxqX2kx0
>>269
ヒント 変数 r
2020/04/13(月) 08:13:39.61ID:q00oGNOiM
>ヒント
ウザっ
2020/04/13(月) 11:51:14.39ID:V+m1zN0B0
>>269
それはたぶん、txtファイルの中身が想定外
例えば5行以下しかないか、C列にデータが入ってないか
2020/04/13(月) 12:54:16.85ID:RFtb5de7M
>>269
すまん。変数 r はforで回ってた。
2020/04/13(月) 13:27:32.03ID:kcz/TGUB0
S列の2行目以降で、0.05以上でかつ、0.98以下の値の行を行ごと削除したいのですが、コードを教えてください
(最終行はA列から取得)

Dim tag As Variant
Dim a As Long
tag = Range("S1:S" & Cells(Rows.Count, 19).End(xlUp).Row).Value
For a = Cells(Rows.Count, 19).End(xlUp).Row To 2 Step -1
If tag(a, 19) <= 0.98 And tag(a, 19) >= 0.05 Then
Rows(a).Delete
End If
Next
2020/04/13(月) 14:19:37.44ID:V+m1zN0B0
>>274
Dim a As Long
For a = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
  If 0.05 <= Cells(a, 19) And Cells(a, 19) <= 0.98 Then
    Rows(a).Delete
  End If
Next
2020/04/13(月) 14:20:29.76ID:6KK4qS560
ワークシート機能とか使わないなら、
・その表を全て一気にもにょっと2次元配列(tableA)にいれる(コンマ数秒)
・2次元配列(tableB)を一旦定義
・tableAの各行(イメージね)をforeachする。++カウントする変数をつくる。これはtableBの行数。
・foreachのなかで、tableAのS列がその条件に合致しなければ、tableBに行のそれぞれの要素を代入する(redim preserveしながら)
・できたtableBをどこかにペタッと貼る

Excelぽくやるなら
・オートフィルタする
・2次元配列に一旦もにょっとコピーする(可視セルのみ、CurrentRegionかな)
・シートをクリアするか他のシートにコピーした2次元配列をペタっと貼る
2020/04/13(月) 14:21:50.93ID:6KK4qS560
ちなみに行をforeachしながら行を消すとズレが生じるんじゃね、しらんが
2020/04/13(月) 16:10:06.75ID:7RR5m+brM
>>254
色々いじっていますがこれをどう手直ししていいかわからず…

たとえばこれをテキストを変換したときにF2:F13にくるデータを
エクセルにはB5:B16、C5:C16と順番になるよるに出力するようになるにはどう調整すればいいのか、がんばって調べてます
2020/04/13(月) 16:10:57.06ID:kcz/TGUB0
>>275
ありがとうございます。
2020/04/13(月) 18:33:52.63ID:xh/6KDMeM
>>278
ヒント: F1キー
2020/04/13(月) 19:37:09.96ID:sGzWGZEv0
Sub テキストから引っ張る()
ChDir "C:\Users\user\Desktop\マクロ勉強" 'フォルダ指定
f = Dir("*.txt")
c = 2 'テンプレの開始する列の変更
Do While f <> ""
Open f For Input As #1 For r = 2 To 13
'テキストの引っ張ってくる行を指定
Line Input #1, s Cells(r, c) = Split(s, vbTab)(2) Next Close #1 f = Dir c = c + 1 Loop End Sub


猿には荷が重すぎるわ
せっかくここで凄いの貰ったのに頭が。
テキストをエクセル化したときのC列をF列に変更しようと思ったらすでにfが存在してて
どこを今度は変えたらいいかわかりません
2020/04/13(月) 19:44:03.37ID:V+m1zN0B0
>>281
cとかfは変数だよ
ワークシートの列じゃない
2020/04/13(月) 19:48:23.00ID:V6BYDDPb0
猿とか以前にそもそも基本知識すら身に付けてないのでは…
2020/04/13(月) 19:54:15.29ID:sGzWGZEv0
そう、変数なんだというとこまではぎりぎり何とかわかったんです
ただ、引っ張ってくるテキスト側の列をどこで制御してるのかがわからず
>>283
完全にその通り
単純に勉強不足
ネットでかじってばかりじゃダメだと古いけど本も借りました
ただ本当にマジで難しい…

https://i.imgur.com/7Ujyfqa.jpg
2020/04/13(月) 19:55:45.77ID:V+m1zN0B0
Sub テキストから引っ張る()
  Dim ファイル名 As String
  Dim 行 As Integer
  Dim 列 As Integer
  Dim 配列() As String
  Dim 文字列 As String

  ChDir "C:\Users\user\Desktop\マクロ勉強"  ' フォルダ指定
  ファイル名 = Dir("*.txt")
  列 = 2 'テンプレの開始する列の変更
  Do While ファイル名 <> ""
    Open ファイル名 For Input As #1
    For 行 = 2 To 13  ' テキストの引っ張ってくる行を指定
      Line Input #1, 文字列
      配列 = Split(文字列, vbTab)
      Cells(行, 列) = 配列(2)
    Next
    Close #1
    ファイル名 = Dir()
    列 = 列 + 1
  Loop
End Sub
2020/04/13(月) 19:58:56.72ID:sGzWGZEv0
うお、変数の宣言をあらかじめわかりやすくしてくれて馬鹿な俺を誘導してくれようとする人が!!絶対そんな感じのありがたい人だ!
今から車に乗って帰ったら速攻PC開きます!−−!!
2020/04/13(月) 20:19:57.09ID:Kp4LtUp30
>>281
>>284
まずVBAの入門書を読んで基礎知識を
整理するといい(するみたいだけど)

あと「テキストから引っ張る」っていう言葉が曖昧
「テキストファイルを読み込む」「セルに展開する」
みたいに仕様を適切な言葉で把握しておくだけで
ネットで検索すればすぐサンプルコードが引っかかる

本当はなるべく「f」も「file」とか具体的に
命名した方が分かりやすくていいと思うけど
(ファイル用変数とセルの列を混同した一因だろうし)
まず日本語のレベルで言葉を整理しよう
2020/04/13(月) 22:05:23.75ID:sGzWGZEv0
>>287
全くその通りです。

とりあえず
ほぼ意味わからないまま上の人達のおかげで自分の今の業務が10倍以上余裕で速くなるであろうマクロボタンをベースになるxlsmのシートに一つ登録したらたった今完成してしまいました…
隣のシートの正式フォームに数値のみコピーするのだけはマクロで追加しました


Sub テキストファイルをベースに読み込む() ChDir "C:\Users\ikuzo\Desktop\測定データ"
'フォルダ指定
FILE = Dir("*.txt")
c = 2
'ベースの開始する列の変更
Do While FILE <> ""
Open FILE For Input As #1 For r = 2 To 13
'セルに展開する行を指定
Line Input #1, s Cells(r, c) = Split(s, vbTab)(5) Next Close #1
FILE = Dir
c = c + 1
Loop
Range("B2:L13").Select Selection.Copy Sheets("測定結果報告書").Select Range("D5:N16").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False
End Sub

何度やっても一瞬で完璧に処理が終わる…
だがさっぱり意味がわからん、、
本読みます。。
2020/04/13(月) 22:52:20.74ID:sGzWGZEv0
ああ、ダメだ。'でメモりまくったけど
出力する側のエクセルシートの列の指定はわかったけど行の指定がわからなかった。勉強ですね。。
みなさんありがとうございました。
2020/04/13(月) 23:09:41.81ID:nLvmNP810
ちらっちらっ
2020/04/13(月) 23:14:07.84ID:sGzWGZEv0
ごめん、ダメだ。助けてください。
混乱しまくってます。全然違った
読み込むテキスト側の行指定がわからない、、
ベースの方にテキスト2行目8行目からを指示、
とかそれをしないと会社で対応できないです…
2020/04/13(月) 23:21:22.07ID:V6BYDDPb0
そりゃ変数すら知らない知識レベルならこんな短時間じゃなんもできんだろう…
2020/04/13(月) 23:39:16.20ID:sGzWGZEv0
先輩曰くとりあえずわからなくても1つ何か作ってそっから覚えていけと言われ…

Sub 指定フォルダの全テキスト絞り読み込み() ChDir "C:\Users\user\Desktop\測定機データ" 'フォルダ指定
FILE = Dir("*.txt") retu = 2
'ベース列決定でAは1から
Do While FILE <> ""
Open FILE For Input As #1
For Tekist = 3 To 12
'ベース任意行決めでテキストは1行目から
Line Input #1, s
Cells(Tekist, retu) = Split(s, vbTab)(5)
'テキスト初列を()で決めるがAは0から
Next
Close #1
FILE = Dir retu = retu + 1
'この数だけ列飛ばしにベースに読み込む
Loop
End Sub

'テキストを任意の行から読むのが課題4月13日

毎日勉強しないとなぁ。ほんと
2020/04/13(月) 23:57:52.26ID:k2GojJ+U0
PDFファイル(画像)をEXCELに貼り付ける際の画像の素の大きさってどうやって取得できます?
2020/04/14(火) 00:02:13.22ID:A2P11e7ma
いきなり別ファイル(txtファイル)読み込んだり、配列変数あったりで難しいよ。
本来はもっと基礎からやらないと。
2020/04/14(火) 00:02:49.64ID:PthiGcDI0
>>293
テキストファイルは1行ずつ順番しか読み込むことができないから、3行目が必要な時は最初の2行を読み飛ばさないといけない

Open FILE For Input As #1
Line Input #1, s ' 1行目を読み込むだけで何も処理をしない
Line Input #1, s ' 2行目以下略
For Tekist = 3 To 12
  Line Input #1, s ' 3行目以降
  Cells(Tekist, retu) = Split(s, vbTab)(5)
Next
2020/04/14(火) 00:29:53.49ID:Ua5gdcz00
>>296
本当に本当にありがとう、
上の人たちも本当にありがとう
無知のド素人の俺でも超完璧に動かせました
感謝しかないです。本当に勉強します


Sub 指定フォルダの全テキスト絞り読み込み() ChDir "C:\Users\ikuzo\Desktop\測定機"
'フォルダ指定
FILE = Dir("*.txt")
retu = 2  'ベース列を決定でAは1から
Do While FILE <> ""
Open FILE For Input As #1
'Line Input #1, s   
' 1行目を読むだけで何もしない(テキスト1行目からで良ければ普段は封印
'Line Input #1, s   
' 2行目以下略
For Tekist = 3 To 12
'ベース初行〜任意行決めでテキストは1行目からだが封印の解放により連動
Line Input #1, s
Cells(Tekist, retu) = Split(s, vbTab)(5)
'テキスト初列を()で決めるがAは0から
Next
Close #1 FILE = Dir retu = retu + 1
'この数字を変えた分だけ列飛ばしにベースに読み込む 
Loop
End Sub

'本当にありがとうございました4月14日
2020/04/14(火) 16:20:04.61ID:BhIp9WlU0
>>296
Tekist ワロタ
2020/04/14(火) 18:14:44.01ID:srMYTcHJd
TekisutoでもTextでもTexteでもないのな
2020/04/14(火) 19:13:19.46ID:Ua5gdcz00
今日、神懸かり的に職場の測定機のPCのツールとして産声を上げました
あとは起動と同時に出るユーザーフォームにボタン4くぐらい作って割り当ててとりあえず完成しそうです

そして今日から本を愛読して変数について基礎から学んできます

自分で変えたのがわかるように誤記ぐらいにしとかないと何かのコマンドやコードがわからないので
textって打ったら先頭が大文字に変わるから
こりゃいかんと
2020/04/14(火) 19:29:23.49ID:2/fcFDaL0
なんでもいいから一つ作れってのは作ってもらえって意味じゃないと思うな
302デフォルトの名無しさん (ブーイモ MM5b-L0r9)
垢版 |
2020/04/14(火) 19:39:44.23ID:5O9c120iM
活気が出てええやん
過疎スレやし
2020/04/14(火) 21:50:12.98ID:Ua5gdcz00
変数の定義や宣言をとにかく最初にする癖をつければ
後でわかりやすいことが本でわかり
そして英字じゃなくてもいいことに驚きました

慣れてるたち人のサイトだと
Dim Folderpass As String
Dim FileInt As Long
とか英字だけど
Dim フォルダ場所 As String
Dim ファイル数 As Long

とか和文字だと支障でますかねこれ
2020/04/14(火) 21:58:17.78ID:A2P11e7ma
個人的には変数名で日本語は避けてる。
逆に読みにくいので。
2020/04/14(火) 22:06:22.29ID:4z3IdTPt0
拙者も日本語はコメントで書くようにしてコードは英数字で書くようにしている
2020/04/14(火) 22:20:28.98ID:Ua5gdcz00
なるほど、俺も英字で作る癖つけた方が良さそうですかね
字の色でわかるだろ…とは言え、なんかの関数やコマンドと似てるとやはり最初は難しいですね
Tekist
Fname
Fpass
shseeet
とかにしてこれ俺の宣言した変数だわ
って最初は作ってみます
あざす!
2020/04/14(火) 22:37:22.88ID:A2P11e7ma
変数の付け方とかで、書いた人の実力が分かるという説もあるから。
私は小文字で始めるキャメル式が見やすいと思って大体統一してる。
2020/04/14(火) 22:38:37.96ID:e6NkXt+SM
> とか和文字だと支障でますかねこれ
今時C/C++ですら変数名に漢字使えたりするぐらいだから問題ない
特にフォルダーパスをFolderpassとか書くような人は積極的に使うべき
2020/04/14(火) 22:53:49.36ID:PthiGcDI0
VBAだとそんなに困ることはないんだけど、.netはライブラリが膨大すぎて、既存のメソッドやプロパティと名前が被るかどうかの確認が面倒
あと、語彙力が足りなくてユニークな英単語が思いつかないとか、辞書で調べて付けた変数名があとから見返すと意味がわからないとかある
2020/04/14(火) 23:05:59.10ID:wBIN668P0
>>309
>語彙力が足りなくてユニークな英単語が思いつかないとか
曜日、曜日って英語でなんて言ったかなー
せや、yb ですましたら
2020/04/14(火) 23:20:30.80ID:1uq460ot0
最近プログラム自体始めた初心者です。
日々勉強ばかりですので、汎用性が高くなるよう目指し、
知識を入れてはコードを改良し、それを外部保存、そして
実行するブックで呼び出して使っています。

ついこないだ引数という便利なものを知り、さっそく使っているのですが、
ひとつ疑問が。
「特定セルに、作成したリストの上から順に内容を書き込む」という
簡単なfor〜nextループマクロを使いまわしたいのですが、そのループ処理内容を
callなどから設定することはできるのでしょうか?
(たとえば、あるブックでは印刷処理したい、けどこっちではシートコピー処理したい、
など)

引数で、特定セルやリストの開始行は設定できたのですが。。。
宜しくお願いいたします。
2020/04/14(火) 23:23:30.52ID:1uq460ot0
>>311です。一部分かりづらかったので訂正いたします。
×「そのループ処理内容をcallなどから設定することは〜」
〇「そのループ処理内容を、実行するブックから設定することは〜」
313デフォルトの名無しさん (ワッチョイ 068e-f9/D)
垢版 |
2020/04/14(火) 23:30:42.95ID:ps8T64zC0
馬鹿が一気に出てきたのはコロナウイルスで脳炎や痴呆症でも発症するのか?
2020/04/14(火) 23:31:29.82ID:PthiGcDI0
>>311
サブルーチンの中にブック名を判定するIfを入れるとか、引数を増やして処理を切り替えるとか、方法はいくつもある
2020/04/14(火) 23:44:19.27ID:Ua5gdcz00
Sub データ数の確認()
Dim FoPath As String
Dim Fname As String
Dim Fnum As Long
Dim SetPath As String FoPath = "C:\Users\user\Desktop\測定機"
'フォルダのパスを指定する
Fname = "*.txt" 'ファイル名と拡張子指定 Fnum = 0
'ファイル数を一度0にする
'指定したフォルダパスとファイル名をセット
SetPath = Dir(FoPath & "\" & Fname)
Do While SetPath <> ""
'ファイル名が取得出来なくなるまでループ Fnum = Fnum + 1
SetPath = Dir()
Loop
MsgBox Fnum & "つデータが入っています。"
End Sub


見様見真似というかネットからパクってユーザーフォームのボタンに追加できました。
このスレの人たち凄いです
316デフォルトの名無しさん (ワッチョイ 068e-f9/D)
垢版 |
2020/04/14(火) 23:55:34.54ID:ps8T64zC0
いい加減に馬鹿は消えろ
317デフォルトの名無しさん (ラクッペペ MM8f-AKYr)
垢版 |
2020/04/15(水) 00:06:27.34ID:IBkk3oxvM
>>311
他のナウい言語みたいに関数ポインタとか使いたいのだろうが
おとなしくコマンド文字列でも渡してselectでもしとけ
2020/04/15(水) 01:14:25.80ID:vPyadW120
ナウい変数名を考えようと思って色々試したら、結構いけるじゃん。

Dim ヽ, 卍, ¶, , f, , , ≒, ♪

♪ = 1
Debug.Print ♪
2020/04/15(水) 01:17:01.85ID:vPyadW120
あ、普通にこれでいいか。

Dim 骸骨剣士, 死霊の騎士, 幽霊, 死神
2020/04/15(水) 01:24:08.40ID:Ikiffowr0
For 愛 = 1 To 10
2020/04/15(水) 01:34:17.76ID:Ikiffowr0
>>319
うちの新人が最初に書いてきたコードがそれだったわ (実話
もちろん熟語の意味と変数の用途は無関係で、厨二ワードを思いつきで適当に並べただけ
2020/04/15(水) 02:43:11.14ID:zLal5e060
>>311
初心者なら具体的な処理を抽象化していく
ボトムアップのやり方が分かりやすいと思う

たとえばかけ算の九九を求める関数に
引数でXを渡してXxX(12×12など)を
求める関数に抽象化すると使い道が広がる

あるいは5行6列目のセルを処理する関数を
X行Y列目を処理するように拡張するだとか
関数の引数は数学の変数のように考える


そして関数(やクラス)を自作する時のポイントは
なるべく関数を小分けにして組み合わせて使うこと
関数が大きくなると理解するのも難しくなるから

印刷やシートのコピーとか別の処理を
ひとつの関数で全部やろうとしないで
別々の関数に書いておく

それで呼び出し元の関数から
実行する関数をIF文で切り替えたりする
Excel VBAに限らずプログラミングの定石
2020/04/15(水) 08:51:03.63ID:7yJWhPoQ0
個人的な意見だけど
変数を日本語にする事の欠点は、目立ちすぎて、他が見にくくなる事だと思う
ループカウンタの様な頻出する変数には、制御構造が見にくくなるので避けるべき
ルーチンの目的的なものとか、あまり使わないような変数については、場合によっては推奨
2020/04/15(水) 10:07:54.93ID:fYr2Vm730
いいたいことはわかる
なでしこみたいに構造もそうなってれば、比較して自然に見えるしね

まあでも英語で慣れちゃってると、気になっちゃうから可読性低いと評価してしまうわ
2020/04/15(水) 11:57:43.10ID:qO0uVKDC0
>>303
絶対に止めた方が良い。
今、他人のそういうコードで四苦八苦してる。

しかもプロシージャも日本語だから
If 測定結果 Then
などとあって、"測定結果"が変数なのかBooleanを返すプロシージャなのかすら直ぐには分からない。
326デフォルトの名無しさん (ラクッペペ MM8f-AKYr)
垢版 |
2020/04/15(水) 12:04:59.54ID:tJWgJTOGM
それはエーゴでもかわらなくなくね?
2020/04/15(水) 12:43:22.36ID:9r3ObWq4r
>>32
「定義」ですぐわかる
2020/04/15(水) 12:47:51.20ID:9r3ObWq4r
325の間違い
2020/04/15(水) 13:14:16.12ID:Ikiffowr0
がっつり英語だと、こんどは辞書を引く作業が待ってることもある
発音がわからないと会話で困るし
330デフォルトの名無しさん (ワッチョイ 778f-Eg7/)
垢版 |
2020/04/15(水) 13:39:00.87ID:zDLD/Qb60
特定のURLのソースに任意の文字列が記載されているかどうかを判断したい。

https://auctions.yahoo.co.jp/seller/abcdfgh
https://auctions.yahoo.co.jp/seller/zakattas
https://auctions.yahoo.co.jp/seller/zafect789
というページのリストがあったとして、ソースに"停止中"もしくは"無効"の文字列が
あるURLにはB列に"NG"と吐き出す、ということをやりたいです。

https://okwave.jp/qa/q6120067.html
が近いんですが「2)一般的な文字列の場合」はエラーが出て動きませんでした。
VBAに詳しい人、よろしくお願いします。
2020/04/15(水) 13:51:28.81ID:5mkkxmmPa
grep なら一行でできるのに VBA でやらないといけないのか
2020/04/15(水) 13:53:51.50ID:VtNtlccy0
人に送ったら日本語フォントない海外PCで全く動かなくなったりしたな
2020/04/15(水) 14:13:32.74ID:Ikiffowr0
>>330
参考リンク先のどのプログラムを試して、どの行でどんなエラーが出たか書いて
エラーが出たままでCtrl+Cを押せば、エラーメッセージがクリップボードに入るから、それをコピペして
あと、目的のWEBサイトの文字コードはちゃんと確認した?
2020/04/15(水) 14:16:13.29ID:Ikiffowr0
>>331
まあ wget | nkf | grep のが簡単かもね
2020/04/15(水) 14:42:43.03ID:zDLD/Qb60
>>333
すいません。
コピペ繰り返してたらなんとか行けました。

Sub YouTube_Search()
Dim objIE As Object
Dim i As Long
Dim j As Long
Set objIE = CreateObject("InternetExplorer.Application")
With objIE
For i = 1 To Range("A1").End(xlDown).Row
.navigate Cells(i, 1).Value
While .Busy Or .ReadyState <> 4: DoEvents: Wend
For j = 1 To .document.all.Length
If InStr(.document.all(j - 1).outerText, "Yahoo! JAPAN IDが無効です") > 0 Then
Cells(i, 2).Value = "*"
Exit For
End If
Next
Next
End With
objIE.Quit
Set objIE = Nothing
End Sub
2020/04/15(水) 14:43:10.74ID:dyZQaRRHd
>>326
確かに。
でも日本語フィールドが多いSQL文の中で、一部の変数も日本語だったりするのとか、変数と気付かなかったりするのもあるし、最悪だよ。
2020/04/15(水) 15:14:20.64ID:4idtb0t/a
かわらなくね?かわらなくなくね?
2020/04/15(水) 19:27:28.55ID:DRi90/CyM
>>325
なんの測定なのか知らんけど測定結果がBooleanな時点で知能の足らない職場と言うことがわかる
コードレビューなんてしたこと無いだろ
2020/04/15(水) 21:47:05.33ID:vXo73Hp80
辞書で調べても馴染みのない単語でかえってわかりにくくて結局日本語にしてみたりね
2020/04/15(水) 22:13:27.05ID:qXjFLib20
311です。

>>314,317,322
私がやろうとしていたことが、まず効率の悪いことだったんですね・・・
細かく分けて関数作って、それを組み合わせて作る方法を取りたいと思います。
(ただ、どこまで細かく分ければいいのか、まだ要領を掴んでおりませんが)
ありがとうございました。
341デフォルトの名無しさん (ブーイモ MMcf-IW4T)
垢版 |
2020/04/15(水) 22:29:20.66ID:bRq9+Y6qM
初心者ですがご教授下さい

サンプルの工程能力で1個につき6項目の測定値をソフトがエクセルにデータ出力してくれるけど、日によっては23個だったり25個だったりしか測定できず

残りの記入方法は人によって様々で
ある人は測定値のバラつきに近い値をテンキーで手打ち
ある人はエクセルのrandbetween関数で
各項目の測定値のMAXとMINで乱数だしてそれをコピぺ

サンプル1 サンプル2  〜サンプル30
項目1
項目2
項目3
項目4
項目5
項目6

こんな並びで全項目測定後に出力されるから項目の途中で止まることはないです

「サンプル1〜30の間の項目1の行に空白があった場合、それより前(左)にある全ての測定値を参考に乱数でサンプル30の項目6まで埋める」

これは難易度かなり高いですか?
342デフォルトの名無しさん (ブーイモ MMcf-IW4T)
垢版 |
2020/04/15(水) 22:33:03.58ID:bRq9+Y6qM
誤記というか間違えました
「サンプル1〜30の間の項目1の列、又はセルに空白があった場合、それより前(左)にある全ての測定値を参考に乱数でサンプル30の項目6まで埋める」
です
すみませんがどういったアプローチがあるのか
そもそもできるのかご教授下さい
2020/04/15(水) 22:49:03.78ID:xz8oNroja
>>342
それは多分難しくないと思うけど、読解力がなくてよく分からない。
サンプル的なものを挙げてもらえると分かりやすいかも。
2020/04/15(水) 23:00:46.12ID:zLal5e060
>>340
>どこまで細かく分ければいいのか
基本的に処理は関数名に沿って分ける

関数名から逸脱した処理があれば
別の関数に分けて整理していく

だから関数や変数の
適切な命名が重要になってくる

面倒でも名前と処理を対応させた方が
後でメンテナンスしやすくなる
345デフォルトの名無しさん (ブーイモ MMcf-IW4T)
垢版 |
2020/04/15(水) 23:19:56.30ID:bRq9+Y6qM
>>343
いや、俺の説明力がなくて、、
というか行列が逆でした
再度説明させてください

https://i.imgur.com/D4MOqky.jpg
こんな感じで機械がエクセルに出力してくれるけど
残りのサンプルの数字は上の測定値を見てみんなそれぞれランダムにテンキーで入力したりと、いわゆる数値を適当にバラして打ち込んでます。(偽装というほど重要ではないので)
日によって測定できるサンプルが数が違います。

参考になるか程度のスクショになりますが

「サンプル1から30までで空白の行列があったらそれまで測った上のサンプルの測定値を元に乱数でサンプル30の項目6までVBAが全て記入してくれないかなと、

こんな感じです
2020/04/15(水) 23:34:48.80ID:xz8oNroja
「列、又はセルに空白があった場合、それより前(左)にある全ての測定値を参考に」というのは?

その例でいうと、
・項目1のサンプル8、9、10が空欄なので、1から7の数値を元にして適当な数値で埋める。
・残りの項目についても同様

ということですか?つまり上の数値を元にしてるけど。

処理自体は難しくないとは思います。
347デフォルトの名無しさん (ブーイモ MMcf-IW4T)
垢版 |
2020/04/15(水) 23:57:01.64ID:bRq9+Y6qM
>>346
その例でいうと、というか今の職場の手間になってる仕事がまさにその通りです
上の数値を元に残りの項目を誰かが埋めてます

どんなアプローチで行ったらよさそうかアドバイスいただませんか
Rnd関数Int関数、Loop、Offset
調べてもなかなかわからずです‥
2020/04/15(水) 23:58:14.63ID:Ikiffowr0
>>345
数字を偽装するルールが人によって違うのはわかったけど、あなたはどういうルールでやりたいのか、もうちょっと厳密に書いて
「それまでの数値を参考に」という表現では曖昧すぎてプログラミングできない

例として、サンプルが7個しかなかった場合は、その7個の数字をどう使って30個に増やすのか?
349デフォルトの名無しさん (ブーイモ MMcf-IW4T)
垢版 |
2020/04/16(木) 00:23:27.26ID:WB3hiXkKM
>>348
数式と一覧を削りましたが普段はここの赤矢印に測定したデータのMax値とMin値を入れて
EXCELの関数でこのような数式で乱数を
出しています
数年前に自力で作ったけどもはや覚えていないレベルです
https://i.imgur.com/eglO3Ph.jpg
350デフォルトの名無しさん (ブーイモ MMcf-IW4T)
垢版 |
2020/04/16(木) 00:25:05.62ID:WB3hiXkKM
あとスクショ取りたいが故に行数の抜けやズレが、、、すみません
2020/04/16(木) 00:30:19.56ID:eKixqxFQ0
最低値+rnd×最大最低の差で乱数になるよ
2020/04/16(木) 00:35:38.28ID:YY8HOOMA0
とりあえず行と列の位置は>>345の画像に合わせて作ったから、あとは適当に修正して

Sub Macro1()
  For 項目 = 1 To 6
    列 = 項目 + 2
    最小 = Application.WorksheetFunction.Min(Cells(6, 列).Resize(30)) * 1000
    最大 = Application.WorksheetFunction.Max(Cells(6, 列).Resize(30)) * 1000
    For サンプル = 1 To 30
      行 = サンプル + 5
      If Cells(行, 列) = "" Then
        Cells(行, 列).NumberFormatLocal = "0.000"
        Cells(行, 列) = Application.WorksheetFunction.RandBetween(最小, 最大) / 1000
      End If
    Next
  Next
End Sub
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況