返回列表 上一主題 發帖

[發問] 擷取報表中所需資料

回復 12# asus103
  1. Sub Ex()
  2. Dim A As Range, Ar(), C, d As Object, d1 As Object, d2 As Object, r&, MyClass$, Ky, s%, i%
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set d1 = CreateObject("Scripting.Dictionary")
  5. Set d2 = CreateObject("Scripting.Dictionary")
  6. With Sheets("Sheet1")
  7.   For Each A In .Range(.[B1], .Cells(.Cells.Rows.Count, 2).End(xlUp))
  8.      If A Like "*班" Then MyClass = A.Value
  9.      If Replace(A.Value, " ", "") = "學號" Then Ar = .Range(A, A.End(xlToRight)).Value
  10.      If Val(A.Value) <> 0 And InStr(A, "-") = 0 Then
  11.        s = 0
  12.        For Each C In Ar
  13.         If C <> "" Then d1(C) = ""
  14.          If C = "姓名" Then d1("班級") = "": d(A & "班級") = Replace(Replace(Replace(Replace(Replace(Replace(MyClass, "高", ""), "年", ""), "班", ""), "三", 3), "二", 2), "一", 1)
  15.          d2(A.Value) = ""
  16.          d(A & C) = IIf(s > 5, "", "'") & A.Offset(, s).Text
  17.          s = s + 1
  18.        Next
  19.     End If
  20.   Next
  21. End With
  22. With Sheets("Sheet4")
  23. .Cells = ""
  24. r = 2
  25. .[A1].Resize(, d1.Count) = d1.KEYS
  26. For Each Ky In d2.KEYS
  27.    For i = 1 To d1.Count
  28.       .Cells(r, i) = IIf(d(Ky & .Cells(1, i)) = "", -1, d(Ky & .Cells(1, i)))
  29.    Next
  30. r = r + 1
  31. Next
  32. End With
  33. End Sub
複製代碼
學海無涯_不恥下問

TOP

本帖最後由 asus103 於 2010-12-30 14:27 編輯

回復 11# Hsieh
對不起
是我沒有說清楚
是班級名稱,如三年二班改為302....

還有另外一個小問題
原始資料中若是"姓  名"不是"姓名"(如B7中是"姓  名"時,(中間有空白))
浪費您許多寶貴的時間,
只能在一次跟您說感謝
謝謝您
ASUS

TOP

回復 10# asus103
程式提取的學號已經是數字了
  1. Sub Ex()
  2. Dim A As Range, Ar(), C, d As Object, d1 As Object, d2 As Object, r&, MyClass$, Ky, s%, i%
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set d1 = CreateObject("Scripting.Dictionary")
  5. Set d2 = CreateObject("Scripting.Dictionary")
  6. With Sheets("Sheet1")
  7.   For Each A In .Range(.[B1], .Cells(.Cells.Rows.Count, 2).End(xlUp))
  8.      If A Like "*班" Then MyClass = A.Value
  9.      If Replace(A.Value, " ", "") = "學號" Then Ar = .Range(A, A.End(xlToRight)).Value
  10.      If Val(A.Value) <> 0 And InStr(A, "-") = 0 Then
  11.        s = 0
  12.        For Each C In Ar
  13.         If C <> "" Then d1(C) = ""
  14.          If C = "姓名" Then d1("班級") = "": d(A & "班級") = MyClass
  15.          d2(A.Value) = ""
  16.          d(A & C) = A.Offset(, s).Value
  17.          s = s + 1
  18.        Next
  19.     End If
  20.   Next
  21. End With
  22. With Sheets("Sheet4")
  23. .Cells = ""
  24. r = 2
  25. .[A1].Resize(, d1.Count) = d1.KEYS
  26. For Each Ky In d2.KEYS
  27.    For i = 1 To d1.Count
  28.       .Cells(r, i) = IIf(d(Ky & .Cells(1, i)) = "", -1, d(Ky & .Cells(1, i)))
  29.    Next
  30. r = r + 1
  31. Next
  32. End With
  33. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 8# Hsieh
Hsieh大大您好
衷心感謝您的幫助

尚有2個小問題請教:
1.若是把班級欄改為純數字,是否是手動即可
2.若想在未選修的位置上填上"-1",那應該在哪一行加上些甚麼?
謝謝
ASUS

TOP

本帖最後由 asus103 於 2010-12-30 12:06 編輯

衷心感謝兩位版主的鼎力協助
我原以為恐怕需要很長的程式碼才能解決的
兩位版主化繁為簡的功力真令我佩服,而且是在這麼短的時間內
感激阿!!
我先使用了,之後我會努力看懂並學習的

尚有2個小問題請教:
1.若是把班級欄改為純數字,是否是手動即可
2.若想在未選修的位置上填上"-1",那應該在哪一行加上些甚麼?
謝謝
ASUS

TOP

回復 3# asus103
  1. Sub Ex()
  2. Dim A As Range, Ar(), C, d As Object, d1 As Object, d2 As Object, r&, MyClass$, Ky, s%, i%
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set d1 = CreateObject("Scripting.Dictionary")
  5. Set d2 = CreateObject("Scripting.Dictionary")
  6. With Sheets("Sheet1")
  7.   For Each A In .Range(.[B1], .Cells(.Cells.Rows.Count, 2).End(xlUp))
  8.      If A Like "*班" Then MyClass = A.Value
  9.      If Replace(A.Value, " ", "") = "學號" Then Ar = .Range(A, A.End(xlToRight)).Value
  10.      If Val(A.Value) <> 0 And InStr(A, "-") = 0 Then
  11.        s = 0
  12.        For Each C In Ar
  13.         If C <> "" Then d1(C) = ""
  14.          If C = "姓名" Then d1("班級") = "": d(A & "班級") = MyClass
  15.          d2(A.Value) = ""
  16.          d(A & C) = A.Offset(, s).Value
  17.          s = s + 1
  18.        Next
  19.     End If
  20.   Next
  21. End With
  22. With Sheets("Sheet4")
  23. .Cells = ""
  24. r = 2
  25. .[A1].Resize(, d1.Count) = d1.KEYS
  26. For Each Ky In d2.KEYS
  27.    For i = 1 To d1.Count
  28.       .Cells(r, i) = d(Ky & .Cells(1, i))
  29.    Next
  30. r = r + 1
  31. Next
  32. End With
  33. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 6# asus103
如圖 只要資料的B欄 內 [班級] 在 [學號] 的上2列  程式應可應付的

TOP

回復 5# GBKEE


GBKEE您好
原來的檔案中,即有成績的部分
只是各班(如5班以後)選修科目並不相同,
所以我無法自動判別取出

另,我的權限無法看到我自己的附檔
若檔案有問題煩請再告知
謝謝!!!
ASUS

TOP

回復 4# asus103
附檔上來看看

TOP

回復 2# GBKEE
再一次感謝您
現在基本資料進來了
只是自己程度還不夠,尚無法完全看懂,我會再加油看懂它

那成績部分我若是用vlookup處理會遇到兩個問題
1.原資料並非完整區塊,中間有許多空白
2.各班及科目位置並不相同
請問有方法把成績轉移過來嗎?
謝謝
ASUS

TOP

        靜思自在 : 世上有兩件事不能等:一、孝順 二、行善。
返回列表 上一主題