Tạo output html graph, data exccel csv...

tuhocvba

Administrator
Thành viên BQT
Với output excel mà trên đó cần thể hiện graph, thì có vẻ như ADO không hỗ trợ được. Điều đó có nghĩa là chúng ta phải mở file excel đó lên (Workbooks.Open) để thao tác, điều này sẽ dẫn tới xử lý sẽ bị chậm và mất nhiều thời gian.
Trong trường hợp này mình đề xuất tạo ra output là html sử dụng chart.js để hiển thị đồ thị.
Mình giả thiết có dữ liệu như sau cần hiển thị trên biểu đồ.
Bạn cần đăng nhập để thấy đính kèm

File chart.js là mã nguồn mở, cung cấp dưới cuối bài viết.
Bạn cần đăng nhập để thấy đính kèm

Ở đây mình tập trung vào nội dung file html :
HTML:
<div>

<canvas id="myChart" style="width:100%;max-width:700px"></canvas>
</div>

<script src="js/Chart.js"></script>


<script>
  const ctx = document.getElementById('myChart');

  new Chart(ctx, {
    type: 'line',
    data: {
      labels: [0.11,
    0.12,
    0.13,
    0.14,
    0.15,
    0.16,
    0.17,
    0.18],
      datasets: [{
        label: 'THVBA',
        data: [0,
    0,
    0,
    1,
    1,
    1,
    0,
    0],
        borderWidth: 1
      }]
    },
    options: {
      scales: {
        y: {
          beginAtZero: true
        }
      }
    }
  });
</script>
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


Đồ thị liên tục, tôi muốn chỉnh thành dạng xung vuông và đang ở chế độ fill, tức là tô màu vùng dữ liệu khác 0, bây giờ tôi sẽ điều chỉnh thành :
Mã:
steppedLine: true,
    fill: false,
Ngoài ra tôi cũng muốn điều chỉnh màu sắc cho đồ thị. Cụ thể:
HTML:
<div>

<canvas id="myChart" style="width:100%;max-width:700px"></canvas>
</div>

<script src="js/Chart.js"></script>


<script>
window.chartColors = {
    red: 'rgb(255, 99, 132)',
    orange: 'rgb(255, 159, 64)',
    yellow: 'rgb(255, 205, 86)',
    green: 'rgb(75, 192, 192)',
    blue: 'rgb(54, 162, 235)',
    purple: 'rgb(153, 102, 255)',
    grey: 'rgb(201, 203, 207)'
};
  const ctx = document.getElementById('myChart');

  new Chart(ctx, {
    type: 'line',
    data: {
      labels: [0.11,
    0.12,
    0.13,
    0.14,
    0.15,
    0.16,
    0.17,
    0.18],
      datasets: [{
        label: 'THVBA',
        data: [0,
    0,
    0,
    1,
    1,
    1,
    0,
    0],
    steppedLine: true,
    fill: false,
    borderColor: window.chartColors.red,
        borderWidth: 2
      }]
    },
    options: {
      scales: {
        y: {
          beginAtZero: true
        }
      }
    }
  });
</script>
Kết quả:
Bạn cần đăng nhập để thấy đính kèm
 

tuhocvba

Administrator
Thành viên BQT
Link ví dụ các bạn tải ở đây:

Bây giờ giả định tôi có nhiều tín hiệu cần hiển thị trong một đồ thị, ta có:
HTML:
<!DOCTYPE html>
<html>
<script src="js/Chart.js"></script>
<body>
<canvas id="myChart" style="width:100%;max-width:600px"></canvas>

<script>
var xValues = [0.11,0.12,0.13,0.14,0.15,0.16];

new Chart("myChart", {
  type: "line",
  data: {
    labels: xValues,
    datasets: [{
      label: 'THVBA',
      data: [1,1,1,0,0,0],
      steppedLine: true,
      borderColor: "red",
      fill: false
    }, {
      label: 'THVBA1',
      data: [0,0,0,1,1,1],
      steppedLine: true,
      borderColor: "green",
      fill: false
    }, {
      label: 'THVBA3',
      data: [0,0,1,1,0,0],
      steppedLine: true,
      borderColor: "blue",
      fill: false
    }]
  },
  options: {
    legend: {display: true}
  }
});
</script>
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

Nếu như các bạn muốn hiển thị mỗi tín hiệu là một đồ thị chung, ta có:
HTML:
<!DOCTYPE html>
<html>
<script src="js/Chart.js"></script>
<body>
<canvas id="myChart" style="width:100%;max-width:600px"></canvas>
<canvas id="myChart2" style="width:100%;max-width:600px"></canvas>
<script>
var xValues = [0.11,0.12,0.13,0.14,0.15,0.16];

new Chart("myChart", {
  type: "line",
  data: {
    labels: xValues,
    datasets: [{
      label: 'THVBA',
      data: [1,1,1,0,0,0],
      steppedLine: true,
      borderColor: "red",
      fill: false
    }]
  },
  options: {
    legend: {display: true}
  }
});

new Chart("myChart2", {
  type: "line",
  data: {
    labels: xValues,
    datasets: [{
      label: 'THVBA2',
      data: [0,0,1,1,0,0],
      steppedLine: true,
      borderColor: "red",
      fill: false
    }]
  },
  options: {
    legend: {display: true}
  }
});
</script>
Kết quả :
Bạn cần đăng nhập để thấy đính kèm


Dựa vào code trên các bạn thấy rằng khi chúng ta code VBA, chúng ta chỉ cần code tạo ra xValues = [0.11,0.12,0.13,0.14,0.15,0.16] và các mảng data tương ứng , ví dụ data: [1,1,1,0,0,0].
Tôi rất muốn html + javascirpt để tự động đọc file csv và load ra đồ thị trên html. Tuy nhiên những code mà tôi tham khảo thì cần phải có localhost, tức là cài đặt sever ảo. Hoặc trên html có nút select chọn file csv rồi hiển thị ra, đây là điều tôi không thích.
Cài sever ảo thì bỏ qua, vì nó cách rách quá.
Click chọn file csv cũng là điều tôi không muốn, tôi muốn csv để chung thư mục với html thì khi bật html sẽ tự động load được ra. Đây là vấn đề mà tôi chưa làm được. Các bạn có thể khai thác thêm vấn đề này để hoàn thiện topic này giúp mình nhé.
 

tuhocvba

Administrator
Thành viên BQT
Nếu như mảng data của tôi chứa các phần tử rỗng thì sao. Trong thực tế dữ liệu excel hay csv vẫn có thể có những dòng rỗng. Tôi sẽ thử tạo ra mảng data có những phần tử rỗng xem điều gì sẽ xảy ra nhé.
HTML:
<!DOCTYPE html>
<html>
<script src="js/Chart.js"></script>
<body>
<canvas id="myChart" style="width:100%;max-width:600px"></canvas>
<canvas id="myChart2" style="width:100%;max-width:600px"></canvas>
<script>
var xValues = [0.11,0.12,0.13,0.14,0.15,0.16];

new Chart("myChart", {
  type: "line",
  data: {
    labels: xValues,
    datasets: [{
      label: 'THVBA',
      data: [,1,1,0,0,0],
      steppedLine: true,
      borderColor: "red",
      fill: false
    }]
  },
  options: {
    legend: {display: true}
  }
});

new Chart("myChart2", {
  type: "line",
  data: {
    labels: xValues,
    datasets: [{
      label: 'THVBA2',
      data: [0,0,,1,0,0],
      steppedLine: true,
      borderColor: "red",
      fill: false
    }]
  },
  options: {
    legend: {display: true}
  }
});
</script>
Kết quả:
Bạn cần đăng nhập để thấy đính kèm
 

tuhocvba

Administrator
Thành viên BQT
Xuất table từ dữ liệu excel ra html.
Code mẫu tôi tham khảo ở đây:
Mã:
https://www.w3schools.com/html/tryit.asp?filename=tryhtml_table_intro
Tôi có dữ liệu Excel hoặc CSV như sau:
Bạn cần đăng nhập để thấy đính kèm


Output mong muốn như sau:
Bạn cần đăng nhập để thấy đính kèm

Mã:
Sub vidu()
    Dim s As String
    Dim arr
    Dim i&, j&
    Dim optmp$
    
    Dim lk2$
    
    Dim fileStream
    With ThisWorkbook.Sheets(1)
        arr = .Range(.Cells(1, 1), .Cells(419, 11))
    End With
    optmp = "<!DOCTYPE html>" & Chr(13)
    optmp = optmp & "<html>" & Chr(13)
    optmp = optmp & "<head>" & Chr(13)
    optmp = optmp & "<style>" & Chr(13)
    optmp = optmp & "table {" & Chr(13)
    optmp = optmp & vbTab & "font-family: arial, sans-serif;" & Chr(13)
    optmp = optmp & vbTab & "border-collapse: collapse;" & Chr(13)
    optmp = optmp & vbTab & "width: 100%;" & Chr(13)
    optmp = optmp & "}" & Chr(13)
    optmp = optmp & "td, th {" & Chr(13)
    optmp = optmp & vbTab & "border: 1px solid #dddddd;" & Chr(13)
    optmp = optmp & vbTab & "text-align: left;" & Chr(13)
    optmp = optmp & vbTab & "padding: 8px;" & Chr(13)
    optmp = optmp & "}" & Chr(13)
    optmp = optmp & "tr:nth-child(even) {" & Chr(13)
    optmp = optmp & vbTab & "background-color: #dddddd;" & Chr(13)
    optmp = optmp & "}" & Chr(13)
    optmp = optmp & "</style>" & Chr(13)
    optmp = optmp & "</head>" & Chr(13)
    optmp = optmp & "<body>" & Chr(13)
    optmp = optmp & "<h2>HTML Table</h2>" & Chr(13)
    optmp = optmp & "<table>"
    For i = LBound(arr, 1) To UBound(arr, 1) Step 1
        If i = LBound(arr, 1) Then
            optmp = optmp & Chr(13) & vbTab & "<tr>" & Chr(13)
            For j = LBound(arr, 2) To UBound(arr, 2) Step 1
             optmp = optmp & vbTab & vbTab & "<th>" & CStr(arr(i, j)) & "</th>" & Chr(13)
            Next j
            optmp = optmp & Chr(13) & vbTab & "</tr>"
        Else
            optmp = optmp & Chr(13) & vbTab & "<tr>"
            For j = LBound(arr, 2) To UBound(arr, 2) Step 1
             optmp = optmp & vbTab & vbTab & "<td>" & CStr(arr(i, j)) & "</td>" & Chr(13)
            Next j
            optmp = optmp & Chr(13) & vbTab & "</tr>"
        End If
    Next i
    
    optmp = optmp & "</table>" & Chr(13)
    optmp = optmp & "</body>" & Chr(13)
    optmp = optmp & "</html>" & Chr(13)
    
    lk2 = "D:\Graph\table.html"
    Set fileStream = CreateObject("ADODB.Stream")
    fileStream.Charset = "utf-8"
    fileStream.Open
    fileStream.WriteText optmp
    fileStream.SaveToFile lk2, 2 ' 2: Create Or Update
    fileStream.Close
End Sub
 

tuhocvba

Administrator
Thành viên BQT
Trong trường hợp bạn muốn thể hiện cả graph và dữ liệu thì html sẽ theo cấu trúc sau:
HTML:
...
<body>

<div>
<canvas id="myChart" style="width:100%;max-width:700px"></canvas>
</div>
<h2>HTML Table</h2>
<div>
    <table>...</table>
</div>

</body>

<script src="js/Chart.js"></script>
<script>
    ....Graph....
</script>
</html>
Bạn cần đăng nhập để thấy đính kèm
 

Euler

Administrator
Thành viên BQT
Nếu chúng ta muốn giấu table đi, chúng ta có thể tận dụng code như sau:
HTML:
...
<body>

<div>
<canvas id="myChart" style="width:100%;max-width:700px"></canvas>
</div>

<div>
<details>HTML Table</summary>
    <table>...</table>
</details>
</div>

</body>

<script src="js/Chart.js"></script>
<script>
    ....Graph....
</script>
</html>
Bạn cần đăng nhập để thấy đính kèm

Nguồn tham khảo :
Mã:
https://stackoverflow.com/questions/28615544/how-to-create-spoiler-text
 

tuhocvba

Administrator
Thành viên BQT
Đồ thị hai trục tung:
JavaScript:
var canvas = document.getElementById('chart');
new Chart(canvas, {
  type: 'line',
  data: {
    labels: ['1', '2', '3', '4', '5'],
    datasets: [{
      label: 'A',
      yAxisID: 'A',
      data: [100, 96, 84, 76, 69]
    }, {
      label: 'B',
      yAxisID: 'B',
      data: [1, 1, 1, 1, 0]
    }]
  },
  options: {
    scales: {
      yAxes: [{
        id: 'A',
        type: 'linear',
        position: 'left',
      }, {
        id: 'B',
        type: 'linear',
        position: 'right',
        ticks: {
          max: 1,
          min: 0
        }
      }]
    }
  }
});
Cụ thể:
HTML:
<!DOCTYPE html>
<html>
<script src="js/Chart.js"></script>
<body>
<div style="width:75%;">
  <canvas id="chart" style="width:100%;max-width:600px"></canvas>
</div>
<script>
var canvas = document.getElementById('chart');
new Chart(canvas, {
  type: 'line',
  data: {
    labels: ['1', '2', '3', '4', '5'],
    datasets: [{
      label: 'A',
      yAxisID: 'A',
     borderColor: "red",
     fill: false,
      data: [100, 96, 84, 76, 69]
    }, {
      label: 'B',
      yAxisID: 'B',
      fill: false,
      borderColor: "blue",
      data: [1, 1, 1, 1, 0]
    }]
  },
  options: {
    legend: {display: true},
    scales: {
      yAxes: [{
        id: 'A',
        type: 'linear',
        position: 'left',
      }, {
        id: 'B',
        type: 'linear',
        position: 'right',
        ticks: {
          max: 1,
          min: 0
        }
      }]
    }
  }
});
</script>
</body>
</html>
Bạn cần đăng nhập để thấy đính kèm

Nguồn tham khảo:
Mã:
https://stackoverflow.com/questions/38085352/how-to-use-two-y-axes-in-chart-js-v2
 

tuhocvba

Administrator
Thành viên BQT
Ta xét bài toán như sau:
Tôi có một dữ liệu như thế này.
Bạn cần đăng nhập để thấy đính kèm


Số lượng cột dữ liệu của tôi có thể có nhiều hơn nữa.
Tôi muốn một chương trình, mà ở đây người dùng gọi nó thì nó sẽ tạo ra các biểu đồ. Chúng được xắp sếp cứ 4 biểu đồ thì cùng hàng với nhau.
HTML:
<!DOCTYPE html>
<html>
<script src="js/Chart.js"></script>
<body>
    <table>
        <tr>
            <td><canvas id="myChart" style="width:100%;max-width:600px"></canvas></td>
            <td><canvas id="myChart2" style="width:100%;max-width:600px"></canvas></td>
        </tr>
    </table>
</body>
<script>
var xValues = [0.11,0.12,0.13,0.14,0.15,0.16];
var datasiga = [1,1,1,0,0,0];
var datasigb = [0,0,1,1,0,0];

new Chart("myChart", {
  type: "line",
  data: {
    labels: xValues,
    datasets: [{
      label: 'THVBA',
      data: datasiga,
      steppedLine: true,
      borderColor: "red",
      fill: false
    }]
  },
  options: {
    legend: {display: true}
  }
});

new Chart("myChart2", {
  type: "line",
  data: {
    labels: xValues,
    datasets: [{
      label: 'THVBA2',
      data: datasigb,
      steppedLine: true,
      borderColor: "red",
      fill: false
    }]
  },
  options: {
    legend: {display: true}
  }
});
</script></html>
Nhìn chung thì mẫu html sẽ như trên.
Bạn cần đăng nhập để thấy đính kèm

Tại sao tôi lại muốn tạo trên html là bởi vì, khi tạo một số lượng lớn biểu đồ trên Excel thì các lệnh thiết định Top, Left cho graph dường như không còn tác dụng do bị lag, excel không kịp xử lý, dẫn tới output rất xấu.
Bạn cần đăng nhập để thấy đính kèm
 

tuhocvba

Administrator
Thành viên BQT
Trước hết ta tập trung vào phần code graph.
Nó có dạng như thế này:
JavaScript:
new Chart("myChart", {
  type: "line",
  data: {
    labels: xValues,
    datasets: [{
      label: 'THVBA',
      data: datasiga,
      steppedLine: true,
      borderColor: "red",
      fill: false
    }]
  },
  options: {
    legend: {display: true}
  }
});
Ta tập trung vào phần này:
JavaScript:
{
      label: 'THVBA',
      data: datasiga,
      steppedLine: true,
      borderColor: "red",
      fill: false
    }
Thật ra đồ thị có nhiều tín hiệu hay chỉ có một tín hiệu chính là phần này trong datasets được xuất hiện nhiều lần hay một lần.
Tôi gọi nó là data.
Như vậy nếu đồ thị có một tín hiệu thì datasets: [data], nếu đồ thị có nhiều tín hiệu thì nó có dạng datasets: [data1, data2,data3,...].

Đối với phần data này: Ta thấy có các yếu tố là label (THVBA), data (datasiga), borderColor (red), nếu biết chúng thì data được xác định.
Do đó tôi sẽ xây dựng một lớp gọi là lớp data, tên đầy đủ là clsDataGraph. Nó có ba thuộc tính quan trọng là strLabel (THVBA), strDataName(datasiga), strColor(red).
clsDataGraph:
Private strLabel_           As String   'THVBA
Private strDataName_        As String   'data: datay [,1,1,0,0,0]
Private strColor_           As String   ''"red", "blue", "green", orange, navy, yellow, "purple", "magenta","aqua", "salmon", "darkgray", "pink", "coral"
Friend Property Let strLabel(ByRef s As String)
    strLabel_ = s
End Property


Friend Property Let strDataName(ByRef s As String)
    strDataName_ = s
End Property

Friend Property Let strColor(ByRef s As String)
    strColor_ = s
End Property
Tôi xây dựng một phương thức để nếu một đối tượng data đã có đầy đủ thông tin ba thuộc tính trên thì phải trả về được một chuỗi string có dạng:

JavaScript:
{
      label: 'THVBA',
      data: datasiga,
      steppedLine: true,
      borderColor: "red",
      fill: false
    }
Vì vậy trong class trên tôi có Function GetData() như sau:
clsDataGraph:
Friend Function GetData() As String
    Dim stemp$
    stemp = "{"
    stemp = stemp & Chr(13) & "label: '" & strLabel_ & "',"
    stemp = stemp & Chr(13) & "data: " & strDataName_ & ","
    stemp = stemp & Chr(13) & "steppedLine: true,"
    stemp = stemp & Chr(13) & "borderColor: " & """" & strColor_ & """" & ","
    stemp = stemp & Chr(13) & "fill: false" & Chr(13) & "}"
    
    GetData = stemp
End Function
 

tuhocvba

Administrator
Thành viên BQT
Giả sử tôi muốn tạo ra một trang có hai đồ thị như sau:
Bạn cần đăng nhập để thấy đính kèm

1. Tôi cần xây dựng một mảng lấy dữ liệu thô từ đó tạo graph.
Mã:
Public ArrayCSV     As Variant
With ThisWorkbook.Sheets(1)
        ArrayCSV = .Range(.Cells(1, 1), .Cells(11, 9))
        
End With
2. Tôi cần một hàm X mà nếu tôi chỉ định đưa các cột thông tin ví dụ cột 2, cột 3, cột 4, thì ba tín hiệu này sẽ được thể hiện trong một đồ thị. Mặc định cột thời gian Time là cột 1 cho nên không cần truyền cột thời gian.
3. Giả sử tôi muốn tạo thêm một đồ thị mà chỉ có một tín hiệu giả sử đó là cột 7, khi đó tôi cũng gọi hàm X mà giá trị đầu vào là cột 7.
Sau hai lần gọi hàm X như trên tôi đã có hai đồ thị.
Mã:
ReDim arr(1 To 3)
arr(1) = 2
arr(2) = 3
arr(3) = 4
Call LoadDataForCreatGraph(arr)
ReDim arr(1 To 1)
arr(1) = 7
Call LoadDataForCreatGraph(arr)
4. Tôi gọi hàm Y, là hàm tạo ra mã html chứa hai đồ thị ở trên.

Như vậy mỗi lân gọi thủ tục LoadDataForCreatGraph, thì nó có mấy nhiệm vụ sau:
1. Cập nhật thông tin vào phần Graph Layout
2. Cập nhật vào phần thông tin khai báo mảng
3. Tạo Graph
Chú ý phần Graph Layout, bình thường có thể coi đây là một biến string, nếu xuất hiện đồ thị nào thì cứ nạp thêm vào string này. Thế nhưng do liên quan tới sắp xếp đồ thị theo kiểu mỗi hàng có 4 đồ thị. Thế cho nên tại thời điểm này, khi xuất hiện một graph nào thì ta chỉ nên lưu nó vào một mảng với thông tin là:
Mã:
<td><canvas id="myChart" style="width:100%;max-width:600px"></canvas></td>
Còn nó nằm ở dòng nào <tr>....</tr> thì chỉ khi nào ta đã xác định trang html có bao nhiêu đồ thị tất cả, thì ta mới sắp xếp cho dúng.
Vậy tôi sẽ cần một mảng để ghi thông tin <td><canvas id="myChart" style="width:100%;max-width:600px"></canvas></td> cho nên tôi có :
Mã:
Dim pLayout()    As String
Mỗi khi hàm này được gọi thì phần khai báo mảng sẽ có thêm thông tin, cho nên tôi cần một biến string tổng hợp tất tật mỗi lần phát sinh khai báo mảng: Dim pStrKhaiBaoMang As String. Tương tự như thế phần Graph cũng cần cập nhật thông tin nên tôi có biến: Dim pStrGraph As String
 

tuhocvba

Administrator
Thành viên BQT
Mỗi lần gọi thủ tục LoadDataForCreatGraph thì sẽ có một đồ thị mới. Tên đồ thị có dạng myChart1 hoặc myChart2, hoặc myChart3...
Do bất cứ lúc nào người ta cũng có thể gọi LoadDataForCreatGraph, mà ta không thể đi tìm xem ta đang có bao nhiêu đồ thị rồi, nên tôi sẽ có một biến dùng chung là pGraphPost As Integer. Lần đầu tiên tạo đồ thị , pGraphPost = 1, lần thứ hai tạo đồ thị pGraphPost = 2.
Thông qua nó tôi cũng sẽ đặt tên cho đồ thị mà mình tạo ra có dạng:
Mã:
pLayout(pGraphPost) = "<td><canvas id=" & """" & "myChart" & CStr(pGraphPost) & """" & " style=" & """" & "width:100%;max-width:600px" & """" & "></canvas></td>"
Tôi cũng cần một mảng định nghĩa màu sắc để tô màu cho các đường tín hiệu có trong đồ thị.
Mã:
arrColor = Array("red", "blue", "green", "orange", "navy", "yellow", "purple", "magenta", "aqua", "salmon", "darkgray", "pink", "coral")
Như vậy nếu đồ thị chỉ có một tín hiệu thì chắc chắn đường tín hiệu sẽ là màu đỏ (red) do nó xuất hiện đầu tiên.
Nếu đồ thị có nhiều hơn một tín hiệu, thì màu sắc cho mỗi đường tín hiệu sẽ tuần tự theo thứ tự trong mảng arrColor. Ta cần một biến gọi là cnt_color, mỗi một đường tín hiệu xuất hiện nó sẽ tăng lên một đơn vị.
Nó không được vượt quá Ubound(arrColor).
Ngoài ra số lượng data trong datasets cũng là một vấn đề cần phải đếm nên tôi sẽ có thêm biến là cnt_data.
Ví dụ khi ta đưa Sig5 vào đồ thị, tôi cần một mảng lưu trữ data cột 5. Nếu đặt tên luôn là Sig5 thì thằng chart.js không cho vì có số. Nên tôi cần một hàm cắt lấy chữ Sig, bỏ qua các ký tự số má hoặc bất cứ thứ gì không nằm trong dải a-z.
Mã:
'a-z: 97-122
'A-Z: 65-90
Private Function GetSigName(ByVal s As String) As String
    Dim op$, s2$
    Dim i&
    If s = "" Then Exit Function
    For i = 1 To Len(s) Step 1
        s2 = Mid(s, i, 1)
        If Asc(UCase(s2)) >= 65 And Asc(UCase(s2)) <= 90 Then
            op = op & s2
        Else
            Exit For
        End If
    Next i
    GetSigName = op
End Function
Nếu cắt như trên thì sig4 hay sig5 cũng đều là sig. Việc đặt tên mảng đều là sig rõ ràng không ổn.
Để đảm bảo không trùng nhau, tôi sẽ tạo ra thứ giống như là siga, sigaa, sigb, sigbb.
Mã:
cnt_color = 0
cnt_data = 0
chrnumber = 1
    For i = LBound(arr) To UBound(arr) Step 1
        j = CLng(arr(i))
        lbl_Name = GetSigName(CStr(ArrayCSV(1, j))) 'THVBA
        If cnt_color > UBound(arrColor) Then
            cnt_color = LBound(arrColor)
            chrnumber = chrnumber + 1
        End If
        data_Name = LCase(lbl_Name) & String$(chrnumber, Chr(cnt_data + 97)) 'dataX
        color_Name = arrColor(cnt_color)
        Call GetKhaiBaoMang(data_Name, j)
        
        cnt_color = cnt_color + 1
        cnt_data = cnt_data + 1
        If cnt_data = 1 Then
            ReDim ArrayDataSet(1 To cnt_data)
        Else
            ReDim Preserve ArrayDataSet(1 To cnt_data)
        End If
        
        a1111.strLabel = lbl_Name ' "THVBA"
        a1111.strDataName = data_Name '"dataX"
        a1111.strColor = color_Name
        ArrayDataSet(cnt_data) = a1111.GetData
    Next i
 

tuhocvba

Administrator
Thành viên BQT
Chỉnh độ thanh mảnh của đường line:
Mã:
borderWidth: 1, pointRadius:0.2,
Hoặc:
Mã:
borderWidth: 1, pointRadius: 1,pointHoverRadius: 5,
 
Top