Excel (VBA) |
![]() ![]() |
(指定なし : 指定なし)
配列について
投稿日時: 23/08/06 15:45:20
投稿者: yama1006
|
---|---|
以下にコードを添付します。
|
![]() |
投稿日時: 23/08/06 16:16:33
投稿者: simple
|
---|---|
まずは、シートレイアウトの説明をしてください。
|
![]() |
投稿日時: 23/08/06 19:35:32
投稿者: yama1006
|
---|---|
[quote="simple"]まずは、シートレイアウトの説明をしてください。
|
![]() |
投稿日時: 23/08/06 20:12:26
投稿者: simple
|
---|---|
例えば、こんな書き方はどうでしょうか。
Sub test1() Call maketime24(Range("A1").Resize(10, 1)) '' 例です。引数は実際に沿って工夫してください。 End Sub Function maketime24(rng As Range) Dim mat As Variant dim v As Double Dim k As Long mat = rng.Value For k = LBound(mat) To UBound(mat) v = mat(k, 1) If v <> Empty Then mat(k, 1) = v * 24 End If Next rng.Value = mat rng.NumberFormatLocal = "G/標準" End Function # なお、動作確認していませんので、そちらで確認をお願いします。 老婆心ながら、気づいたことをメモします。 (1)インデントを正確につけたほうが、あなたにとって有益でしょう。 (2)Gotoは使わないほうがいいと思います。 要するに、なければ次のブロックに移るだけですから、 If Not time Is Nothing Then jikan = time.Column If ws2.Cells(o, jikan) <> "" Then ws2.Cells(o, jikan) = timetodecimal(ws2.Cells(o, jikan)) ws2.Cells(o, jikan).NumberFormatLocal = "G/標準" End If End If などと、 GoTo など使わなくても書けます。 (3)繰り返しのなかで、 r3.Find("SWTF010", lookat:=xlWhole)を何度も実行する必要は全く無いと思います。 無駄をできるだけなくすようにされたほうがよいと思いました。 ざっと拝見して気づいた点です。 他の皆さんからの回答をお待ちください。 |
![]() |
投稿日時: 23/08/07 00:03:06
投稿者: yama1006
|
---|---|
simple さんの引用: ご忠告、ご意見、大変助かります。初心者でどこが無駄で、必要な部分かがあいまいです。 頂いたコードとは別なのですが、 下記のように、 arr1に受入データのセルを格納 arr2に時間表記の変えたコードを格納 arr1の配列をiに格納 i と arr2を比較して同じ単語であれば r2にその範囲を格納して24を掛けるということはできるでしょうか。 Sub 時間表記変換() Dim r1 As Range Set r1 = Sheets("受入データ").Range("a1").CurrentRegion Dim arr1() As Variant Dim arr2() As String arr1 = r1.Value arr2 = Split("SWTF010;SWTF040;SWTF020;SWTF050;SWTF060", ";") '配列に受入データの見出しと一致する単語を格納 Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") Dim i As Long Dim l As Variant Dim r2 As Range For i = 2 To UBound(arr1, 2) For Each l In arr2() If i = l Then If r2 Is Nothing Then Set r2 = r1.Range(i, l) Else Set r2 = Union(r2, r1.Cells(i, l)) End If End If Next Next End Sub |
![]() |
投稿日時: 23/08/07 08:52:14
投稿者: simple
|
---|---|
# 全文引用は必要ありません。直前の発言なのですぐにわかりますし、
Sub 時間表記変換() Dim r1 As Range Dim arr1() As Variant Dim arr2() As String Dim dic As Object Dim i As Long Dim l As Variant Dim r2 As Range Set r1 = Sheets("受入データ").Range("a1").CurrentRegion arr1 = r1.Value arr2 = Split("SWTF010;SWTF040;SWTF020;SWTF050;SWTF060", ";") Set dic = CreateObject("Scripting.Dictionary")'' 何に使うのですか? For i = 2 To UBound(arr1, 2) For Each l In arr2() If i = l Then ''' iは整数。 ''' l は"SWTF010","SWTF040",.... といった文字列のどれか。 '’’ i と l が 一致することはありえません。 If r2 Is Nothing Then Set r2 = r1.Range(i, l) ''' セル範囲の意味が不明です。 ''' こういうセルの指定方法はありません。 Else Set r2 = Union(r2, r1.Cells(i, l)) End If End If Next Next End Sub# 全体として意味がわかりかねました。 ------------------------------ 23/08/06 20:12:26の発言で示したコードには興味が無かったですか? ご希望の配列処理の積りでしたが。 これを利用して、時刻表示の変更するには、こんな書き方ができると思います。 参考にしてください。 Sub main() Dim ws受入 As Worksheet Dim header As Range '見出し行のセル範囲 Dim dataR As Long 'データ本体開始行 Dim colmn(1 To 6) As Long '時間関連6項目の列番号 Dim lastrow As Long Dim rng As Range Dim k As Long Set ws受入 = Sheets("受入データ") ws受入.Cells.ClearFormats '見出し行 Set header = ws受入.UsedRange.Rows(1) '時間関連6項目の列番号 colmn(1) = header.Find("SWTF010", lookat:=xlWhole).Column '出勤時間 colmn(2) = header.Find("SWTF030", lookat:=xlWhole).Column '普通残業時間 colmn(3) = header.Find("SWTF040", lookat:=xlWhole).Column '深夜残業時間 colmn(4) = header.Find("SWTF020", lookat:=xlWhole).Column '遅早時間 colmn(5) = header.Find("SWTF050", lookat:=xlWhole).Column '法定外休日時間 colmn(6) = header.Find("SWTF060", lookat:=xlWhole).Column '法定休日時間 dataR = ws受入.UsedRange.Rows(1).Row + 1 'データ本体開始行 '時間関連6項目の列の書式変更 For k = 1 To 6 lastrow = ws受入.Cells(Rows.Count, colmn(k)).End(xlUp).Row Set rng = ws受入.Range(ws受入.Cells(dataR, colmn(k)), _ ws受入.Cells(lastrow, colmn(k))) Call maketime24(rng) '時間表示の変更 Next End Sub Function maketime24(rng As Range) '時間表示の変更 (再掲) Dim mat As Variant Dim v As Double Dim k As Long mat = rng.Value '配列に取得 For k = LBound(mat) To UBound(mat) v = mat(k, 1) If v <> Empty Then mat(k, 1) = v * 24 End If Next rng.Value = mat '変更後の配列を元に戻す rng.NumberFormatLocal = "G/標準" End Function # 私はここまでとします。 |
![]() |
投稿日時: 23/08/08 17:03:16
投稿者: yama1006
|
---|---|
Function maketime24(rng As Range) '時間表示の変更 (再掲) Dim mat As Variant Dim v As Double Dim k As Long mat = rng.Value '配列に取得 For k = LBound(mat) To UBound(mat) v = mat(k, 1) If v <> Empty Then mat(k, 1) = v * 24 End If Next rng.Value = mat '変更後の配列を元に戻す rng.NumberFormatLocal = "G/標準" End Function rng.Value = mat '変更後の配列を元に戻す すみません、コードまで書いていただき、ありがとうございます。。。。 こちらについてなのですが、変更後に配列を元に戻さない場合、どのようになるのでしょうか? |
![]() |
投稿日時: 23/08/08 20:44:24
投稿者: simple
|
---|---|
# 前回発言までとしたのですが、敢えて。
|
![]() |
投稿日時: 23/08/10 13:57:36
投稿者: yama1006
|
---|---|
コードありがとうございました。
|
![]() |
投稿日時: 23/08/10 13:59:02
投稿者: yama1006
|
---|---|
yama1006 さんの引用: |
![]() |
投稿日時: 23/08/10 17:05:55
投稿者: simple
|
---|---|
コメント拝見しました。
|
![]() |
投稿日時: 23/08/12 14:52:07
投稿者: 半平太
|
---|---|
後戻りする話で恐縮ですが、
|