Makro yoluyla excel 2010 reform verileri?


0

Bir müşteriden aldığım verileri sisteme alabileceğim verilere değiştirmeme izin veren bir makro oluşturmaya çalışıyorum. Aldığım veriler şu formatta:

Bunu VBA Makrosu ile nasıl yapabilirim? Bu yüzden verileri okumalı, sonra kullanabileceğim formattaki verilerin kopyasını içeren yeni bir sayfa oluşturmalıdır. Bunun gibi, böyle:


1
VBA'yı istediğinizi biliyorum, ancak VYY dışı bir çözüm olan FYI, Microsoft'tan PowerQuery addon kullanmaktır. Yerleşik unpivot işlevselliğine sahiptir.
Madball73

Bu örnek değil bakmak bir benzeri Pivot tabloda . Pivot tablo formunda mı yoksa sadece değiştirmek istediğiniz bir yapıda mı?
Raystafarian

İstediğim bir yapıda. Üzgünüz, şu anda Pivot biçiminde değil
WolfeLine

Kaç tane sütun var?
mcalex

Herhangi bir sayıda sütun (fon) vardır. Aylık olarak değişecektir. Tarih aralığı (satır) gibi olacaktır.
WolfeLine

Yanıtlar:


0

İstediğin şeyi yapması gereken makro bu. O:

  • Fon sayısı istemi
  • Veri tablosunun başladığını varsayar A1
  • sütunlarda "Sayfa2" konulu baskılar AaracılığıylaC
  • dateSütunda boş bir hücreyle karşılaşırsa çıkar

Not: "Sayfa2" mevcut değilse, makro başarısız olur, bu yüzden oluşturun. Ayrıca, başlıkları "Sayfa2" ye koymanız ve "Sayfa2" deki tarih ve miktarlar için hücre biçimini ayarlamanız gerekir.

gerektiği gibi ayarlayın

Sub wolfeline()
Dim c As Range
Dim k As Integer
Dim x As Integer
Dim y As Integer
Dim WScurr As Worksheet
Dim WStarg As Worksheet

'Set current and target WS
'//Note: target WS must exist already
Set WScurr = ActiveSheet
Set WStarg = Sheets("Sheet2")

'k=2 so we start on row 2, below the headers you've put, adjust as needed
k = 2

'count the range of dates
y = [counta(A:A)]

'Ask user to input number of funds
x = InputBox("Number of Funds?")
'Feel free to define range("A:A") to your actual range e.g. range("A2:A100")
For Each c In WScurr.Range("A2:A" & y)
If c.Value = "" Then Exit Sub

    ' "to 3" indicates there are 3 funds, adjust as needed
    For i = 1 To x
        If c.Offset(, i) <> "" Then
            'we're printing this in columns K, L and M, adjust as needed
            WStarg.Cells(k, "A") = c
            WStarg.Cells(k, "B") = Cells(1, c.Offset(, i).Column)
            WStarg.Cells(k, "C") = c.Offset(, i)
            k = k + 1
        End If
    Next
Next


End Sub

Bunun için çok teşekkür ederim, fakat tanımsız bir tarih ve fon miktarı varsa ne olacak? Aylık değişecek.
WolfeLine

Makroyu, aylık fon sayısını yansıtacak şekilde değiştirin. range("A:A")Belirsiz miktarda tarih tutabilirsin .
Raystafarian,

Cehaletim için üzgünüm @Raystafarian, ancak tanımsız sayıda fon için makroyu nasıl değiştiririm? ve tüm bu verileri A sütunu (Tarih), B Sütunu (Adlandırılmış Fon) ve C Sütunu (Miktar) ile başlayan yeni bir sayfaya kopyalamak için makroyu nasıl değiştiririm?
WolfeLine

@WolfeLine bir makro istediniz, böylece makroyu gerektiği gibi ayarlayabileceğinizi düşündüm. Yeni düzenlemeye bakın. Hedef "sheet2" dir, bu yüzden yanlışsa değiştirin. Fon sayısını ister, tanımsız tutamazsınız ya da sonsuza dek çalışır.
Raystafarian,

0

Makro kaydediciyi açın ve John Walkenbach'ın blogunda bulunan yöntemi kullanın. Ekran görüntüsünüzdeki örnek verileri kullanarak bu kodla gelir:

Sub Unpivot()

'
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
        Array("Sheet1!R1C1:R4C4"), Version:=xlPivotTableVersion15).CreatePivotTable _
        TableDestination:="", TableName:="PivotTable1", DefaultVersion:= _
        xlPivotTableVersion15
    ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
    ActiveSheet.Cells(3, 1).Select
    ActiveSheet.PivotTables("PivotTable1").DataPivotField.PivotItems( _
        "Count of Value").Position = 1
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Row").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Column").Orientation = _
        xlHidden
    Range("A4").Select
    Selection.ShowDetail = True
End Sub

Beğeninize ayarlayın veya kod John Walkenbach mesajları denemek burada . Excel'in daha önceki bir sürümü için yazılmış, bu yüzden 2010 kodundan farklı görünebilir.


teşekkür ederim teylyn, bunun ne anlama geldiğini sorabilir miyim? SourceData: = _ Dizi ("Sayfa1! R1C1: R4C4")
WolfeLine

Sütun A'da değişken sayıda tarih ve Satır 1'de değişken sayıda Fon olduğunu not etmek yardımcı olabilir. xlConsolidation, SourceData: = _ Array ( "Sayfa1! R1C1: R4C4") Sürüm: = xlPivotTableVersion15) .CreatePivotTable _ TableDestination: = "", TableName: = "PivotTable1", DefaultVersion: = _ xlPivotTableVersion15
WolfeLine

@WolfeLine başarısız oldu, çünkü bu makro, yorumlarda netleştikten sonra durumun gerçek olmadığını belirten gerçek bir pivot tabloyla çalıştığımızı varsayıyor.
Raystafarian

Bu kodun ekran görüntüsü verisine dayandığını ve ayarlamanız gerektiğini söyledim.
teylyn

0

Çok fazla para sütununuz yoksa, el ile yapabilirsiniz.

  1. Fon 1'in önüne (B Sütunu) bir sütun yerleştirin. B sütununda bir değer olup olmadığını kontrol eden her hücreye bir 'IF' formülü kopyalayın (şimdi C Sütunu) ve eğer öyleyse, içeriği "Fon 1" olarak ayarlar. Yani, B2 hücresinde:

    = IF (C2 <> "", "Fon 1", "")

  2. Bir sonraki Fon sütununun önüne iki sütun ekleyin. İkisinden ilkinde, Fon sütununda bir değer olup olmadığını kontrol eden bir 'IF' formülü ayarlayın ve öyleyse, tarihi A Sütunundan kopyalar. ancak doğru fonu ekleyin. Bu D2 ve E2 hücrelerinde

    = IF (F2 <> "", A2, "") || = IF (F2 <> "", "Fon 2", "") ||

Bunu her Fon Sütunu için yapın.

  3. Ardından, üç sütunlu blokların her birinden hücreleri yeni bir sayfaya kopyalayın, böylece her ardışık blok önceki blokun altına yerleştirilir. Diğer bir deyişle, Sütun A'nın ilk veri hücresinden (satır 1 değil) son hücreye kopyalayın ve Sütun C'deki veriler - tüm sütunları değil - ve bunları yeni sayfanın sol üst hücresine yapıştırın. Ardından, Sütun D'deki ilk hücreden veriyi, Sütun F'deki son veri hücresine kadar seçin ve kopyalayın ve daha önce yapıştırılan verinin hemen altındaki satırdaki Sütun A'ya yapıştırın.

Tüm bu bloklar kopyalandıktan sonra, verileri A Sütununa (tarih sütunu) göre sıralayabilirsiniz. Bu, tüm işlemleri yalnızca krono sıraya koymakla kalmayacak, aynı zamanda tüm boşlukları bir araya getirerek sizi aradığınız formatta verilerle bırakacaktır.

Makro sürümü

Orada ise şunlardır Fon Sütunlar bir çok 1. ve 2. adımları yapmak makro kaydedici kullanın ve her bir sandık için bir döngü (sütununda üstüne bir şeyler matematik yaparak "Fon #" dizesini ayarlayın çözümünde adım 2 yapar kod çalıştırmasına içeride).

Ardından, üç sütun bloğunun ilk çiftini kopyalayıp yapıştırmak için benzer bir makro kaydedici işi yapın ve ardından bunları sıralayın ve her Fon için kopya / geçmiş kodu arasında dolaşın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.