[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『サブフォルダに格納されているファイルを、ファイル名ごとに条件分岐させたい』(ま)
お世話になっております。
当方VBA初心者のため、ご教示ください。
張りつけするファイル(xlsx)と同フォルダ内に「Voltから始まるファイル(CSV)」と「Currから始まるファイル(CSV)」が大量にサブフォルダに格納されています。
Voltの時とCurrの時ではりつける場所を変えるマクロが知りたいです。
また、グラフの作成(範囲の修正)もしたいです。
?@開くサブフォルダを指定する
(調べていて見つけたのが、ダイアログボックスでフォルダを指定するタイプでした。)
?AVoltの時、C5〜C135に入力されている数値をコピー、別ファイルのAK6に貼り付ける
ファイルごとに最終列の隣へどんどん貼り付けていく
?Bファイルごとに数字を追加
フォルダが変わると数字を1〜にする
※1フォルダにVolt5個、Curr5個程度(どちらもたまに6個)入っています。
2行目にフォルダの日付、3行目に1〜、4行目に1回目〜5回目(たまに6回目)と記載したい
3行目のフォルダ数は日付によって違います。
?C貼り付ける前でも後でも良いのですが、1行ごとに空白行を挿入する
例)AK141:0.365
AK142:空白
AK143:0.412
?D折れ線グラフの作成
貼り付けた6行目と141行目の1行を折れ線グラフにする(空白行は飛ばしてすべての行を128個作成)
グラフについては、すでにAJ列まで作成済みのものがありますので、可能であれば追加した列分の範囲の修正を行いたいです。
上記のことがしたいのですが、初心者なため、サンプルコードをいただけるとありがたいです。
また、マクロで再現が難しいということがあればご教示願います。
お手数をおかけしますが、よろしくお願いいたします。
< 使用 Excel:Microsoft365、使用 OS:Windows10 >
●●、□□、▼▼▼ ←NG
10001,名前-1,大空市大海町穴蔵000,38,010-00-1101
10002,名前-8,大空市大海町穴蔵001,51,011-01-0001 OK^^;
書込みファイル エクセル表形式でシート名、セル番地が解るようにサンプルをご提示
賜れば幸甚です。特にグラフ作成の素になる情報
http://www.excel.studio-kazu.jp/kw/20110209184943.html
をお借りすると簡単かも^^;
張りつけするファイル(xlsx) ←これにマクロ設置しxlsmにするのは可能ですか
それとも、マクロは別ブックをお考えですか。
あと
プログラム設計についての質問等にお付き合いいただけますと。何かお手伝いくらいは
出来るかもしれません。私が出来なくても多数ご案内があるかもしれません
多分。。。ですが。。。m(__)m
(隠居Z) 2024/07/26(金) 16:26:02
『CSV(Currから始まるファイル)』
[A] [B] [C] [D] [E]
[1] 計測日 | 24/7/18_09:57:15 | | |
[2] 下限値 | 0.003 | | |
[3] | | | |
[4] FPGA | chNo. | 電流 | 判定 |
[5] 1 | 1-1-001 | 0.0142 | G |
[6] 1 | 1-1-002 | 0.0128 | G |
| | | |
. | | | |
. | | | |
. | | | |
| | | |
131 1 | 1-1-127 | 0.0151 | G |
132 1 | 1-1-128 | 0.0142 | G |
となっています。
Voltから始まるファイルはC4の部分が「電圧」な以外すべて同じです。
『書込みファイル』
[E] [F] [G] [H] [I] [J]
[2] 2024/07/18 | | | | |2024/7/19
[3] 確認 | | | | |1
[4] 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |1回目
[5] 電圧 | | | | |
[6] 2.1099 | | | | |
. | | | | |
. | | | | |
. | | | | |
. | | | | |
. | | | | |
| | | | | [139] 電流 | | | | | [140] 0.009 | | | | | [141] 0.0145 | | | | | このような感じです。 (わかりにくければまた作成します・・申し訳ないです・・)
マクロ設置しxlsmにするのは可能です。
むしろそのほうが簡単でしょうか?(たくさん開く必要がない?)
すみません、右も左もわかりませんのでご教示くださいませ・・
(ま) 2024/07/26(金) 16:56:35
さきほどの図、かなりずれてしまったようで申し訳ないです・・・
(ま) 2024/07/26(金) 16:58:55
『CSV(Currから始まるファイル)』
|[A] |[B] |[C] |[D]
[1] |計測日|24/7/18_09:57:15 | |
[2] |下限値| 0.003| |
[3] | | | |
[4] |FPGA |chNo. |電流 |判定
[5] | 1|1-1-001 | 0.0142|G
[6] | 1|1-1-002 | 0.0128|G
[7] | 1|1-1-003 | 0.0114|G
[8] | 1|1-1-004 | 0.01|G
[9] | 1|1-1-005 | 0.0086|G
[10]| 1|1-1-006 | 0.0072|G
[11]| 1|1-1-007 | 0.0058|G
[12]| 1|1-1-127 | 0.0151|G
[13]| 1|1-1-128 | 0.0142|G
[14]| | | |
『CSV(Voltから始まるファイル)』
|[A] |[B] |[C] |[D]
[1] |計測日|24/7/18_09:57:15 | |
[2] |下限値| 0.003| |
[3] | | | |
[4] |FPGA |chNo. |電圧 |判定
[5] | 1|1-1-001 | 2.0142|G
[6] | 1|1-1-002 | 2.0128|G
[7] | 1|1-1-003 | 2.0114|G
[8] | 1|1-1-004 | 2.01|G
[9] | 1|1-1-005 | 2.0086|G
[10]| 1|1-1-006 | 2.0072|G
[11]| 1|1-1-007 | 2.0058|G
[12]| 1|1-1-127 | 2.0151|G
[13]| 1|1-1-128 | 2.0142|G
[14]| | | |
『書込みファイル』
|[A]|[B] |[C] |[D] |[E] |[F] |[G] |[H] |[I] |[J]
[1] | | | | | | | | | |
[2] | | | | |2024/7/18 | | | | |2024/7/19
[3] | | | | |確認 | | | | | 1
[4] | | | | |1回目 |2回目 |3回目 |4回目 |5回目 |1回目
[5] | | | | |電圧 | | | | |
[6] | | | | | 2.1099| | | | |
[7] | | | | | | | | | |
[8] | | | | | | | | | |
[9] | | | | | | | | | |
[ ]| | | | | | | | | |
[ ]| | | | | | | | | |
[139 | | | |電流 | | | | |
[140 | | | | 0.009| | | | |
[141 | | | | 0.0145| | | | |
[ | | | | | | | | |
追伸
ファルダ構成も詳細を教えて下さい
1.日時を取得とありますが、フォルダのプロパティの更新日時ですか
2.それともフォルダ名が日時を含むでしょうか
3.フォルダ名に規則性が有るなら教えて下さい
4.大量のcsvとありますが、どのくらいですか、サブフォルダのサブフォルダはありますか
ご説明の6個だけでしたら大量とは表現されないかと思いまして。^^;
m(__)m
(隠居Z) 2024/07/26(金) 17:50:42
日時はcsvのB1セルでは? パワークエリでできないかなと思いつつ 開会式を見るために今日はおやすみなさい (´・ω・`) 2024/07/26(金) 18:14:10
>>日時はcsvのB1セルでは? ぽいですね。。。^^;
オリンピックですかぁ。。。いいなぁ〜お楽しみくださいませm(__)m
(隠居Z) 2024/07/26(金) 18:26:03
回答では御座いませんが
とりあえず、恐怖の憶測と推測に基づくテスト用ダミー情報を作ってみました^^;
実物とのフォルダ構成、フォーマット、レイアウト等の相違点が御座いましたらご指
摘ください
消したり作成したりしますので必ず新規マクロブックでお試しいただければ幸甚です。
終われば
Private Sub Test_Folder_Files_Osouji を単独で走らせると大掃除も終了です。m(__)m
Option Explicit
Sub Ddmk_Main()
Test_Folder_Files_Osouji
Dim i&, j&, k&, ps, fNm, cnt, psary(), fdNm
psary = Array("dataa", "datab", "datac", "datad", "datae", "dataf", "datag", "datah", "datai", "dataj")
For i = LBound(psary) To UBound(psary)
ps = ThisWorkbook.Path & "\" & psary(i) & "\"
fdNm = Dir(ps, vbDirectory)
If fdNm = "" Then MkDir ps & fdNm
For j = 0 To 1
ddmk Array("Curr", "Volt")(j), i, ps
Next
Next
Erase psary
End Sub
Private Sub ddmk(txt, xxx, ps)
Rnd -7
Dim mT As Long
Dim sT As Long
Dim mTd As Double
Dim mdd As Date
Dim i&, j&, k&, a&, b&, c&, x&
Dim kaisu&
Dim uP4(1 To 4, 1 To 4)
Dim dW4(1 To 131, 1 To 4)
Dim vtx$
If txt = "Curr" Then
vtx = "電流"
ElseIf txt = "Volt" Then
vtx = "電圧"
Else
Erase uP4, dW4
Exit Sub
End If
mdd = DateSerial(2024, 7, 1)
mdd = mdd + xxx
mTd = TimeSerial(8, mT, sT)
uP4(1, 1) = "計測日"
uP4(1, 2) = Format(mdd, "yyyy/mm/dd") & "-" & Format(mTd, "hh:mm:ss")
uP4(2, 1) = "下限値"
uP4(2, 2) = 0.003
uP4(4, 1) = "FPGA"
uP4(4, 2) = "chNo."
uP4(4, 3) = vtx
uP4(4, 4) = "判定"
x = 11001
kaisu = 5
If xxx Mod 3 = 0 Then kaisu = 6
For i = 1 To kaisu
For j = 1 To UBound(dW4, 1)
dW4(j, 1) = 1
dW4(j, 2) = Format(x, "0-0-000")
If vtx = "電流" Then
dW4(j, 3) = Int((999 - 30 + 1) * Rnd + 30) / 10000
ElseIf vtx = "電圧" Then
dW4(j, 3) = Int((29999 - 30 + 1) * Rnd + 30) / 10000
End If
dW4(j, 4) = "G"
x = x + 1
Next
Open ps & txt & i & ".csv" For Output As #1
For a = LBound(uP4, 1) To UBound(uP4, 1)
Print #1, uP4(a, 1) & "," & uP4(a, 2) & "," & uP4(a, 3) & "," & uP4(a, 4)
Next
For a = LBound(dW4, 1) To UBound(dW4, 1)
Print #1, dW4(a, 1) & "," & dW4(a, 2) & "," & dW4(a, 3) & "," & dW4(a, 4)
Next
Close #1
x = x + 1000
mT = mT + 2
sT = sT + 70
mTd = TimeSerial(8, mT, sT)
uP4(1, 2) = Format(mdd, "yyyy/mm/dd") & "-" & Format(mTd, "hh:mm:ss")
Next
Erase uP4, dW4
End Sub
Private Sub Test_Folder_Files_Osouji()
Dim v(), i&, ps, fdNm, fNm
v = Array("dataa", "datab", "datac", "datad", "datae", "dataf", "datag", "datah", "datai", "dataj")
For i = LBound(v) To UBound(v)
ps = ThisWorkbook.Path & "\" & v(i) & "\"
fdNm = Dir(ps, vbDirectory)
If fdNm <> "" Then
fNm = Dir(ps & "*.csv")
Do
If fNm = "" Then Exit Do
DoEvents
Kill ps & fNm
fNm = Dir()
Loop
RmDir ps
End If
Next
Erase v
End Sub
(隠居Z) 2024/07/27(土) 09:39:32
ご考察の砌、何かの足しにでもなれば幸甚です。。。お後がよろしいようで。。。でわ
m(__)m
Option Explicit
Sub OneInstanceMain()
Dim cnt&, i&, ps$, w(), fNm$, ad0tx$, ad1tx$
AcceptFolder_Ps ps
fNm = Dir(ps & "\*.csv")
Do Until fNm = ""
DataFile_Read ps & "\" & fNm, w, i
cnt = cnt + 1
If cnt Mod 8 = 0 Then DoEvents
fNm = Dir()
Loop
Ws_Write w, ad0tx, ad1tx
Erase w
End Sub
Private Sub AcceptFolder_Ps(ps$)
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ThisWorkbook.Path
If .Show = True Then
ps = .SelectedItems(1)
End If
End With
End Sub
Private Sub DataFile_Read(ByVal fNm$, ByRef w(), ByRef i As Long)
Dim dCnt&, n&, buf, tmp, ymdt, dkind
If Split(fNm, "\")(UBound(Split(fNm, "\"))) Like "*Curr*" Then dkind = 1
If Split(fNm, "\")(UBound(Split(fNm, "\"))) Like "*Volt*" Then dkind = 0
Open fNm For Input As #1
Do Until EOF(1)
If i Mod 32 = 0 Then DoEvents
Line Input #1, buf
tmp = Split(buf, ",")
dCnt = dCnt + 1
If dCnt = 1 Then ymdt = tmp(1)
If dCnt > 4 Then
ReDim Preserve w(i)
w(i) = Array(DateValue(Split(ymdt, "-")(0)), TimeValue(Split(ymdt, "-")(1)), dkind, tmp(2))
i = i + 1
End If
Loop
Close
End Sub
Private Sub Ws_Write(w, adVtx$, adCtx$)
Dim i&, j&, sw(), app, y&, x&, xxx&, yyy&, xxx1&, yyy1&
Dim tmp(), n&, y1&, x1&, Mbreak&, Mbreak1&, Lbreak
Set app = Application
ReDim Preserve w(UBound(w) + 1)
w(UBound(w)) = Array("", 9999999, 9999999, "")
sw = app.SortBy(w, app.Index(w, 0, 3), 1, app.Index(w, 0, 2), 1)
With Worksheets("Sheet1")
Rem .UsedRange.Clear
y = 6
y1 = 139
x = .Cells(y, .Columns.Count).End(xlToLeft).Column + 1
x = IIf(x < 5, 5, x)
x1 = .Cells(y1, .Columns.Count).End(xlToLeft).Column + 1
x1 = IIf(x < 5, 5, x1)
xxx = x
xxx1 = x1
.Cells(2, x) = sw(1, 1)
For i = LBound(sw, 1) To UBound(sw, 1) - 1
ReDim Preserve tmp(n)
tmp(n) = sw(i, 4)
n = n + 1
If sw(i, 1) <> sw(i + 1, 1) Then
If i + 1 < UBound(sw, 1) Then
MsgBox "フォルダ内の複数日付の情報には対応しておりません"
End
End If
End If
If sw(i, 2) <> sw(i + 1, 2) Then
If sw(i, 3) = 0 Then
Mbreak = Mbreak + 1
x = .Cells(y, .Columns.Count).End(xlToLeft).Column + 1
x = IIf(x < 5, 5, x)
If Mbreak = 1 Then .Cells(y - 1, x) = "電圧"
.Cells(y - 2, x) = Mbreak
.Cells(y, x).Resize(UBound(tmp) + 1, 1) = app.Transpose(tmp)
yyy = UBound(tmp) + 1 + y - 1
ElseIf sw(i, 3) = 1 Then
Mbreak1 = Mbreak1 + 1
x1 = .Cells(y1, .Columns.Count).End(xlToLeft).Column + 1
x1 = IIf(x1 < 5, 5, x1)
If Mbreak1 = 1 Then .Cells(y1 - 1, x1) = "電流"
.Cells(y - 2, x1) = Mbreak1
.Cells(y1, x1).Resize(UBound(tmp) + 1, 1) = app.Transpose(tmp)
yyy1 = UBound(tmp) + 1 + y1 - 1
End If
Erase tmp
n = 0
End If
Next
.Activate
adVtx = .Name & "!" & _
Intersect(.UsedRange, .Range(.Rows(y), .Rows(yyy)), .Range(.Columns(xxx), .Columns(x))).Address
adCtx = .Name & "!" & _
Intersect(.UsedRange, .Range(.Rows(y1), .Rows(yyy1)), .Range(.Columns(xxx1), .Columns(x1))).Address
graffMake sw(1, 1), adVtx, adCtx
sw = Intersect(.UsedRange, .Range(.Rows(y1), .Rows(yyy1)), .Range(.Columns(xxx1), .Columns(x1))).Value
Intersect(.UsedRange, .Range(.Rows(y1), .Rows(yyy1)), .Range(.Columns(xxx1), .Columns(x1))).Clear
y = 1
ReDim tmp(1 To UBound(sw, 1) * 2, 1 To UBound(sw, 2))
For i = LBound(sw, 1) To UBound(sw, 1)
For j = LBound(sw, 2) To UBound(sw, 2)
tmp(y, j) = sw(i, j)
Next
y = y + 2
Next
.Cells(y1, xxx).Resize(UBound(tmp, 1), UBound(tmp, 2)) = tmp
.UsedRange.Columns.AutoFit
Erase sw, tmp
End With
End Sub
Private Sub graffMake(ByVal mtx As String, ByVal adt0x As String, ByVal adt1x As String)
Dim v, gf, rr, i&, j&, srs, ad(), sr(), nm()
ad = Array("B2:N11", "B12:N21")
sr = Array(adt0x, adt1x)
nm = Array("電圧", "電流")
Worksheets(1).Copy before:=Worksheets(1)
With ActiveSheet
.UsedRange.Clear
For Each v In .Shapes
v.Delete
Next
For i = LBound(ad) To UBound(ad)
Set rr = .Range(ad(i))
Set gf = .Shapes.AddChart(xlLine, rr.Left, rr.Top, rr.Width, rr.Height)
With gf.chart
.HasTitle = True
.HasLegend = True
.ChartType = xlLine
.SetSourceData Range(sr(i))
With .ChartTitle
.Text = mtx & nm(i)
.Font.Color = RGB(255, 0, 0)
.Font.Size = 20
End With
With .Legend
.IncludeInLayout = True
.Position = xlBottom
End With
With .SeriesCollection
For j = 1 To .Count
.Item(j).Format.Line.Weight = 2
Next
End With
For Each srs In .SeriesCollection
With srs
.Name = .Name
.XValues = .XValues
.Values = .Values
End With
Next
End With
Next
End With
Erase ad, sr, nm
End Sub
(隠居Z) 2024/07/28(日) 22:28:46
Private Sub AcceptFolder_Ps(ps$)
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ThisWorkbook.Path
If .Show = True Then
ps = .SelectedItems(1)
Else
MsgBox "取消": End
End If
End With
End Sub
(隠居Z) 2024/07/29(月) 07:21:46
さっそく新規フォルダに上記マクロを入れてみて、回してみたいと思います。
動き方が違う場合、どうしたいかを記載しますのでまたご教示いただけますと幸いです…
(ま) 2024/07/29(月) 08:31:43
その前にいただいていた質問の答えを・・
ファルダ構成も詳細を教えて下さい
1.日時を取得とありますが、フォルダのプロパティの更新日時ですか
→CSVファイルでしょうか?出力された際に、「Curr_FPGA1_1_20240718_094212.csv」というファイル名で出力されます。
このファイルを開いたとき、B1セルにも24/7/18_09:42:12と出るのでそちらを取得したい(コピペできればしたい)と思っております。
2.それともフォルダ名が日時を含むでしょうか
→1.の通り、どちらかを取得出来ればうれしいです。
3.フォルダ名に規則性が有るなら教えて下さい
→フォルダ名「Curr_FPGA1_1_20240718_094212(この日付時間部分が変わる).csv」
「Volt_FPGA1_1_20240718_094207(この日付時間部分が変わる).csv」
4.大量のcsvとありますが、どのくらいですか、サブフォルダのサブフォルダはありますか
→まずマクロ入りエクセルと同じ層に
「20240628確認」
「20240718確認」
「20240720」
「20240726」
というファイルが入っています。
確認ファイルを開くと
「右恒温槽_棚1_右パレット」
「右恒温槽_棚1_左パレット」
.
.
.
「右恒温槽_棚6_左パレット」
「左恒温槽_棚1_右パレット」
「左恒温槽_棚1_左パレット」
.
.
.
「左恒温槽_棚6_左パレット」
上記のうち、左恒温槽_棚1_左パレットのフォルダを開くと、中に
「1」
「2」
「3」
「4」
「5」
のファイルが入っており、
1ファイルの中に、Curr〜とVolt〜がだいたい5個ずつ入っている、という状態になっております。
確認ファイルにそのまま入っていると認識していたので少々ずれがあるかと・・申し訳ないです。
(ま) 2024/07/29(月) 08:48:49
(隠居Z) 2024/07/29(月) 09:02:49
ReDim Preserve w(UBound(w) + 1) ここですか。。。^^: csvファイルが無いと言っています。。。。 当該のcsvファイルが何も無いフォルダを選択しておられるか ご案内済みの修正の箇所で修正せずにキャンセルを押すとそのようになるかも。。。 合わせてご確認をお願いいたします。 m(__)m (隠居Z) 2024/07/29(月) 09:15:06
w(i) = Array(DateValue(Split(ymdt, "-")(0)), TimeValue(Split(ymdt, "-")(1)), dkind, tmp(2)) ここで止まってしまうようです・・
選んでいるファイルは、
「20240718確認」の中の「1」フォルダです。
※エラー内容は型が一致しません。でした
ちなみに「20240718確認」を選択すると
ReDim Preserve w(UBound(w) + 1) で止まります。 ※エラー内容はインデックスが有効範囲にありません。でした
キャンセル、は出てきておりません・・
(ま) 2024/07/29(月) 09:59:09
この中のcsvファイルの先頭部分が下記とちがっていましたら
エクセルではなくテキストエディター[例メモ帳]で開いたものを
差し支えなければここにコピペお願いいたします。特に最初の日時ー時間の部分です。^^;
↓ は当方の実験用csv 1 〜 5行目です
計測日,2024/07/16-08:00:00,,
下限値,0.003,,
,,,
FPGA,chNo.,電流,判定
1,1-1-001,0.0551,G
あと、このCSVファイルの文字コードはシフトジスでしょうか。それともホストコンピュターから
出たものでしたら、UTF8とかでしょうか、ご確認をお願いいたします。
m(__)m
(隠居Z) 2024/07/29(月) 10:49:43
計測日,24/07/18_09:42:12
下限値,0.003
FPGA,chNo.,電流,判定
1,1-1-001,0.0144,G
1,1-1-002,0.0013,NG
1,1-1-003,0.0148,G
文字コードですが「ANSI」これでしょうか?
(ま) 2024/07/29(月) 10:57:17
w(i) = Array(DateValue(Split(ymdt, "-")(0)), TimeValue(Split(ymdt, "-")(1)), dkind, tmp(2))
↓ ここと ↓ここ
w(i) = Array(DateValue(Split(ymdt, "_")(0)), TimeValue(Split(ymdt, "_")(1)), dkind, tmp(2))
に変えて、実行して見て下さいませ。
ANSI
了解です。
m(__)m
(隠居Z) 2024/07/29(月) 11:13:39
質問なのですが、これはSheet1でマクロを開始したからSheet1にコピペされたのでしょうか?
シートを変えるとそのシートにコピペされるか?が知りたいです。
また、電流の方は1行ごとに空白が挿入されているのですが、電圧には空白が入っていません。
こちらの修正はどこをどうすればよいでしょうか・・?
「1」のファイルを選んだだけでも思った通りの動きをしていてとてもうれしいです・・!
(ま) 2024/07/29(月) 11:36:50
やりたい修正としましては、
いま作成済みのグラフの範囲が例えば
・グラフデータの範囲 =電圧_電流データ!$E$136:$AJ$136,電圧_電流データ!$E$266:$AJ$266
・系列名:電圧 =電圧_電流データ!$E$136:$AJ$136
・系列名:電流 =電圧_電流データ!$E$266:$AJ$266
これを、
・グラフデータの範囲 =電圧_電流データ!$E$136:$AO$136,電圧_電流データ!$E$266:$AO$266
・系列名:電圧 =電圧_電流データ!$E$136:$AO$136
・系列名:電流 =電圧_電流データ!$E$266:$AO$266
範囲を増えた列分だけ伸ばす?ことがしたいのですが・・
(ま) 2024/07/29(月) 11:42:57
Sheet1
固定です。
2.グラフの件ですが
わたし、グラフはあまり詳しくは有りませんで。。。でも情報があるなら作り直しは
出来るかも。少し調べてみます。
普通元情報はリンクされていると思いますが今回の様にリンクを切ることも可能です。
3.電圧情報を1行飛ばしにすると電流情報の開始行にかぶりますが。。。適当にずらしてよいのなら
簡単に出来ますよ。
(隠居Z) 2024/07/29(月) 12:33:16
2.なるほどです。。リンクはされててもされていなくてもグラフになっていれば問題ない・・かと思います。
リンクがない状態でもグラフの値は変わらないんですよね?(初歩的な質問で申し訳ないです)
3.すみません、ほんとうに申し訳ないのですが、電流の開始行を間違えておりました。
E262セルに電流、E263セルから開始でした。
簡単にできるのであれば空白行をいれたいです!
(ま) 2024/07/29(月) 12:42:53
コード内の Sheet1 を 電圧_電流データ に変えて 電圧_電流データと言う名前のシートを
作成すればOKです。
後ほど変えますね。
2.リンクがない状態でもグラフの値は変わらないんですよね?(初歩的な質問で申し訳ないです)
はい、セルの数式を値貼付けにするみたいな感じで固定[元情報を消しても変わらない]されます。
3.空白行。。。入れましょうね。(*^^*)
暫時お時間を。m(__)m
(隠居Z) 2024/07/29(月) 12:58:26
2.グラフが見れたらいいのか、と共有する方と相談したところ、グラフ完成後(データ取得後)に手入力でグラフに追加したい数値があるようでした。
その場合、リンクのないグラフへ、リンクのあるグラフを追加?することは可能でしょうか?
3.空白行。。お手数を。。すみません。。
(ま) 2024/07/29(月) 13:08:43
手動でおやりになるのならグラフシートのグラフの下か横に情報を温存し
ておけば何とでもなるとはおもいますが[どこかポチポチくらいでOK]
。。あまりしたこと無いので確認します。
3.1.いえいえ、恐縮です。いまやってますので少々お待ちを←なにせ年寄りなもので
ボツボツ。。。ゆるゆるです( ̄▽ ̄)
m(_ _)m
(隠居Z) 2024/07/29(月) 13:45:01
いただいたコード(文字列にしか見えない)を見つつ、検索もしながら「すご〜・・」とボソボソつぶやいております。
今すぐ必要!どうしても!というわけではないので、まったり書いていただければ、と思います^^
(ま) 2024/07/29(月) 13:51:38
グラフの件ですが
テーブルにしてそのテーブルを元情報にグラフを作成すれば
テーブルを変更[範囲でも値でもOK]すれば自動でグラフに反映されますよ。
でわ
後ほどまた。。。m(__)m
(隠居Z) 2024/07/29(月) 14:10:03
1.全情報を一行飛ばしに表示の件ですが、E263 E266まで情報が被ります。差支えなければ
電流開始行を10行下げE273からとしますけど。
1回分の情報件数は131件でよかったですか。
2.グラフは同じシートに情報を温存後、テーブルにしグラフとリンク関係を保持でいいですか
テーブルでなくても通常の表でも可能です。
3.日時分割セパレータ - を_に変更
4.Sheet1を「電圧_電流データ」というシートに変更
5.既存のグラフの範囲変更は。。。グラフを選択すれば元情報がブルーの範囲選択で自動で
選択されますので、←→マークになるところでズリズリすれは範囲を簡単に変更できます。
ボタンポチですと、VBAで別途グラフ作成ツールを作成する必要が有るかもしれません。
(*^^*)という事で1.2.。。。5.?のご返事をお待ちいたします
3.4.はご報告です。
m(__)m
(隠居Z) 2024/07/30(火) 08:12:30
1.1回分の情報件数は128件になります。
ですので、E263セルに電流、E264セルに数値で問題ないと思いましたがいかがでしょうか?
(10行下げはこの辺りの誤差によるものかな、と思ったので・・)
2.現在、「CH_グラフ」というシートにグラフを保存しているのですが、「電圧_電流データ」のデータとリンクされている状態になっています。
これをテーブル化(しなくても問題ない)する、という認識で間違いないですか?
それとも別に、グラフ用データとして保存、ということでしょうか?
3、4.ありがとうございます。
5.グラフの範囲変更も一括で出来れば。。と考えていたのですが(128個グラフがあるため・・)、グラフ作成ツール。。。難しそうです;;
(ま) 2024/07/30(火) 08:39:12
このあたりはお急ぎでなければどうとでもなりますが。←なにおえらそぉに。。。かなりあやしい^^;
仕様の詳細をお願いいたします。
5.既にこのコード内で大本は作成済みなので、切り離してマイナーチェンジ後呼び出し
方法を変えればそのまま使えるかもですよ。
詳細なグラフの元情報のアドレスが必要ですが←こちらの方が大変ぽい様な気が。。。
気のせいでしょうか。。。(*^^*)
m(__)m
(隠居Z) 2024/07/30(火) 09:13:08
Option Explicit
Sub OneInstanceMain()
Dim cnt As Long
Dim i As Long
Dim ps As String
Dim w() As Variant
Dim fNm As String
AcceptFolder_Ps ps
fNm = Dir(ps & "\*.csv")
Do Until fNm = ""
DataFile_Read ps & "\" & fNm, w, i
cnt = cnt + 1
If cnt Mod 8 = 0 Then DoEvents
fNm = Dir()
Loop
Ws_Write w
Erase w
End Sub
Private Sub AcceptFolder_Ps(ps$)
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ThisWorkbook.Path
If .Show = True Then
ps = .SelectedItems(1)
Else
End
End If
End With
End Sub
Private Sub DataFile_Read(ByVal fNm$, ByRef w(), ByRef i As Long)
Dim dCnt As Long
Dim n As Long
Dim buf As Variant
Dim tmp As Variant
Dim ymdt As String
Dim dkind As Long
If Split(fNm, "\")(UBound(Split(fNm, "\"))) Like "*Curr*" Then dkind = 1
If Split(fNm, "\")(UBound(Split(fNm, "\"))) Like "*Volt*" Then dkind = 0
Open fNm For Input As #1
Do Until EOF(1)
If i Mod 32 = 0 Then DoEvents
Line Input #1, buf
tmp = Split(buf, ",")
dCnt = dCnt + 1
If dCnt = 1 Then ymdt = tmp(1)
If dCnt > 4 Then
ReDim Preserve w(i)
w(i) = Array(DateValue(Split(ymdt, "_")(0)), TimeValue(Split(ymdt, "_")(1)), dkind, tmp(2))
i = i + 1
End If
Loop
Close
End Sub
Private Sub Ws_Write(w)
Dim i As Long
Dim j As Long
Dim a As Long
Dim app As Object
Dim y As Long
Dim x As Long
Dim xbk As Long
Dim ybk As Long
Dim x1bk As Long
Dim y1bk As Long
Dim sw() As Variant
Dim tmp() As Variant
Dim gsrC() As Variant
Dim gsrV() As Variant
Dim n As Long
Dim y1 As Long
Dim x1 As Long
Dim Mbreak As Long
Dim Mbreak1 As Long
Dim r As Range
Dim rr As Range
Set app = Application
ReDim Preserve w(UBound(w) + 1)
w(UBound(w)) = Array("Dummy", "Dummy", "Dummy", "Dummy")
sw = app.SortBy(w, app.Index(w, 0, 3), 1, app.Index(w, 0, 2), 1)
With Worksheets("電圧_電流データ")
Rem E263 266まで情報が被ります。さらに電流開始行を10行下げ273からとします。
y = 6
y1 = 263
x = .Cells(y, .Columns.Count).End(xlToLeft).Column + 1
x = IIf(x < 5, 5, x)
x1 = .Cells(y1, .Columns.Count).End(xlToLeft).Column + 1
x1 = IIf(x1 < 5, 5, x1)
xbk = x
x1bk = x1
.Cells(2, x) = sw(1, 1)
For i = LBound(sw, 1) To UBound(sw, 1) - 1
ReDim Preserve tmp(n)
tmp(n) = sw(i, 4)
n = n + 1
If sw(i, 1) <> sw(i + 1, 1) Then
If i + 1 < UBound(sw, 1) Then
MsgBox "フォルダ内の複数日付の情報には対応しておりません"
Erase w, sw, tmp, gsrC, gsrV
End
End If
End If
If sw(i, 2) <> sw(i + 1, 2) Then
If sw(i, 3) = 0 Then
Mbreak = Mbreak + 1
x = .Cells(y, .Columns.Count).End(xlToLeft).Column + 1
x = IIf(x < 5, 5, x)
If Mbreak = 1 Then .Cells(y - 1, x) = "電圧"
.Cells(y - 2, x) = Mbreak
.Cells(y, x).Resize(UBound(tmp) + 1, 1) = app.Transpose(tmp)
ybk = UBound(tmp) + 1 + y - 1
ElseIf sw(i, 3) = 1 Then
Mbreak1 = Mbreak1 + 1
x1 = .Cells(y1, .Columns.Count).End(xlToLeft).Column + 1
x1 = IIf(x1 < 5, 5, x1)
If Mbreak1 = 1 Then .Cells(y1 - 1, x1) = "電流"
.Cells(y - 2, x1) = Mbreak1
.Cells(y1, x1).Resize(UBound(tmp) + 1, 1) = app.Transpose(tmp)
y1bk = UBound(tmp) + 1 + y1 - 1
End If
Erase tmp
n = 0
End If
Next
.Activate
Set r = Intersect(.UsedRange, .Range(.Rows(y), .Rows(ybk)), _
.Range(.Columns(xbk), .Columns(x)))
Set rr = Intersect(.UsedRange, .Range(.Rows(y1), .Rows(y1bk)), _
.Range(.Columns(x1bk), .Columns(x1)))
gsrV = r.Value
gsrC = rr.Value
graffMake sw(1, 1), gsrV, gsrC
sw = r.Value
r.Clear
a = 1
ReDim tmp(1 To UBound(sw, 1) * 2, 1 To UBound(sw, 2))
For i = LBound(sw, 1) To UBound(sw, 1)
For j = LBound(sw, 2) To UBound(sw, 2)
tmp(a, j) = sw(i, j)
Next
a = a + 2
Next
.Cells(y, xbk).Resize(UBound(tmp, 1), UBound(tmp, 2)) = tmp
sw = rr.Value
rr.Clear
a = 1
ReDim tmp(1 To UBound(sw, 1) * 2, 1 To UBound(sw, 2))
For i = LBound(sw, 1) To UBound(sw, 1)
For j = LBound(sw, 2) To UBound(sw, 2)
tmp(a, j) = sw(i, j)
Next
a = a + 2
Next
.Cells(y1, xbk).Resize(UBound(tmp, 1), UBound(tmp, 2)) = tmp
.UsedRange.ColumnWidth = .StandardWidth
.UsedRange.Columns.AutoFit
Erase sw, tmp, gsrC, gsrV
End With
End Sub
Private Sub graffMake(ByVal mtx As String, vol(), curr())
Dim v As Variant
Dim gf As Object
Dim r As Range
Dim rr As Range
Dim i As Long
Dim j As Long
Dim k As Long
Dim gad() As Variant
Dim sr() As Variant
Dim nm() As Variant
Dim x As Long
Dim y As Long
gad = Array("B2:N11", "B12:N21")
y = Application.Range(gad(LBound(gad))).Rows.Count + _
Application.Range(gad(UBound(gad))).Rows.Count + 5
sr = Array(vol, curr)
nm = Array("電圧", "電流")
Worksheets(1).Copy before:=Worksheets(1)
With ActiveSheet
.UsedRange.Clear
For Each v In .Shapes
v.Delete
Next
For i = LBound(gad) To UBound(gad)
Set rr = .Range(gad(i))
.Range("B1").Offset(y, x).Resize(UBound(sr(i), 1), UBound(sr(i), 2)) = sr(i)
Set r = .Range("B1").Offset(y, x).Resize(UBound(sr(i), 1), UBound(sr(i), 2))
.ListObjects.Add xlSrcRange, r
For k = 1 To .ListObjects(i + 1).ListColumns.Count
.ListObjects(i + 1).ListColumns(k).Name = nm(i) & "_" & k
Next
Set gf = .Shapes.AddChart(xlLine, rr.Left, rr.Top, rr.Width, rr.Height)
With gf.chart
.HasTitle = True
.HasLegend = True
.ChartType = xlLine
.SetSourceData r
With .ChartTitle
.Text = mtx & nm(i)
.Font.Color = RGB(255, 0, 0)
.Font.Size = 20
End With
With .Legend
.IncludeInLayout = True
.Position = xlBottom
End With
With .SeriesCollection
For j = 1 To .Count
.Item(j).Format.Line.Weight = 2
Next
End With
End With
x = x + r.Columns.Count + 2
Next
.UsedRange.ColumnWidth = .StandardWidth
.UsedRange.Columns.AutoFit
End With
Erase gad, sr, nm
End Sub
(隠居Z) 2024/07/30(火) 09:43:45
ざっくりグラフの仕様をお伝えしますね。
説明がわかりにくいかもしれませんが・・
1,グラフは128個、縦並びでおいてあります。(A3セル〜M13セルの大きさ)
2,電流の1番目の横一行データと電圧の2番目の横一行データが1グラフにまとまってあります。
3,各グラフの範囲はこう表示されています。
=SERIES("電圧",,電圧_電流データ!$E$6:$AJ$6,1)
=SERIES("電流",,電圧_電流データ!$E$264:$AJ$264,2)
※タイトルはCh1
次のグラフ範囲は
=SERIES("電圧",,電圧_電流データ!$E$8:$AJ$8,1)
=SERIES("電流",,電圧_電流データ!$E$266:$AJ$266,2)
※一行飛ばしになってます。
わからなければ聞いていただきたく・・!
「20240718確認」
「20240720」
「20240726」
というファイルのいずれかを選択すると読み込み→コピペ のみ完成させていただければ・・グラフはとりあえず手作業でやれば・・・というところです。すみません。。
5.わわ、もう出来上がってるんですか?!お早い・・
さっそく回してまいります!!
元情報のアドレス、というのは範囲でしょうか?アドレスがあればVBAに出来る。なるほど、便利ですねVBA!
(ま) 2024/07/30(火) 09:46:12
はファイルですか。でしたら、拡張子とそのなかの何をコピペすればよいのでしょうか。
CH_グラフ シートの中身は概ねですが理解できたと。。。思ってるだけかもですが^^;
m(__)m
(隠居Z) 2024/07/30(火) 10:45:25
「20240628確認」
「20240718確認」
「20240720」
「20240726」 の中の
「左恒温槽_棚1_左パレット」の中の
「1」
「2」
「3」
「4」
「5」
のいずれかを選択すると中のCSVファイルがコピペされる。ですよね?
これを、
「20240628確認」
「20240718確認」
「20240720」
「20240726」のいずれかを選択すると中の中のCSVファイルをコピペされるようにするのは難しいでしょうか?
または、「左恒温槽_棚1_左パレット」を選択する、でもありがたいのですが。。
中の構成が変わると動かなくなったりするのであれば、今のままでも思った通りに動いているのでスルーで問題ありません!
グラフは理解いただけたようで。。安心しました^^
(ま) 2024/07/30(火) 11:00:32
1.左恒温槽_棚1_左パレット フォルダ以下全てのサブフォルダの全てのcsv
とかでしたら。。。可能かと
当初から気にはなっていたのですが日付等の取込間違いをご懸念ですか。
幸い、フォルダ名、もしくはファイル名には日付が使われているようなので
こちらを取得して比較するのは可能です
例えば 最初に 2024/07/20 〜 2024/07/31 のようなデーターを指定すれば
20240628確認を指定[クリック]するだけで。
もしくはその上の階層で固定のフォルダが有るのでしたら
コードに組み込めば日付指定のみでOKです。
その間の日をファイル名に持つcsvファイルを全て読み込むことが可能です。
2.グラフの件ですが
現在のコードで作成されている私が勝手に憶測と推測で作成した物は不必要で
ご説明を賜ったグラフ専用シートに128個 電圧電流の対になったグラフを
電圧_電流データ シートの全情報分作成すればOKとの理解で宜しいでしょう
か。。。読み込むたびに全て作り直してしまえば済む事ですよね。。(*^^*)v
128個も作ったこと無いので何ともいえませんが。。。←やってみりゃわかるだろうが。!
あ。。。はい、作りましょうね。。。m(__)m
(*^^*)///
(隠居Z) 2024/07/30(火) 12:57:55
1.日付で取得出来るんですね!
今のところは日付フォルダはこちらで作成、中の左恒温槽〜のフォルダから下は機械から出力されたものをそのまま日付ファイルに放り込んでいる状態ですので、日付指定・・あった方が便利かもしれないですね・・?
1〜5のどのフォルダを選択したかを忘れて重複させてしまいそうなため、左パレット中のすべてのサブファイル(CSV)をコピペしていただけると。。といったところです。
そもそもどの日付を出力したっけ?が起こってしまっては大問題ですし・・
2.そうですそうです!
グラフを作り直しても動きが遅くなったり、時間がとてもかかる(5分以上何もできない)でなければお願いしたく・・(グラフ範囲の修正するだけならお手軽なのかな?と考えておりました。お恥ずかしい・・)
また、隠居Zさまに作成いただいている(Sheet1(1)に反映される)グラフも、可能であれば129個目に挿入いただきたいです。
(ま) 2024/07/30(火) 13:20:24
わくわくしながらお待ちしております!
なにかありましたらすぐ返事できるよう、毎日覗くようにしておきますので。。(プレッシャーをかけてるわけではございませんので!)
よろしくお願いいたします。ペコリ(o_ _)o))
(ま) 2024/07/30(火) 13:42:32
早速、追伸 ^^;
1.日付で取得出来るんですね!
固定でコード内に指定出来るフォルダ名を教えて下さい
そこから下の階層を探せば必ず目的ファイルが全て見つかるフォルダ名です。
すみません
m(__)m
(隠居Z) 2024/07/30(火) 13:43:57
「接点接触確認」フォルダになります。
この下に日付フォルダ、左恒温槽〜フォルダ、1〜フォルダ、CSVファイルが入ります。
(ま) 2024/07/30(火) 13:47:48
あともう一点だけ。急ぎません
1.グラフの件ですが
>>2,電流の1番目の横一行データと電圧の2番目の横一行データが1グラフにまとまってあります。
3,各グラフの範囲はこう表示されています。
=SERIES("電圧",,電圧_電流データ!$E$6:$AJ$6,1)
=SERIES("電流",,電圧_電流データ!$E$264:$AJ$264,2)
※タイトルはCh1
次のグラフ範囲は
=SERIES("電圧",,電圧_電流データ!$E$8:$AJ$8,1)
=SERIES("電流",,電圧_電流データ!$E$266:$AJ$266,2)
※一行飛ばしになってます。
とのご説明ですと、[=SERIES関数の値から判断すると]
A.電流の1行目は無視するのでしょうか
B.電圧と電流の情報が同じ数でしたら最後のグラフは電圧だけになりますが
電流の方が情報は1件多い129件なのでしょうか
C.電流は263行目から開始ですと一行毎に空白を設置済みなので264行目、266行目は空白なのでは
ないでしょうか。
多分、私の勘違いかもしれません、ご説明賜れば幸甚です。
宜しくお願い致します。
(隠居Z) 2024/07/30(火) 14:58:08
B.電流、電圧ともに128件のはずです。。こちらでは128個グラフが完成しており、(おそらく)漏れはないと思うのですが・・・
C.先日隠居Zさまにいただいた書き込みファイルを流用しております。
電圧の一番下の行に空白、さらに電流との境目に空白を挿入しているため、認識ずれが起きたのかと思いますがいかがでしょうか。。?
『書き込みファイル』
|[A]|[B] |[C] |[D] |[E] |[F] |[G] |[H] |[I] |[J]
[1] | | | | | | | | | |
[2] | | | | |2024/7/18 | | | | |2024/7/19
[3] | | | | |確認 | | | | | 1
[4] | | | | |1回目 |2回目 |3回目 |4回目 |5回目 |1回目
[5] | | | | |電圧 | | | | |
[6] | | | | | 2.1099| | | | |
[7] | | | | | | | | | |
[8] | | | | | 2.3005| | | | |
[9] | | | | | | | | | |
[ ] | | | | | 2.2907| | | | |
[ ] | | | | | | | | | |
[ ] | | | | | | | | | |
[263]| | | | |電流 | | | | |
[264]| | | | | 0.009| | | | |
[265]| | | | | | | | | |
[266]| | | | | 0.0145| | | | |
(ま) 2024/07/30(火) 15:16:44
すみませんが、よろしくお願いいたします_(._.)_
(ま) 2024/07/30(火) 15:37:07
何日 × 5(もしくは6)
要するに、最大使用列の数、若しくは、最大読込CSVファイル数 か 日数
です。m(__)m
(隠居Z) 2024/07/30(火) 23:10:24
最大読込CSVファイル数なら説明出来ますかね?
50あれば足りると思います。
(1日ずつ読み込めばいいので)
(ま) 2024/08/01(木) 10:14:26
(隠居Z) 2024/08/01(木) 15:16:43
今から、128個グラフ作ります。今夜は多分間に合いません。
お許しを。。。<< _ _ >>
129個目は謹んでご辞退申し上げます...(*'▽')
週末はお休みの事と存じますので、月曜にはアップ出来る予定です^^;
決して忘却はいたしておりません。でわでわ。また
(隠居Z) 2024/08/02(金) 14:46:18
>>3行目に1〜、3行目のフォルダ数は日付によって違います。
とのご説明は承っておりますが。私が良く理解出来ておりません
もし、手作業で入力されるなら、その手順を箇条書きで教えて戴ければ
対応出来るかもしれません
最初の日付の下は 確認
その次の日付の下は 1
との例題です。m(__)m
(隠居Z) 2024/08/03(土) 17:49:16
程度の読込、更新でしたら1秒ちょいくらいです。365日分指定しても
約40秒くらいです。5分も掛らないと。。。思いますが環境にもよりますので
何とも。。。申し上げられません。一年分だとグラフが塗りつぶしみたいになり
判読できません(笑;)^^;
バックアップ。。。必須です。
でわ
m(__)m
Option Explicit
Sub OneInstanceMain()
Const ps As String = "D:\A_test202408excel\接点接触確認"
Dim fary() As Variant
Dim w() As Variant
Dim seAry As Variant
Dim wsh As Object
Dim nt As Double
seAry = AcceptYmdGeter
If Not IsArray(seAry) Then
End
End If
nt = Timer
SelectRead_Files seAry, ps, fary
DataFile_Read fary, w
Ws_Write w
If seAry(2) = 0 Then Chart128Graph_ResetSorcData
If seAry(2) = 1 Then Chart128Graph_Make
Erase fary, w, seAry
MsgBox "終了" & Format(Int(Timer - nt) / 24 / 60 / 60, "hh : mm : ss") & _
Format((Timer - nt) - Int(Timer - nt), ".000") & " 秒"
End Sub
Private Function AcceptYmdGeter() As Variant
Dim sYmd As Variant
Dim eYmd As Variant
Dim GrFlg As String
Dim xflg As Boolean
Dim yflg As Boolean
Dim zflg As Boolean
Dim eXam As Variant
Dim cymd As Variant
Dim re As Variant
Dim dExflg As Boolean
With Worksheets("電圧_電流データ")
If IsDate(.Range("E2").Value) Then
dExflg = True
cymd = .Rows(2).SpecialCells(2).Areas(.Rows(2).SpecialCells(2).Areas.Count)
End If
End With
re = Array(False, False, False)
If dExflg Then
eXam = "現在の最新情報 = " & Year(cymd) & Format(Month(cymd), "00") & Format(Day(cymd), "00")
Else
eXam = "取得する情報が有りません " & Year(Date) & Format(Month(Date), "00") & Format(1, "00")
End If
Rem 開始年月日
Do
sYmd = Application.InputBox(eXam, "開始年月日", , , , , , 1)
If sYmd = False Then
xflg = True
Exit Do
Else
re(0) = AcceptYmdGeter_InYmdDataChecker(sYmd)
If IsDate(re(0)) Then
If dExflg Then
If re(0) = cymd + 1 Then Exit Do
Else
Exit Do
End If
End If
End If
Loop
eXam = re(0)
Rem 終了年月日
Do
If xflg Then Exit Do
eYmd = Application.InputBox("入力済み開始年月日 = " & _
Format(Year(eXam), "0000") & Format(Month(eXam), "00") & _
Format(Day(eXam), "00"), "終了年月日を入力", , , , , , 1)
If eYmd = False Then
yflg = True
Exit Do
Else
re(1) = AcceptYmdGeter_InYmdDataChecker(eYmd)
If IsDate(re(1)) Then
If re(0) <= re(1) Then Exit Do
End If
End If
Loop
Rem グラフ更新フラグ キャンセルとゼロが区別できない為文字列型で受ける。
Do
If xflg Or yflg Then Exit Do
GrFlg = Application.InputBox("例 更新 = 1 更新しない = 0 " & 0, "グラフ更新", , , , , , 1)
If GrFlg = "False" Then
zflg = True
Exit Do
Else
If Len(GrFlg) = 1 And CLng(GrFlg) > -1 And CLng(GrFlg) < 2 Then
re(2) = CLng(GrFlg)
Exit Do
End If
End If
Loop
If xflg Or yflg Or zflg Then
AcceptYmdGeter = False
Erase re
Exit Function
End If
AcceptYmdGeter = re
Erase re
End Function
Private Function AcceptYmdGeter_InYmdDataChecker(rEv) As Variant
Dim yA As String
Dim mB As String
Dim dC As String
Dim d As Long
Dim aFlg As Boolean
Dim bFlg As Boolean
Dim cFlg As Boolean
AcceptYmdGeter_InYmdDataChecker = False
If Len(rEv) = 8 Then
yA = Left(CStr(rEv), 4)
mB = Mid(Format(rEv, "00"), 5, 2)
dC = Right(Format(rEv, "00"), 2)
If CLng(yA) >= 1900 And CLng(yA) <= Year(Date) And Len(yA) = 4 Then aFlg = True
If CLng(mB) > 0 And CLng(mB) < 13 And Len(mB) = 2 Then bFlg = True
d = Day(DateSerial(yA, mB + 1, 1) - 1)
If CLng(dC) > 0 And CLng(dC) <= d And Len(dC) = 2 Then cFlg = True
If aFlg And bFlg And cFlg Then
AcceptYmdGeter_InYmdDataChecker = DateSerial(yA, mB, dC)
End If
End If
End Function
Private Sub SelectRead_Files(seymd, ps, fary())
Dim app As Object
Dim wsh As Object
Dim fNm As Variant
Dim kNm As Variant
Dim fYmd As Variant
Dim tmp As Variant
Dim psFull As Variant
Dim i As Long
Dim j As Long
Dim idx() As Variant
Dim n As Long
Set wsh = CreateObject("wscript.shell")
Set app = Application
fNm = Split(wsh.exec("cmd /c dir " & ps & "\*.csv" & "/b/s ").stdout.readall, vbCrLf)
DoEvents
If UBound(fNm) <> -1 Then
For i = LBound(fNm) To UBound(fNm)
Rem Curr_FPGA1_1_20240718_094212.csv
Rem Volt_FPGA1_1_20240718_094207.csv
If fNm(i) Like "*Curr_FPGA1_*.csv" Or fNm(i) Like "*Volt_FPGA1_*.csv" Then
tmp = Split(fNm(i), "\")(UBound(Split(fNm(i), "\")))
kNm = Split(tmp, "_")(0)
fYmd = Split(tmp, "_")(3)
fYmd = DateSerial(CLng(Left(fYmd, 4)), CLng(Mid(fYmd, 5, 2)), CLng(Right(fYmd, 2)))
psFull = Split(fNm(i), "\")(UBound(Split(fNm(i), "\")) - 1)
If fYmd >= seymd(0) And fYmd <= seymd(1) Then
ReDim Preserve idx(n)
idx(n) = Array(fYmd, kNm, fNm(i), psFull)
n = n + 1
End If
End If
If i Mod 32 = 0 Then DoEvents
Next
End If
If n > 0 Then
fary = idx
Else
MsgBox "CSVファイルが存在しません。終了します"
End
End If
Erase idx, fNm
End Sub
Private Sub DataFile_Read(fary(), w())
Dim dCnt As Long
Dim n As Long
Dim buf As Variant
Dim tmp As Variant
Dim ymdt As String
Dim dkind As Long
Dim i As Long
Dim y As Long
Rem 2024/7/1 Volt フルパス名\Volt_FPGA1_1_20240701_081550.csv
Rem 2024/7/1 Volt フルパス名\Volt_FPGA1_1_20240701_081900.csv
For i = LBound(fary) To UBound(fary)
If fary(i)(1) = "Volt" Then dkind = 0
If fary(i)(1) = "Curr" Then dkind = 1
Open fary(i)(2) For Input As #1
Do Until EOF(1)
If i > 0 And i Mod 32 = 0 Then DoEvents
Line Input #1, buf
tmp = Split(buf, ",")
dCnt = dCnt + 1
If dCnt = 1 Then ymdt = tmp(1)
If dCnt = 4 Then
Select Case dkind
Case 0
If tmp(2) <> "電圧" Then MsgBox "情報エラー" & Chr(13) & fary(i)(2)
Case 1
If tmp(2) <> "電流" Then MsgBox "情報エラー" & Chr(13) & fary(i)(2)
End Select
End If
If dCnt > 4 Then
ReDim Preserve w(y)
w(y) = Array(CLng(DateValue(Split(ymdt, "_")(0))), _
CDbl(TimeValue(Split(ymdt, "_")(1))), dkind, tmp(2), fary(i)(3))
y = y + 1
End If
Loop
Close
dCnt = 0
Next
Erase tmp
End Sub
Private Sub Ws_Write(w)
Dim sw() As Variant
Dim tmp() As Variant
Dim i As Long
Dim j As Long
Dim k As Long
Dim n As Long
Dim vy As Long
Dim cy As Long
Dim vx As Long
Dim cx As Long
Dim app As Object
Dim vNumTime As Long
Dim cNumTime As Long
Set app = Application
ReDim Preserve w(UBound(w) + 1)
w(UBound(w)) = Array(DateSerial(9999, 12, 31), "-0.1", "9999", "", "")
sw = app.SortBy(w, app.Index(w, 0, 1), 1, app.Index(w, 0, 3), 1, app.Index(w, 0, 2), 1)
Rem -----------------------------------------------------------------------
Rem With Worksheets("Sheet2")
Rem .UsedRange.Clear
Rem .Cells(1).Resize(UBound(sw, 1), UBound(sw, 2)) = sw
Rem End With
Rem -----------------------------------------------------------------------
vy = 6
cy = 264
With Worksheets("電圧_電流データ")
vx = .Cells(vy, .Columns.Count).End(xlToLeft).Column + 1
vx = IIf(vx < 5, 5, vx)
.Cells(2, vx) = sw(1, 1)
.Cells(3, vx) = sw(1, 5)
For i = LBound(sw, 1) To UBound(sw, 1) - 1
ReDim Preserve tmp(n)
tmp(n) = sw(i, 4)
n = n + 2
Rem 計測時間 ブレーク処理
If sw(i, 2) <> sw(i + 1, 2) Then
If sw(i, 3) = 0 Then
vNumTime = vNumTime + 1
vx = .Cells(vy, .Columns.Count).End(xlToLeft).Column + 1
vx = IIf(vx < 5, 5, vx)
If vNumTime = 1 Then .Cells(vy - 1, vx) = "電圧"
.Cells(vy - 2, vx) = vNumTime
If UBound(tmp) <> 254 Then MsgBox "Stick Out"
.Cells(vy, vx).Resize(UBound(tmp) + 1, 1) = app.Transpose(tmp)
ElseIf sw(i, 3) = 1 Then
cNumTime = cNumTime + 1
cx = .Cells(cy, .Columns.Count).End(xlToLeft).Column + 1
cx = IIf(cx < 5, 5, cx)
If cNumTime = 1 Then .Cells(cy - 1, cx) = "電流"
.Cells(vy - 2, vx) = cNumTime
If UBound(tmp) <> 254 Then MsgBox "Stick Out"
.Cells(cy, cx).Resize(UBound(tmp) + 1, 1) = app.Transpose(tmp)
End If
Erase tmp
n = 0
End If
Rem 計測日 ブレーク処理
If (sw(i, 1) <> sw(i + 1, 1) And i + 1 < UBound(sw, 1)) Then
.Cells(2, vx + 1) = sw(i + 1, 1)
.Cells(3, vx + 1) = sw(i + 1, 5)
vNumTime = 0
cNumTime = 0
End If
If i Mod 64 = 0 Then DoEvents
Next
Intersect(.UsedRange, .Rows(2)).NumberFormatLocal = "yyyy/mm/dd"
.UsedRange.ColumnWidth = .StandardWidth
.UsedRange.Columns.AutoFit
End With
Erase sw, tmp
End Sub
Private Sub Chart128Graph_ResetSorcData()
Dim r As Range
Dim i As Long
Dim j As Long
Dim vsr As Long
Dim csr As Long
Dim sc As Long
Dim ec As Long
Dim gf As Object
Dim vWs As Worksheet
Set vWs = Worksheets("電圧_電流データ")
If vWs.Range("E2").Value = "" Then Exit Sub
Rem 電圧開始行
vsr = 6
Rem 電流開始行
csr = 264
Rem 情報開始列
sc = 5
Rem 情報最終列
ec = vWs.Cells(vsr, vWs.Columns.Count).End(xlToLeft).Column
With Worksheets("CH_グラフ")
If .ChartObjects.Count = 128 Then
Do
With vWs
Set r = Union(.Range(.Cells(vsr, sc), .Cells(vsr, ec)), _
.Range(.Cells(csr, sc), .Cells(csr, ec)))
End With
i = i + 1
With .ChartObjects(i).chart
.SetSourceData r
With .SeriesCollection
For j = 1 To .Count
Select Case j
Case 1
.Item(j).Name = "電圧"
Case 2
.Item(j).Name = "電流"
End Select
.Item(j).Format.Line.Weight = 2
Next
End With
End With
vsr = vsr + 2
csr = csr + 2
If vsr Mod 8 = 0 Then DoEvents
If vsr > (128 * 2) + 6 - 1 Then Exit Do
Loop
End If
End With
End Sub
Private Sub Chart128Graph_Make()
Dim r As Range
Dim xvr As Range
Dim i As Long
Dim j As Long
Dim vsr As Long
Dim csr As Long
Dim sc As Long
Dim ec As Long
Dim gr As Range
Dim gf As Object
Dim vWs As Worksheet
Set vWs = Worksheets("電圧_電流データ")
If vWs.Range("E2").Value = "" Then Exit Sub
vsr = 6
csr = 264
sc = 5
ec = vWs.Cells(vsr, vWs.Columns.Count).End(xlToLeft).Column
Set xvr = vWs.Range(vWs.Cells(vsr - 2, sc), vWs.Cells(vsr - 2, ec))
All_Graph_Delete
With Worksheets("CH_グラフ")
If .ChartObjects.Count < 1 Then
Set gr = .Range("A3:M13")
Do
i = i + 1
With vWs
Set r = Union(.Range(.Cells(vsr, sc), .Cells(vsr, ec)), _
.Range(.Cells(csr, sc), .Cells(csr, ec)))
End With
Set gf = .Shapes.AddChart(xlLine, gr.Left, gr.Top, gr.Width, gr.Height)
gf.Name = "Volt_Curr Chart-" & Format(i, "000")
With gf.chart
.HasTitle = True
.HasLegend = True
.ChartType = xlLine
.SetSourceData r
With .ChartTitle
.Text = "Ch" & Format(i, "000")
.Font.Color = RGB(255, 0, 0)
.Font.Size = 20
End With
With .Legend
.IncludeInLayout = True
.Position = xlBottom
End With
With .SeriesCollection
For j = 1 To .Count
Select Case j
Case 1
.Item(j).Name = "電圧"
Case 2
.Item(j).Name = "電流"
End Select
.Item(j).Format.Line.Weight = 2
Next
.Item(1).XValues = xvr
End With
End With
vsr = vsr + 2
csr = csr + 2
If vsr > (128 * 2) + 6 - 1 Then Exit Do
Set gr = gr.Offset(11).Resize(11, 13)
If i Mod 32 = 0 Then DoEvents
Loop
End If
End With
End Sub
Private Sub All_Graph_Delete()
Dim i As Long
With Worksheets("CH_グラフ")
If .ChartObjects.Count > 0 Then
For i = .ChartObjects.Count To 1 Step -1
If i Mod 32 = 0 Then DoEvents
.ChartObjects(i).Delete
Next
End If
End With
End Sub
(隠居Z) 2024/08/04(日) 15:27:34
土日明けで確認しに来たら完成しているじゃないですか・・!(感動)
ありがとうございます!
さっそくなのですが、土曜にいただいていた質問のお返事と、
今回マクロを回してみてわからなかった点を質問させてください。
>>3行目に1〜、3行目のフォルダ数は日付によって違います。
とのご説明は承っておりますが。私が良く理解出来ておりません
もし、手作業で入力されるなら、その手順を箇条書きで教えて戴ければ
対応出来るかもしれません
最初の日付の下は 確認
その次の日付の下は 1
との例題です。m(__)m
→作成いただいた際に、1〜5(6)までの数字が入るようにしてくださってましたよね?
まったく問題なかった(むしろこれがほしかった!)ので、別で対応していただく必要はございません。
【質問】
1.マクロスタートした際に、開始年月日が指定が出来るメッセージボックス?が出て、ここに20240718と入力しても何も起きないのですが。。。
なにか手順を間違えてしまっているのでしょうか・・?
2.今回作っていただいたマクロは、左恒温槽_棚1_左パレット のみを開いて書き込みするものですが、日付フォルダに入っているすべてのCSVファイルを書き込みする、となると
現在のマクロのどのあたりを修正すれば出来るでしょうか?(最初から書き直さないといけない、であればスルーしてください)
(ま) 2024/08/05(月) 08:49:03
ご質問1.
A.電圧_電流データ シートの2行目の最後列の日付を調べています。その日付の翌日
を指定する必要がございます。
B.日付以外の何かが存在するならば対応できていません。ご確認後詳細を教えていた
くと、対応いたします。
C.何も情報が無い空の状態ですと、19000101 〜 99991231 の間で入力可能です
D.日付と認識出来ない場合は再度入力画面に戻ります。例 369852、20240230
ご質問2.
Sub OneInstanceMain() 冒頭の定数
Const ps As String = "D:\A_test202408excel\接点接触確認"
これをドライブ名からのフォルダパス指定で変えて下さい
フォルダは何処でも指定可能です、ドライブだけでもOKですが
検索にお時間が掛るだけです。
エクスプローラでフォルダを選択して↑の行のパス名を青色反転させそれをコピペ
すれば簡単ですよ。^^;
でわ m(__)m
お試は。。。新規ブックがよろしいようで。。。<< _ _ >> ↑
(隠居Z) 2024/08/05(月) 09:28:34
・指定する年月日は、最終列の日付より後の日付を指定する
(これは間違いないですよね?)
接点接触確認というフォルダの中(マクロ入りエクセルも入っています)に、20240719というフォルダを作成しました。
20240719フォルダの中には、24個のフォルダが入っています。
各フォルダは「右恒温槽_棚1_右パレット」から「右恒温槽_棚6_左パレット」、「左恒温槽_棚1_右パレット」から「左恒温槽_棚6_左パレット」です。
これを開くと「1〜5」のフォルダがあり、中に[Curr〜.csv]5個、[Volt〜.csv]5個入っています。
いただいたマクロを回し、指定の日付を20240719としました。
最終日が20240719に変わっただけで、書き込みもグラフも変化なしでした。。
これはなにが間違っているのでしょうか・・?
質問2につきまして、理解いたしました。
こちら、フォルダパス指定を設定し、回したあとまたわからなければ質問させてください!
(ま) 2024/08/05(月) 10:38:31
w。。。いえ
後の日ではなく。。。翌日限定です。
[私があほだったかも^^; お休みで情報が無い日も
あるのですよね。でも情報の有無にかかわらず翌日を指定して戴くと情報が無い日は何も
しない[出来ない(*^^*)]だけなので]結果情報取込漏れに防止にはなるかと。。。←言い訳^^;
この縛りはどうとでも出来ますのでご希望をお知らせください。m(__)m
(隠居Z) 2024/08/05(月) 11:16:30
情報がない場合、またさらに翌日の日付を入力すると書き込みされるということですよね?
それは理解しました。ありがとうございます!
今回なぜなにも起こらなかったのか、については・・どうでしょうか?
どう間違っているのかがわからず。。(デバックが出るわけでもないので・・)
(ま) 2024/08/05(月) 11:28:38
>>今回なぜなにも起こらなかったのか、については・・どうでしょうか?
ふしぎだなぁ〜。。。とくらいしか。。。( ̄▽ ̄;)
m(__)m
入力部分の説明
0.実際のフォルダ、ファイルの存在に関係無くです
有れば取得しますし、無ければ何もしません
A. 電圧_電流データ シート の2行目に日付を表すシリアル値が有る場合「書込み情報有」
1.入力ボックスの上欄に 現在の最新情報 = yyyymmdd と表示されますのでその翌日を
指定する様にして下さい
B. 電圧_電流データ シート の2行目に日付を表すシリアル値が無い場合「書込み情報無し」
1.入力ボックスの上欄に 取得する情報が有りません と表示されますので任意の年月日
を指定する様にして下さい。
19000101 〜 99991231 の間です。
1.動作の概略
1.指定された期間の数列をファイル名に含み、ファイル名の先頭がCurr、Voltをむ全ての実在する
csvファイル名を取得し、そのファイルのフルパスを使いファイルを読込みます。
読み込んだファイルの1行目、2列目の年月日_時分秒をキーとしてファイルの回数別け
左右の貼り付け場所の指定をしています。
電圧、電流の上下分けはファイル名のCurr,Voltで種類分けしています
2.必ず電圧と電流のファイルは同数有ることを前提としています
確認とかエラー処理には対応しておりません。^^;
m(__)m
(隠居Z) 2024/08/05(月) 12:50:47
グラフは数値のゼロかいちをお願いします。両方指定してみてグラフの違いもご確認ください
修正があれば、ご連絡をお願いいたします。
(隠居Z) 2024/08/05(月) 13:08:37
無事?翌日フォルダが書き込みされたのでご報告です。
なぜ動かなかったのか
→開始年月日と終了年月日を同一ととらえていたため、ボックスが消えない〜なにも起こらない〜となっていたからでした・・お恥ずかしい・・
結果報告と、ご質問です。
1.前回までのマクロでは、フォルダ「1」を選択すると中のCSVファイルを書き込む際、4行目に数字「1〜5」が書き込まれていました。
今回のマクロを回した際は、4行目の数字が連番で、最大値が25になっておりました。
これをフォルダごとに、いくつあるかをカウントすることは可能でしょうか?
例)「1」「2」「3」「4」「5」すべてのフォルダに5個ずつ入っている場合
下記のようにしたい
|[AK] |[AL] |[AM] |[AN] |[AO] |[AP] |
[1] | | | | | | |
[2] | | | | | | |
[3] | | | | | | |
[4] | 1 | 2 | 3 | 4 | 5 | 1 |
[5] | | | | | | |
2.グラフの指定やってみました。
0を選ぶと、書式?等が作成したままの状態で列が更新されておりました。
こちらの方が好みでしたので、利用させていただこうと思います!
3.上記で、フォルダパス指定を設定し、日付フォルダ内すべてのCSVファイルを読み込みたい。と質問させていただいておりましたが、回してみたところ、「Stick Out」が出てしまいました。
フォルダパス指定が間違っている、という認識で間違いないでしょうか?
(ま) 2024/08/05(月) 14:15:01
この場合はどのフォルダに入っているかは関係有りません
電圧若しくは、電流のファイル、若しくは両方のファイルの計測日の値、 年月日_時分秒 が
全く同じファイルが5個あるとそうなります。
解決方法、情報を一意[ユニーク]同じものは無い状態にする
1.時分秒 + 追加キー[例 計測ごとにさらに枝番をふる、ミリ秒まで記載する]
2.長期間保存用バックアップファイルがフォルダを別にして[同名、同情報ファイルが複数]
が有るなら、年月日とフォルダ選択併用する
3.最初のフォルダ選択に戻す。
とかになります。
グラフの件は了解致しました。ご希望の変更内容修正時に合わせて修正致します。
(隠居Z) 2024/08/05(月) 14:46:45
まず、別のデータの日付をさわって、何度か回してみたいと思います。
お手数をおかけし倒してます。
よろしくお願いいたします(_ _)
(ま) 2024/08/05(月) 14:55:59
とりあえず
ご連絡をお待ちいたしますです。(*^^*)
でわ
m(__)m
(隠居Z) 2024/08/05(月) 14:59:15
なるほど!
現在、実情報が入ってきていないため、過去のデータを編集して挑戦しているのですが・・
エラーになったためご質問です。
日付を編集、20240719にした状態でマクロを回してみましたが
CSVファイルが存在しません。というメッセージが出ました。
このエラーは何によるものでしょうか??
また、あさって以降にお返事させていただこうと思います!
(ま) 2024/08/05(月) 15:51:57
はい〜。了解で御座います。お待ちいたしておりますです。(*^ ^*)///
お仕事、お疲れさまでした。m(__)m
>>CSVファイルが存在しません。というメッセージが出ました。
ご指定のフォルダ階層以下にはどのフォルダにも読込対象csvファイルが
有りませんと、その様に表示されます。
<< _ _ >>
(隠居Z) 2024/08/05(月) 16:09:53
CSVデータであれば(電流、電圧のデータ)読み込まれると思っていたのですが。。
何度確認してもCSVファイルが存在しません。とメッセージが出るんです。。
フォルダを確認しましたが、中身はCSVファイルでしたし、なぜ読み込んでくれないのか見当がつきません・・
お知恵をお貸しいただきたく・・!
(ま) 2024/08/07(水) 09:03:42
Option Explicit
Sub DataConverterAndChartSRCDataReseterMain()
Const ps As String = "D:\A_test202408excel\接点接触確認"
Dim fary() As Variant
Dim w() As Variant
Dim seAry As Variant
Dim wsh As Object
Dim nt As Double
Dim dPFlg
If ps = "" Then Exit Sub
If Dir(ps, vbDirectory) = "" Then
MsgBox "フォルダが有りません"
End
End If
seAry = AcceptYmdGeter
If Not IsArray(seAry) Then End
nt = Timer
SelectRead_Files seAry, ps, fary
DataFile_Read fary, w, dPFlg
If dPFlg Then End
Ws_Write w
Chart128Graph_ResetSorcData
Erase fary, w, seAry
MsgBox "終了" & Format(Int(Timer - nt) / 24 / 60 / 60, "hh : mm : ss") & _
Format((Timer - nt) - Int(Timer - nt), ".000") & " 秒"
End Sub
Private Function AcceptYmdGeter() As Variant
Dim sYmd As Variant
Dim eYmd As Variant
Dim xflg As Boolean
Dim yflg As Boolean
Dim eXam As Variant
Dim cymd As Variant
Dim re As Variant
Dim dExflg As Boolean
With Worksheets("電圧_電流データ")
If IsDate(.Range("E2").Value) Then
dExflg = True
cymd = .Rows(2).SpecialCells(2).Areas(.Rows(2).SpecialCells(2).Areas.Count)
End If
End With
re = Array(False, False)
If dExflg Then
eXam = "現在の最新情報 = " & Year(cymd) & Format(Month(cymd), "00") & Format(Day(cymd), "00")
Else
eXam = "取得する情報が有りません " & Year(Date) & Format(Month(Date), "00") & Format(1, "00")
End If
Rem 開始年月日
Do
sYmd = Application.InputBox(eXam, "開始年月日", , , , , , 1)
If sYmd = False Then
xflg = True
Exit Do
Else
re(0) = AcceptYmdGeter_InYmdDataChecker(sYmd)
If IsDate(re(0)) Then
If dExflg Then
If re(0) = cymd + 1 Then Exit Do
Else
Exit Do
End If
End If
End If
Loop
eXam = re(0)
Rem 終了年月日
Do
If xflg Then Exit Do
eYmd = Application.InputBox("入力済み開始年月日 = " & _
Format(Year(eXam), "0000") & Format(Month(eXam), "00") & _
Format(Day(eXam), "00"), "終了年月日を入力", , , , , , 1)
If eYmd = False Then
yflg = True
Exit Do
Else
re(1) = AcceptYmdGeter_InYmdDataChecker(eYmd)
If IsDate(re(1)) Then
If re(0) <= re(1) Then Exit Do
End If
End If
Loop
If xflg Or yflg Then
AcceptYmdGeter = False
Erase re
Exit Function
End If
AcceptYmdGeter = re
Erase re
End Function
Private Function AcceptYmdGeter_InYmdDataChecker(rEv) As Variant
Dim yA As String
Dim mB As String
Dim dC As String
Dim d As Long
Dim aFlg As Boolean
Dim bFlg As Boolean
Dim cFlg As Boolean
AcceptYmdGeter_InYmdDataChecker = False
If Len(rEv) = 8 Then
yA = Left(CStr(rEv), 4)
mB = Mid(Format(rEv, "00"), 5, 2)
dC = Right(Format(rEv, "00"), 2)
If CLng(yA) >= 1900 And CLng(yA) <= Year(Date) And Len(yA) = 4 Then aFlg = True
If CLng(mB) > 0 And CLng(mB) < 13 And Len(mB) = 2 Then bFlg = True
d = Day(DateSerial(yA, mB + 1, 1) - 1)
If CLng(dC) > 0 And CLng(dC) <= d And Len(dC) = 2 Then cFlg = True
If aFlg And bFlg And cFlg Then
AcceptYmdGeter_InYmdDataChecker = DateSerial(yA, mB, dC)
End If
End If
End Function
Private Sub SelectRead_Files(seymd, ps, fary())
Dim app As Object
Dim wsh As Object
Dim fNm As Variant
Dim kNm As Variant
Dim fYmd As Variant
Dim tmp As Variant
Dim psFull As Variant
Dim i As Long
Dim j As Long
Dim idx() As Variant
Dim n As Long
Set wsh = CreateObject("wscript.shell")
Set app = Application
fNm = Split(wsh.exec("cmd /c dir " & ps & "\*.csv" & "/b/s ").stdout.readall, vbCrLf)
DoEvents
If UBound(fNm) <> -1 Then
For i = LBound(fNm) To UBound(fNm)
Rem Curr_FPGA1_1_20240718_094212.csv
Rem Volt_FPGA1_1_20240718_094207.csv
If fNm(i) Like "*Curr_FPGA1_*.csv" Or fNm(i) Like "*Volt_FPGA1_*.csv" Then
tmp = Split(fNm(i), "\")(UBound(Split(fNm(i), "\")))
kNm = Split(tmp, "_")(0)
fYmd = Split(tmp, "_")(3)
fYmd = DateSerial(CLng(Left(fYmd, 4)), CLng(Mid(fYmd, 5, 2)), CLng(Right(fYmd, 2)))
psFull = Split(fNm(i), "\")(UBound(Split(fNm(i), "\")) - 1)
If fYmd >= seymd(0) And fYmd <= seymd(1) Then
ReDim Preserve idx(n)
idx(n) = Array(fYmd, kNm, fNm(i), psFull)
n = n + 1
End If
End If
If i Mod 32 = 0 Then DoEvents
Next
End If
If n > 0 Then
fary = idx
Else
MsgBox "CSVファイルが存在しません。終了します"
End
End If
Erase idx, fNm
End Sub
Private Sub DataFile_Read(fary(), w(), dPFlg)
Dim dCnt As Long
Dim n As Long
Dim buf As Variant
Dim tmp As Variant
Dim ymdt As String
Dim dkind As Long
Dim i As Long
Dim y As Long
Dim VoltCnt As Long
Dim CurrCnt As Long
Dim cDic As Object
Dim cKey() As Variant
Set cDic = CreateObject("Scripting.Dictionary")
Rem 2024/7/1 Volt フルパス名\Volt_FPGA1_1_20240701_081550.csv
Rem 2024/7/1 Volt フルパス名\Volt_FPGA1_1_20240701_081900.csv
For i = LBound(fary) To UBound(fary)
If fary(i)(1) = "Volt" Then
dkind = 0
VoltCnt = VoltCnt + 1
End If
If fary(i)(1) = "Curr" Then
dkind = 1
CurrCnt = CurrCnt + 1
End If
Open fary(i)(2) For Input As #1
Do Until EOF(1)
If i > 0 And i Mod 32 = 0 Then DoEvents
Line Input #1, buf
tmp = Split(buf, ",")
dCnt = dCnt + 1
If dCnt = 1 Then ymdt = tmp(1)
If dCnt = 4 Then
Select Case dkind
Case 0
If tmp(2) <> "電圧" Then MsgBox "情報エラー" & Chr(13) & fary(i)(2)
Case 1
If tmp(2) <> "電流" Then MsgBox "情報エラー" & Chr(13) & fary(i)(2)
End Select
End If
If dCnt > 4 Then
ReDim Preserve w(y)
w(y) = Array(CLng(DateValue(Split(ymdt, "_")(0))), _
CDbl(TimeValue(Split(ymdt, "_")(1))), dkind, tmp(2), fary(i)(3))
y = y + 1
End If
Loop
If Not cDic.Exists(ymdt & Chr(30) & dkind) Then
cDic(ymdt & Chr(30) & dkind) = Empty
Else
ReDim Preserve cKey(n)
cKey(n) = fary(i)(2)
n = n + 1
End If
Close
dCnt = 0
Next
If n > 0 Or (VoltCnt <> CurrCnt) Then
dPFlg = True
MsgBox "重複ファイルが " & n & " 件存在するか、電圧電流の対応が不備です。確認後再起動してください" & _
Chr(13) & "Volt = " & VoltCnt & Chr(13) & "Curr = " & CurrCnt
End If
cDic.RemoveAll
Erase tmp, cKey
End Sub
Private Sub Ws_Write(w)
Dim sw() As Variant
Dim tmp() As Variant
Dim i As Long
Dim n As Long
Dim vy As Long
Dim cy As Long
Dim vx As Long
Dim cx As Long
Dim app As Object
Dim vNumTime As Long
Dim cNumTime As Long
Set app = Application
ReDim Preserve w(UBound(w) + 1)
w(UBound(w)) = Array(DateSerial(9999, 12, 31), "-0.1", "9999", "", "")
sw = app.SortBy(w, app.Index(w, 0, 1), 1, app.Index(w, 0, 3), 1, app.Index(w, 0, 2), 1)
Rem -----------------------------------------------------------------------
Rem With Worksheets("Sheet2")
Rem .UsedRange.Clear
Rem .Cells(1).Resize(UBound(sw, 1), UBound(sw, 2)) = sw
Rem End With
Rem -----------------------------------------------------------------------
vy = 6
cy = 264
With Worksheets("電圧_電流データ")
vx = .Cells(vy, .Columns.Count).End(xlToLeft).Column + 1
vx = IIf(vx < 5, 5, vx)
.Cells(2, vx) = sw(1, 1)
Rem .Cells(3, vx) = sw(1, 5)
For i = LBound(sw, 1) To UBound(sw, 1) - 1
ReDim Preserve tmp(n)
tmp(n) = sw(i, 4)
n = n + 2
Rem 計測時間 ブレーク処理
If sw(i, 2) <> sw(i + 1, 2) Then
If sw(i, 3) = 0 Then
vNumTime = vNumTime + 1
vx = .Cells(vy, .Columns.Count).End(xlToLeft).Column + 1
vx = IIf(vx < 5, 5, vx)
If vNumTime = 1 Then .Cells(vy - 1, vx) = "電圧"
.Cells(vy - 2, vx) = vNumTime
If UBound(tmp) <> 254 Then MsgBox "Stick Out"
.Cells(vy, vx).Resize(UBound(tmp) + 1, 1) = app.Transpose(tmp)
ElseIf sw(i, 3) = 1 Then
cNumTime = cNumTime + 1
cx = .Cells(cy, .Columns.Count).End(xlToLeft).Column + 1
cx = IIf(cx < 5, 5, cx)
If cNumTime = 1 Then .Cells(cy - 1, cx) = "電流"
.Cells(vy - 2, vx) = cNumTime
If UBound(tmp) <> 254 Then MsgBox "Stick Out"
.Cells(cy, cx).Resize(UBound(tmp) + 1, 1) = app.Transpose(tmp)
End If
Erase tmp
n = 0
End If
Rem 計測日 ブレーク処理
If (sw(i, 1) <> sw(i + 1, 1) And i + 1 < UBound(sw, 1)) Then
.Cells(2, vx + 1) = sw(i + 1, 1)
Rem .Cells(3, vx + 1) = sw(i + 1, 5)
vNumTime = 0
cNumTime = 0
End If
If i Mod 64 = 0 Then DoEvents
Next
Intersect(.UsedRange, .Rows(2)).NumberFormatLocal = "yyyy/mm/dd"
.UsedRange.ColumnWidth = .StandardWidth
.UsedRange.Columns.AutoFit
End With
Erase sw, tmp
End Sub
Private Sub Chart128Graph_ResetSorcData()
Dim r As Range
Dim i As Long
Dim j As Long
Dim vsr As Long
Dim csr As Long
Dim sc As Long
Dim ec As Long
Dim gf As Object
Dim vWs As Worksheet
Set vWs = Worksheets("電圧_電流データ")
If vWs.Range("E2").Value = "" Then Exit Sub
Rem 電圧開始行
vsr = 6
Rem 電流開始行
csr = 264
Rem 情報開始列
sc = 5
Rem 情報最終列
ec = vWs.Cells(vsr, vWs.Columns.Count).End(xlToLeft).Column
With Worksheets("CH_グラフ")
If .ChartObjects.Count = 128 Then
Do
With vWs
Set r = Union(.Range(.Cells(vsr, sc), .Cells(vsr, ec)), _
.Range(.Cells(csr, sc), .Cells(csr, ec)))
End With
i = i + 1
With .ChartObjects(i).chart
.SetSourceData r
With .SeriesCollection
For j = 1 To .Count
Select Case j
Case 1
.Item(j).Name = "電圧"
Case 2
.Item(j).Name = "電流"
End Select
.Item(j).Format.Line.Weight = 2
Next
End With
End With
vsr = vsr + 2
csr = csr + 2
If vsr Mod 8 = 0 Then DoEvents
If vsr > (128 * 2) + 6 - 1 Then Exit Do
Loop
End If
End With
End Sub
(隠居Z) 2024/08/07(水) 09:31:50
Curr_FPGA1_ か
Volt_FPGA1_ が ファイル名に 含まれて いる、拡張子が .csv の
テキストファイルが読込対象です。 ↑。。。(*^^*)
m(__)m
(隠居Z) 2024/08/07(水) 09:51:56
Curr_FPGA1_ ここが問題だったようです。
別データを引っ張ってくる際に、Curr_FPGA2_のものをもってきてしまったようで。。
また、わからないことが出てきたら相談させてくださいませ。
きっとお手数をおかけします・・申し訳ないです。。
(ま) 2024/08/07(水) 10:17:17
Curr
Volt
で読み込みに変更もできますよ。^^
同日同種類、同計測日時、電圧電流が同数かの簡単確認機能を付けておきましたです。
Stik outは出ないと思いますが。
計測日時が違えば右方向へ回数表示は増へます。こちらは正常なのでは、と、私は思
います。25個計測ファイルが規則通りあれば表示しますし、一対だけでも表示すると
思います。
ま
いろいろ、確認してみて下さいませ。変更ご希望があれば又後ほどご連絡を
お待ち致します。
暇ですので、ご遠慮なく。。。
炊事当番とか。。。昼寝とかしてますので。直ぐにはダメかもしれませんが
生きてたら現れますです。
そのうち他の回答者様もお出ましになるかもしれません。
(*^^*)v
でわでわm(__)m
(隠居Z) 2024/08/07(水) 10:44:19
長期休暇に入ってしまい、お礼が遅くなってしまいました。
申し訳ないです。。
使ってみてまたわからないこと等出てきましたら相談させてください。
本当にありがとうございました!
(ま) 2024/08/22(木) 13:47:46
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.