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/25(土) 00:30:28.43ID:XJisoOEM0
次から次へと馬鹿が出てくるのはなぜ?
2020/04/25(土) 00:36:47.04ID:8o24J96M0
Functionの任意引数(Optional)なのですが、初期値はstringかlong型のみだけしかダメなのでしょうか?
シート名objectの引数で、省略したときにActivesheetを返したいのですが、「定数式が〜」のエラーが出てしまいます。
やはり、IFとIsMissingを使うしかないでしょうか。

Function test(Optional objシート名 As Worksheet = ActiveSheet)
End Function
2020/04/25(土) 00:42:53.79ID:l10aoXHL0
そもそも引数とか型の意味理解してる?
2020/04/25(土) 00:44:19.85ID:7EOq2zNJ0
>>613
規定値に使えるのは定数値だけ
変数、プロパティ、関数などは使えない
だからActiveSheetも対象外
2020/04/25(土) 00:50:04.58ID:7EOq2zNJ0
>>611
その画像で説明すると、D3:K3をコピーしてC10:J10に書式貼り付けするだけでは
2020/04/25(土) 00:52:04.34ID:lAut8yEK0
>>611
D2からK3をコピーしてC9に貼り付けて C2をK9に貼り付けるだけじゃないの?
VBA使わない方が早そうなんだけど
2020/04/25(土) 00:53:34.41ID:bDeh6DKGd
>>611
塗りつぶす条件がわからなければわからない
2020/04/25(土) 00:58:07.71ID:a/EKdpBi0
>>602
Ruby なら、row.empty? で空行かどうか、判別できるけど

require 'csv'

CSV.foreach( "input.csv" ) do | row | # 1行ずつ処理
break if row.empty? # 空行なら、終了

puts "#{ row[ 0 ] } : #{ row[ 1 ] }"
end

入力ファイル・input.csv
あ,いう
a,bc

1,23

出力
あ : いう
a : bc
2020/04/25(土) 01:41:16.85ID:7EOq2zNJ0
>>602
読み込みを止める条件が空行とEOFの2つになると、とたんに処理が面倒になるんだよな
こういう時はLine Inputを別Functionに飛ばすとすっきりするんだけど、とりあえず汚い方法で書いてみた

Sub Macro1()
  ChDir "c:\tmp"
  f = Dir("*.txt")
  c = 1
  Do While f <> ""
    Open f For Input As #1
    s = "s"
    r = 1
    Do While Not EOF(1) And s <> ""
      Line Input #1, s
      If s <> "" Then Cells(r, c) = Split(s, vbTab)(2)
      r = r + 1
    Loop
    Close #1
    f = Dir
    c = c + 1
  Loop
End Sub
2020/04/25(土) 02:03:19.21ID:8o24J96M0
>>615
そうなのですね、ありがとうございました。
2020/04/25(土) 05:53:44.03ID:SWq+pauNM
>>613
If 文使うしかないのはその通りだけど IsMissing() は引数の型を Variant にする必要があるのであまり良くない

Function test(Optional objシート名 As Worksheet = Nothing) ' Nothing は既定値なので指定しなくてもいい
If objシート名 Is Nothing Then Set objシート名 = ActiveSheet
End Function

ってやるのが定番
ググると同じことをやってる人がいる
http://akashi-keirin.hatenablog.com/entry/2018/03/01/081945
2020/04/25(土) 13:56:29.68ID:gc0CgTOT0
>>616
>>617
名前は下にたくさん羅列してるし、日付も右にもっとずっとあるからVBでやりたい。
日付間隔が上下で違うからどうやったらいいかと思って。

for 上部名前シートループ
 for 下部名前シートループ
  if 名前同一
   for 上部名前年月日列ループ
    if 塗り潰し
     ※下部シート塗り潰し
    end if
next
end if
next
next

※の部分がどう書くのかがわかりません。

>>618
塗り潰す条件は同じ名前の人に対して同じ日付の所へ塗り潰す。
2020/04/25(土) 14:00:26.62ID:jVtajgfWr
>>623
元データのc列を消せば良いのでは
2020/04/25(土) 14:21:24.23ID:y/AcnKi/d
>>623
上部のD列から見ていって塗ってあったら下部の一つ左の列を塗る
2020/04/25(土) 20:10:34.52ID:Z1BPhcf20
下記のコードで出力範囲1と2をまとめるにはどうすればいいでしょうか
Set OutputRange = Worksheets("Sheet1").Range("B2:C10")
For i = 1 To 9
For j = 1 To 2
For k = 2 To 3
OutputRange(i, j) = WorksheetFunction.VLookup(SerchKey(i, 1), SerchRange, k, False)
だとB,C列ともに列番号3をの値になる、というか列番号2で処理した後列番号3でもう一度処理を
しているため、すべて列番号3の値になるんじゃないかとは思うのですが、具体的にどう直せば
いいか教えていただけるとありがたいです

Sub Test()

Dim SerchKey As Range '検索値
Dim SerchRange As Range '検索範囲
Dim OutputRange1 As Range '出力範囲1 B列
Dim OutputRange2 As Range '出力範囲2 C列
Dim i As Long

Set SerchKey = Worksheets("Sheet1").Range("A2:A10")
Set SerchRange = Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A2:C10")
Set OutputRange1 = Worksheets("Sheet1").Range("B2:B10")
Set OutputRange2 = Worksheets("Sheet1").Range("C2:C10")

For i = 1 To 9
OutputRange1(i, 1) = WorksheetFunction.VLookup(SerchKey(i, 1), SerchRange, 2, False)
OutputRange2(i, 1) = WorksheetFunction.VLookup(SerchKey(i, 1), SerchRange, 3, False)
Next i

End Sub
2020/04/25(土) 20:18:25.81ID:/63/MmUO0
このスレにくる質問見ると、俺に読解力がないのかなといつも思ってしまう
2020/04/25(土) 21:06:29.21ID:OxGSjC7Q0
>>626
VLOOKUPは答えを複数返す関数じゃない
2020/04/25(土) 21:14:48.21ID:OxGSjC7Q0
あ、質問の意味が今わかったわ
入れるセル変えずに関数の列番だけ変えてたらそりゃ同じ値しか入らない
中身がどうなってるか想像じゃなくて実際に確認すればどう直せばいいかわかるだろう
2020/04/25(土) 22:19:20.97ID:Z1BPhcf20
質問が説明不足だったようで失礼しました
出力範囲が複数列ある場合にそれぞれの列を「出力範囲1」「出力範囲2」と設定していけばいいという
ところまではわかったのですが、検索範囲が100列、出力範囲が99列、というように数が多くなった場合、
出力範囲のB列には検索範囲の列番号2  OutputRange1(i, 1)…… SerchRange, 2
出力範囲のC列には検索範囲の列番号3  OutputRange2(i, 1)…… SerchRange, 3
出力範囲のD列には検索範囲の列番号4  OutputRange3(i, 1)…… SerchRange, 4



という処理を99行書かずに変数で処理できないでしょうか、というのが質問の意図です
2020/04/25(土) 22:58:11.29ID:u3Cmop/t0
j の役割って何だろう?
2020/04/25(土) 23:00:40.63ID:OxGSjC7Q0
だから>>626のループの中身がどうなってるか見て順番考えたらいいんじゃないの
2020/04/26(日) 00:49:06.95ID:1a87l4R/0
>>630
同じような処理を繰り返したい時は配列を使う

Dim OutputRange(10) As Range '出力範囲
Dim i As Integer

For i = 2 To 3
Set OutputRange(i) = Worksheets("Sheet1").Range(Cells(i, 2), Cells(i, 10))
Next

みたいな感じで、変数を使えば、何十個あっても簡単にまとめられる
2020/04/26(日) 02:34:49.27ID:LqR8iAxp0
なぜ馬鹿ばっかり来るのか
2020/04/26(日) 06:16:38.34ID:+0ojgInc0
馬鹿ばっかり来るところにいるからじゃね
ってか自力でできるやつは質問なんかしないだろ
2020/04/26(日) 09:08:46.83ID:rBKIu5KT0
>>635
それググレカスキッズだと思う
>>612
2020/04/26(日) 10:18:45.13ID:LS9zyJ5J0
複数あるコマンドボタンをどれを押しても一つの処理に入り、押されたボタンを取得して、ボタンごとに判断処理ってできないのでしょうか。(activeXです)

具体的にはシリアルポートの処理で以下のことをやりたいです。
コマンドボタンが機器名、その機器ごとに存在する複数のコンボボックスにポート名やボーレートを設定。
あるコマンドボタンを押したら、対応するコンボボックス郡の設定を取得してポートを開く。(ポートオープンはモジュールに記述したWritefileでやってます)
ポートオープンで返ってきたハンドラが例外でなければ、押されたコマンドボタンの色を変更し、名前を"機器名+接続中"に変更。
また、コマンドボタンを押した時点で対応ポートのハンドラが存在すれば、そのポートを閉じて(ハンドラも初期化)、押されたコマンドボタンの色を戻す。

現在はボタンごとのプロージャを作成し、同じような処理を逐一書いてますが、機器が複数あって大変見にくいのと、記述が大変なのでまとめたいです。
2020/04/26(日) 10:39:23.22ID:oDDaXD960
>>637
それ、まともにやろうとするとかなり上級レベル。
上級者を自認する人でも出来ない人が結構いる。
2020/04/26(日) 10:39:50.30ID:1a87l4R/0
>>637
「コントロール配列」でぐぐれ
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_100_040.html
2020/04/26(日) 10:44:46.17ID:1a87l4R/0
>>637
同じような処理なら、ボタンクリックのイベントの中で変数にボタン名を設定してから、別に用意した共通部分のSubを呼び出せばいい

ヒント
http://woodbook.kir.jp/excel/vba/button_row.html
2020/04/26(日) 10:46:58.47ID:oDDaXD960
おっ、それを貼るとは。
じゃあ、俺も。
以下の一連を全て理解し、使いこなせれば大分変わる。

http://addinbox.sakura.ne.jp/Breakthrough_P-Ctrl_Arrays.htm
2020/04/26(日) 11:53:55.15ID:LS9zyJ5J0
ありがとうございました
手っ取り早くやれそうな感じではなさそうです
2020/04/26(日) 12:03:24.99ID:3XXXGp1c0
>>639
懐かしいなコントロール配列
昔はよく使ったが最近使ってないな
2020/04/26(日) 12:07:36.34ID:oDDaXD960
>>642
一応言っておくと、途中迄なら出来るかもしれないし(それで十分かも)、読み物としても読んどくと良いと思う。
2020/04/26(日) 14:41:44.01ID:LS9zyJ5J0
>>642
紹介頂いたサイトの大元になるmougを参考にして押したボタンの色変えぐらいまでしかできません
この処理にシート画面上のコンボボックスの値を関連付けて取得する仕掛を入れたいのですが検討つかず
2020/04/26(日) 15:58:20.12ID:io10sll9a
各ボタン押した最初の処理だけわけて
引数つけて共通処理に飛ばせばよくね
2020/04/26(日) 18:40:06.52ID:IAQJrydO0
全部ここの人達のおかげで完全に憑き物が取れて教えて貰ったURLと持ってる本を参考にひたすら初歩のルールから愚直に
打っては実行を繰り返し練習してます

Do loop
For next
特にこれの破壊力は凄いですね
これだけの為に覚える価値すらあると感じました
あとはmsgboxの使い方の面白さ
感謝しかないです

Do loopでwhileとuntilがあるけどよほど複雑でない場合
書き方変えるだけで同じ処理させられる感じですが
基本どっちかでで使い方覚えていったほうがいいものですかね
質問というよりただただ楽しくここの上級者たちにも癖だったり自分ルールがあるのかなと
ああ楽しい
2020/04/26(日) 19:35:22.95ID:1a87l4R/0
>>647
繰り返す条件が明確な場合はwhile、終了条件に着目した方が処理の流れがわかりやすい場合はuntil
適切に使い分けると、プログラム全体が読みやすくなって間違いが減る
2020/04/26(日) 19:37:28.36ID:1a87l4R/0
よくない例
While Not 終了条件

適切な例
Until 終了条件
2020/04/26(日) 20:25:45.60ID:IAQJrydO0
>>649

Sub ループwhile()
 Dim i As Long
  i = 1
 Do While Cells(i, 1) <> ""
 Cells(i, 3) = Cells(i, 1) + 10
 i = i + 1
 Loop
 MsgBox i & "回whileでループ"
End Sub

Sub ループuntil()
 Dim i As Long i = 1
 Do Until Cells(i, 1) = ""
 Cells(i, 3) = Cells(i, 1) + 10
  i = i + 1
 Loop    
 MsgBox i & "回untilでループ"
End Sub

なるほど、空白になるまでループってのを練習してました
後者の方が一般的ですかね
勉強になります。
651デフォルトの名無しさん (アウアウエー Sa6a-WAKu)
垢版 |
2020/04/26(日) 21:08:58.39ID:RAbG8RW6a
僕は wihle しか使わない
理由は c言語にないから

あと、なんとなくだけど、wihle と until は混ぜて使わない方がよい気がする

いや、混在する人がいても文句は言わないと思うけど
2020/04/26(日) 21:11:31.65ID:RAbG8RW6a
>>651
651 ですが、
理由は until はc言語にないから
です
すみません
2020/04/26(日) 21:21:03.37ID:wya5Zv+N0
ド・モルガンの法則なんてのを知ってるとループ条件が
劇的に易しく書けるようになったりするよ
2020/04/26(日) 21:43:11.03ID:Whjp3eXS0
>>653
ドモルガンは法則ではなくて公理すなわち前提条件なのでは?
2020/04/26(日) 22:54:36.35ID:1a87l4R/0
Not Is Nothing
英語の否定文って日本語とロジックが違うから直感的にわかりにくい
2020/04/26(日) 23:37:47.73ID:x2OEBIkDa
少なくとも一回実行する必要があるとき until
一回も実行しないかもしれないとき while
2020/04/27(月) 00:02:16.80ID:i1fhLCEO0
まぁ大事なのは自分の中でしっかりルールを固めておくこと
なんとなくで使い分けてると100%デスマに陥る
2020/04/27(月) 00:02:40.85ID:pzY5bj450
>>656
VBAでは、それはDo側に書くかLoop側に書くか

WhileかUntilかはその条件の意味的なもので使い分けるのが本筋だろうけど
書くときの話ならどちらかに統一するルールでも良いと思う
2020/04/27(月) 00:32:05.13ID:7P4A4QOo0
シート1のA1セルにx1、x2、x3と設定し、このx1〜x3をそれぞれx1をB1セルに設定されている値、x2をC2セルに設定されている値に置換するにはどのようにすればよいのでしょうか
Replaceでは検索文字列および置換文字列を一つずつ指定できないため、検索したい文字列が増えるたびに処理が無駄に増えてしまうように思うため効率的なやり方を教えていただきたいです
2020/04/27(月) 03:31:04.69ID:Rq5FZkLb0
もっとわかるように説明してもらわんと
661デフォルトの名無しさん (ワッチョイ ae63-V/Lh)
垢版 |
2020/04/27(月) 04:12:22.78ID:NMjdVbpJ0
置換と言ってるからセル参照ではない事だけわかった
2020/04/27(月) 04:51:42.68ID:o+TU1QYP0
学習能力のないひとがやってきて
説明能力の貧弱さを露呈する場所か・・・
2020/04/27(月) 05:03:04.57ID:Nsh172gi0
>>647
IF文、For文と配列で簡単な処理はこなせる
上級者はまた別のパラダイムで書いているが
先走る必要もなく基礎を確実に身につけよう

>>654
ド・モルガンは定理になることが多いが
そうなるのは公理系しだいだから
名前がおかしいと感じたことはない
664デフォルトの名無しさん (ワッチョイ 6ee6-eHaU)
垢版 |
2020/04/27(月) 06:05:48.59ID:XYadQOO00
>>659
非効率なコードを上げてくれ
2020/04/27(月) 06:24:43.93ID:3fBcsBz5r
>>659
select case
2020/04/27(月) 08:38:39.18ID:MOHWKMXM0
>>659
x3をd3に入れる
置換にこだわらず、代入しなおす
2020/04/27(月) 09:24:40.63ID:JVYKLC34M
ワークシート名をsheet(i)みたいな感じで配列に格納して、
for i=i to X
sheet(i).cell(row,col) = data
next
の様な、ループで各シートのセルに値を代入する方法を教えていただけないでしょうか。
2020/04/27(月) 10:44:49.67ID:p6J78QU70
>>667
実際の要件知らんが、普通はもっといい方法があると思うが、質問通りに。

https://i.imgur.com/SdMgpZq.png
2020/04/27(月) 10:47:33.37ID:o+TU1QYP0
Dim i As Integer
For i = 1 To 3
ThisWorkbook.Worksheets(i).Cells(1, 1) = 1
Next i

で済むようなものだと予想
2020/04/27(月) 13:38:56.30ID:JH5ykH9R0
・ツールの作成
・バク対応、修正業務
・各種テスト
VBAを用いて上記の業務を行う場合、皆さん(自分の取り巻く環境以外)の現場で求められる頻度や重要度が高いスキルや業務を伺いたいです。
よろしくお願いします。
671デフォルトの名無しさん (ワッチョイ 968e-RPvb)
垢版 |
2020/04/27(月) 15:07:52.31ID:VtI6ihiD0
>>670
馬鹿は死ね
2020/04/27(月) 15:33:05.22ID:uroKfm2Gd
>>667
何でシート名で配列なの?
既にシートオブジェクトの配列として使えるのに。
2020/04/27(月) 15:35:59.76ID:MOHWKMXM0
>>667
シート名は普通に列挙したいんだと思った
コード内に記述したいのか: sheet=Array("hoge","fuga","piyo","puyo")
セル内に記述したいのか: sheet=WorksheetFunction.Transpose(WorkSheets("hoge").Range("a1:a4"))
どうか、わかんないけど
2020/04/27(月) 15:36:24.43ID:uroKfm2Gd
>>670
そいつは現場次第だよねえ。

現場に併せて何でも出来るってことかな。
AccessならSQLは必須だと思うけど。
2020/04/27(月) 16:19:32.17ID:JH5ykH9R0
>>671
生きる!!!

>>674
自分の周り以外だとどんなことにVBA使ってるか気になりましてね。他意はマジでなくて、単純な興味として質問してみますた。
2020/04/27(月) 17:19:41.93ID:H2efCY7TH
既存のVBAをどうしてもメンテせざるを得ないときに使う
新規に使うことはない
2020/04/27(月) 18:02:05.74ID:fDdETITO0
ちょっとデータを加工したい時、軽い処理とか1回限りの計算はVBAでやってる
VisualStudioはその場限りの捨てコードを書くには大げさすぎる
2020/04/27(月) 18:06:27.58ID:JnEQ074MM
>>677
そんな貴方にPowershellオススメ
2020/04/27(月) 18:40:53.81ID:JH5ykH9R0
>>676
>>677
レスありがとうございました。
ちょっとした作業を手軽に(環境構築とかなしで)効率化するときに使ってるってのが分かりました。
何気なく使ってるから頻度も重要度もクソもないと
680デフォルトの名無しさん (ワッチョイ 6ee6-eHaU)
垢版 |
2020/04/27(月) 19:15:08.58ID:XYadQOO00
昔は「値で貼り付け」とかキー割り当てしてたけど最近のは割と便利になったから使ってないな
他には初回印刷日の挿入とか
ファイルプロパティにタイトルの設定とかかな
681デフォルトの名無しさん (ブーイモ MMfd-enkp)
垢版 |
2020/04/27(月) 20:04:15.02ID:GiQWIPCuM
「値で貼り付け」に関して最近のはどう便利になってるの?
2020/04/27(月) 20:24:28.01ID:Jy0k1GG60
VBAでの開発依頼がしょっちゅう来る…
2020/04/27(月) 20:30:04.12ID:XYadQOO00
>>681
https://i.imgur.com/xIc2Szq.jpg
684デフォルトの名無しさん (バットンキン MM0a-N7dq)
垢版 |
2020/04/27(月) 20:34:34.60ID:z3LiCQZGM
配列を使った方が良い場合ってどんな時?
2020/04/27(月) 20:48:23.14ID:XYadQOO00
>>684
相手は誰だ?
ワークシート? Dictionary? CSV文字列?
2020/04/27(月) 23:24:48.65ID:JH5ykH9R0
>>680
自分の素朴な疑問に答えてもらってありがとうございます。
2020/04/27(月) 23:26:56.58ID:g7wz6Zov0
ここの人ら凄い、
いつも感心しながら読んでるけど本当に勉強になる。
これだけ知識や経験あるならユーチューバ―とかになって上手くやれば副業も出来そう
2020/04/27(月) 23:27:29.10ID:fDdETITO0
>>684
処理したい変数がたくさんあって繰り返し同じことをする時
処理したいセルがたくさんあって繰り返し同じことをする時
2020/04/27(月) 23:28:15.08ID:fDdETITO0
office田中もいつのまにかyoutuberになってたけど、こんなおじいちゃんだとは思わなかった
690デフォルトの名無しさん (ワッチョイ 64ad-Btmo)
垢版 |
2020/04/27(月) 23:42:25.59ID:RTbdScdC0
VBAを本を読んだりググったりして勉強中です。
他社システムからいただくCSVファイルをExcelに取り込んで編集する必要があります。
頭にゼロが付いて、長さが不定の数字のフィールドがあるので、そこは文字列で
扱わなくてはならず、そのままExcelで開けません。
querytables.add でインポートしてみたところ、セル内改行の含まれる列があるため、
1行であるべきデータが2行になってしまいます。
POWERQueryを使えば回避できる、という情報にに突き当たり、とりあえずマクロの
記録をしてみて、使えるように変えられないか、と思いましたが行き詰っています。
「ソース = Csv.Document(File.Contents(””CSVのパス””),… 」
のCSVのパスの部分を変数にしたいのですが、変数にすると
「 .Refresh BackgroundQuery:=False」のところで
[Expression error] インポート 変数 がエクスポートと一致しません。モジュールの参照が漏れていませんか?」
と親しげだけど、冷たく突き放されます。
知識が足りなさすぎるのですが、データをきれいにして早く次の処理を作らなくては
いけなくて焦っています。
先輩たちはテレワークで、あまり質問もできず困っております。
どうぞよろしくお願いいたします。
2020/04/27(月) 23:45:46.00ID:3fBcsBz5r
>>689
再生数少ないけど分かりやすいから初心者は見るべきだと思う
schooのは微妙だけど
2020/04/28(火) 01:18:35.72ID:7QVY/xgO0
>>690
Ruby なら、以下をscript.rb に書いて、
CSV データを、input.csv に書いてある時、

ruby script.rb input.csv
と、シェルで実行すると、

require 'csv'

file_path = ARGV[ 0 ] # 引数には、CSVファイルパスを渡す。input.csv

# CSV ファイルを、1行ずつ処理する
CSV.foreach( file_path ) do |row|
puts "#{ row[ 0 ] } : #{ row[ 1 ] }"
end

入力・input.csv
あ,いう
a,bc

出力
あ : いう
a : bc
2020/04/28(火) 02:18:31.92ID:wtscQEd50
Sub ループuntil()
 Dim g As Long
  g = 3
 Do Until Cells(g, 2) = ""
 Cells(g, 6) = Cells(g, 2) + Cells(g, 3) * 10
 g = g + 1
 
 Loop Dim ms As String
 ms = MsgBox(g & "回ループ", vbYesNo, "どうやら")

 If ms = vbYes Then
 MsgBox "更に練習", vbYesonly, "じゃあ"   Else
 MsgBox "論外", vbYesonly, "てめーは"   
 End If
End Sub

何とか練習しつつ
ここにきてデータ型が逆に混乱してきましたわ
バリアントでごまかそうかな
おやすみなさい
2020/04/28(火) 02:51:59.71ID:ro9Vnp/Q0
>>690
こんな馬鹿に仕事をさせるのが間違い
2020/04/28(火) 03:02:31.63ID:OG4s1hHd0
>>693
これ、そこらの入門書にはなかなか書いてないんだけど、MsgBoxの結果はVbMsgBoxResultという特殊な型なので、変数msはこう宣言するのが正解

Dim ms As VbMsgBoxResult

この宣言を書いてからコードを書くと、

If ms =

ここまで入力すると自動的に、vbYesとかvbNoなどの選択肢が出てくる
2020/04/28(火) 04:56:00.09ID:Ok+k67Xa0
Select Case "CSVファイルをExcelに取り込む"
Case "直接開く"
MsgBox "0 padding"
Case "querytables"
MsgBox "inline CR"
Case "POWERQuery"
MsgBox "Syntax Error"
Case "先輩たち"
MsgBox "テレワーク"
Case "2ch"
MsgBox "ググレカス"
Case "自分"
MsgBox "勉強中"
End Select
2020/04/28(火) 05:30:30.28ID:CHpsAleC0
>>689
VBAは年齢層高いだろ?
Pythonとかより
2020/04/28(火) 06:23:10.14ID:fDIatR4a0
最近csvを開くのがはやってるみたいだけど、拡張子をtxtに変えて開き直すといいよ
2020/04/28(火) 08:10:33.21ID:uR1kyCkX0
>>670
ぜ・ん・ぶ
2020/04/28(火) 08:27:27.46ID:F6rfqhbJd
>>684
速度アップの為にあえて使うのはVariant配列。

配列にすることに全く違和感が無いので、"あえて"使うことが少ない。
配列にするのに自然なことがたくさんあるし、普通に使ってる。
2020/04/28(火) 13:36:09.05ID:1XDByXps0
ありがとうございました。
できました。
2020/04/28(火) 13:57:24.45ID:0tfnjkqK0
いえいえ
2020/04/28(火) 17:53:56.69ID:YPs9lugpM
Sub テキスト抽出()
  ChDir "c:\tmp"
  f = Dir("*.txt")
  c = 1
  Do While f <> ""
    Open f For Input As #1
        Line Input As #1,s
    s = "s"
    r = 1
    Do While Not EOF(1) And s <> ""
      Line Input #1, s
If s <> "" Then Cells(r, c) = Split(s, vbTab)(5)
    r = r + 1
    Loop
    Close #1
    f = Dir
    c = c + 1
  Loop
End Sub
2020/04/28(火) 18:04:37.39ID:YPs9lugpM
ここで教えて頂いた>>703の「指定Path内の全txtデータのF列2行目から下に数値が続く限りシートに全部抽出する」コードのお陰で憑き物が取れて運用してるのですが
たまに画像の様な他の列に行がはみ出したデータがあると

実行時エラー'9':
インデックスが有効範囲にありません
で止まりますが

これを「他の列がどうだろうがtxt内のF2から下に数値が続く限り抽出」
に改良するのは難易度高いですか?
というかコードで可能でしょうか
入門編の本には載って無く数字変えたりwhileの位置変えたりしてますが簡単にいくはずもなく
参考になるサイトなどありましたら教えて頂けませんでしょうか

↓こんなデータが混じってるとエラーで止まります
https://i.imgur.com/194ePDL.jpg
2020/04/28(火) 18:19:12.75ID:uYkVg/g/a
>>703
まんなかへんのdo while の後ろはかっこをつけたほうがいいよ
判定の対応がわかりにくいので
2020/04/28(火) 18:35:05.50ID:yXtY+D7s0
>>689
元々有名な人なんだね。
投稿動画多くてあれこれクリックしてるうちにどんどん登録者数が伸びてったからビックリした。
最初見た時は5000ぐらいだったのに、さてどこまで伸びるかな。
2020/04/28(火) 19:06:29.99ID:fDIatR4a0
>>704
>If s <> "" Then Cells(r, c) = Split(s, vbTab)(5)
この行、最後に(5)ってついてるでしょ
読み込んだデータに5+1番目(0スタートだから+1)の要素が無かったら、どうなると思う?

ここは、splitの結果を一旦配列変数に受けて、配列の大きさを確認する判定をいれるといいよ
実を言えば、s<>"" の判定も不要だったりもする
2020/04/28(火) 19:48:07.59ID:uR1kyCkX0
都道府県別の7日移動平均線を出すグラフ組めないかなあと
思って、「都道府県別の日々新規感染者数」を探したけど見つからん…。

なんで役人は pdf にしたがるんだろう。
2020/04/28(火) 20:13:54.22ID:ZPYYxv13M
>>707
正直ほとんどさっぱりわからないです。
が、ありがとうございます。そこらへんをいじればなんとかしろなりそうってことですかね。
まだ変数の使い方もよくわかってないのでsplit関数で検索して集中的に勉強していじれるようにがんばります。
2020/04/28(火) 21:00:00.12ID:CHpsAleC0
>>706
VBAはハードル低くて
エクセルが実用的だから
ユーザが多いんだろう
2020/04/28(火) 22:51:18.67ID:7QVY/xgO0
データは、PDF じゃなくて、アプリで処理しやすいように、
同じ場所に、CSV ファイルも置いておくのが基本!

役人は、データ処理の素人w
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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