ExcelVBAで連想配列

Scripting.Dictionary を使います。

Sub 支社別集計()
    Dim Sheet1, Sheet2 As Worksheet
    Const COL店舗CD = 1 ' 店舗CDの列
    Const COL分類CD = 3 ' 分類CDの列
    Const COL売上額 = 10 ' 売上額
    Dim MaxRow As Long ' 最終行
    Dim key As String ' 検索キー
    Dim c, r As Long
    
    Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
    
    Set Sheet1 = Worksheets("売上明細") ' 明細シート
    Set Sheet2 = Worksheets("売上集計") ' 集計シート
    
    MaxRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row ' 最終行を求める
    
    ' 売上明細を連想配列へ読み込む
    With Sheet1
        For r = 2 To MaxRow ' 最終行
            key = .Cells(r, COL店舗CD).Value & .Cells(r, COL分類CD).Value ' 店舗CD & 分類CD
            dicT(key) = dicT(key) + .Cells(r, COL売上額).Value ' 売上額
        Next
    End With
        
    ' 集計シートへの書き出し
    With Sheet2
        For c = 3 To 12 ' 列
            For r = 4 To 12 ' 行
                key = .Cells(2, c).Value & .Cells(r, 1).Value ' 店舗CD & 分類CD
                .Cells(r, c) = dicT(key)
            Next
        Next
    End With
End Sub

ExcelVBA 条件に一致したセルのある行を検索

Match関数がいいらしい。
でも同じ条件の行があったら最初の行しか返してくれない

見つからないと例外にあんるので on error resume next も欠かせない。

Sub match()
    Dim workSh, prefSh As Worksheet
    Set workSh = ThisWorkbook.Worksheets("Sheet1")
    Set prefSh = ThisWorkbook.Worksheets("Sheet2")

    Dim prefRng As Range
    Set prefRng = Range(prefSh.Cells(2, 2), prefSh.Cells(48, 2))

    Dim workEndR, workTmpR As Long, tmpStr As String
    workEndR = workSh.Cells(Rows.Count, 1).End(xlUp).Row

    For workTmpR = 2 To workEndR
        tmpStr = workSh.Cells(workTmpR, 1).Value
        On Error Resume Next
        workSh.Cells(workTmpR, 2).Value = prefSh.Cells(Application.WorksheetFunction.match(tmpStr, prefRng, 0) + 1, 1)
        If Err <> 0 Then
            workSh.Cells(workTmpR, 2).Value = "ERROR"
            Err.Clear
        End If
    Next
End Sub

ExcelVBAでシートに高速にCSVを読み込む

Dim ws As Worksheet
Set ws = ActiveSheet ' CSV のデータを取り込むシート

Dim qt As QueryTable
Set qt = ws.QueryTables.Add(Connection:="TEXT;D:\Tips.csv", Destination:=ws.Range("A1")) ' CSV を開く
With qt
    .TextFilePlatform = 932          ' 文字コードを指定
    .TextFileParseType = xlDelimited ' 区切り文字の形式
    .TextFileCommaDelimiter = True   ' カンマ区切り
    .RefreshStyle = xlOverwriteCells ' セルに上書き
    .Refresh                         ' データを表示
    .Delete                          ' CSV との接続を解除
End With

MFCのCArray を qsort する

CArray の GetData メソッドで中身がまるまるもらえて、しかも中身書き換えてOKなのです。

struct StructHoge
{
    int number;
};

...

CArray <StructHoge, StructHoge> arrayHoge;

...

// ソート関数
int compareHoge(void* context, const void* a1, const void* a2)
{
    StructHoge* p1 = (StructHoge*)a1;
    StructHoge* p2 = (StructHoge*)a2;

    if (p1->number != p2->number)
    {
        return p1->number - p2->number;
    }

    return 0;
}

...

// ソート
StructHoge* pHoge = arrayHoge.GetData();
qsort_s((LPVOID)pHoge, arrayHoge.GetCount(), sizeof(StructHoge), compareHoge, NULL);

JSON.NET (NEWTONSOFT.JSON) の基礎

オブジェクト はJObject
配列はJArray
文字列や数値はJValue

配列のループはこんな感じ

JArray jarr = (JArray)jres["results"];
foreach (JObject jobj in jarr)
{
  JValue nameValue = (JValue)jobj["name"];
  string name = (string)nameValue;
  JValue priceValue = (JValue)jobj["price"];
  long price = (long)priceValue;
  Console.WriteLine($"name is {name}, price is {price}.");
}