Excel'de aynı sütunlara sahip iki tabloyu nasıl birleştiririm?


11

Excel'de, verileri bir SQL veritabanından bir tabloya çeken ve sonra bu verilere dayalı bir rapor üreten bir elektronik tablo var. Ne yazık ki, bu SQL veritabanındaki veriler eksik ve ben e-tabloya el ile girilen sonuç kümesine ek satırlar eklemek istiyorum.

İstediğim kadarıyla, Excel'e her yeni veri çektiğinde silinecekleri için bu ekstra satırları tabloya manuel olarak ekleyemiyorum. Bunun yerine, yeni bir sayfada aynı sütun başlıklarına sahip ayrı bir tablo oluşturmayı ve verileri buraya girmeyi ve sonra SQL'den veri çeken tablodaki satırları bir araya getiren üçüncü bir tablo oluşturmayı ve Verileri manuel olarak gireceğim tablo. Bunu nasıl başarabilirim? (Ya da dönüşümlü olarak bunu yapmanın daha iyi bir yolu var mı?)


Misal:

Table 1 (From Database):

  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |

-

Table 2 (Entered Manually): 
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

-

Result:
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

Manuel olarak eklenen verileriniz SQL verilerinizin altındaysa sizin için uygun mu? Veya tarihe göre sıralanması gerekir. Excel, varolan SQL veri satırlarının hemen altındaki satırların üzerine yazmaz. Ancak her iki veri türünün de sıralanması gerekiyorsa, her şey daha karmaşıktır.
nixda

Bunların sıralanmasını tercih ederim ama bu tamamen gerekli değil. Önemli olan, tüm veri setini analiz etmek için pivot tabloları ve diğer excel araçlarını kullanabilmem (hem manuel hem de otomatik olarak doldurulmuş tablolar dahil). Ayrıca SQL'den yeni verileri otomatik olarak almaya devam edebilmem gerekiyor.
Ajedi32

Bu davranış bir çözüm olabilir mi? Sonra ilk sorgu ve sonra ikinci sorgu . Ve elbette, çalışma kitabını açtığınızda Excel SQL'inizi otomatik olarak güncelleyecektir.
nixda

Sanırım bu işe yarar. Ben filtre, sıralama, vb, böylece tek bir tabloda veri olmasını istiyorum, ama daha önce söylediğim gibi bu tamamen gerekli değildir.
Ajedi32

belki sıralama probleminiz için bir çözüm buluyoruz. Ancak ilk adım için, SQL'inizi yeni bir çalışma kitabında ilk kez sorgulamanız yeterlidir. Bundan sonra, manuel girişlerinizi hemen altına ekleyin. Şimdi ikinci (ve daha büyük) bir sorgu ile test edin. Üzerine yazılmayacaklar. Bu standart bir davranış. Yapacak özel bir şey yok.
nixda

Yanıtlar:


2

İşte VBA'sız saf bir Excel çözümü. Değerler tükenene ve bir hata koşulu oluşana kadar SQL verilerinin satırlarında ve sütunlarında aşağı inmek için bir INDEX işlevi kullanılarak çalışır. IFERROR işlevi hatayı yakalar ve manuel olarak girilen verilerin satırlarında ve sütunlarında, bu değerler tükenene ve bir hata durumu ortaya çıkana kadar ikinci bir INDEX işlevi kullanır. İkinci bir EĞERHATA işlevi hatayı yakalar ve bir tire ("-") döndürür. (Formüllerin doğru sonuç verebilmesi için SQL verilerinin Şerit aracılığıyla yenilenmesi gerekir.)

Aşağıdaki formülü kullanarak Sheet1'deki SQL verileri için dinamik bir adlandırılmış aralık SQLDB oluşturun:

=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,COUNTA(Sheet1!$1:$1))

Aşağıdaki formülü kullanarak Sheet2 içinde manuel olarak girilen veriler için EXCELRNG adlı ikinci bir dinamik aralık oluşturun :

=OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))

Bu adlandırılmış aralıkların her ikisi de, değişken adlarının iki sayfanın her birinin 1. satırına girildiğini varsayar.

Değişken adlarını Sayfa3'ün 1. satırına girin (A1 hücresinden başlayarak).

Aşağıdaki formülü Sheet3'ün A2 hücresine girin :

=IFERROR(INDEX(SQLDB,ROWS(A$2:A2),COLUMN(A2)),IFERROR(INDEX(EXCELRNG,ROWS(A$2:A2)-ROWS(SQLDB),COLUMN(A2)),"-"))

Formülü, değişken adı sütunlarına kopyalayın ve formüllerin sonuçları kesik çizgiler ("-") olana kadar satırları aşağı doğru kaydırın.

Bir sonraki adım olarak analiz ve organizasyon için başka bir sayfada Pivot Tablosu oluşturmak mümkündür.

Yine ilk adım, RESULTRNG adlı bir adlandırılmış aralık oluşturmak, adlandırılan aralık için Ad Yöneticisi giriş kutusuna aşağıdaki formülü eklemek olacaktır:

=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet1!$A:$A)+COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet1!$1:$1))

Ardından yeni bir sayfada RESULTRNG öğesini analiz etmek istediğiniz tablo olarak ayarlayarak bir Pivot Tablo oluşturun. Bu işlem, Sayfa3'teki formül tablosundaki tüm son çizgileri filtreleyecektir.

Bunun nedeni, RESULTRNG formülünün Sayfa1 ve Sayfa2'deki toplam satır sayısını (Sayfa2'deki başlık hariç) ve Sayfa1'deki toplam sütun sayısını sayması ve kapsamını, sondaki satırlardaki tire (hariç) bu sayılara göre ayarlamasıdır. veya sütunlar).


Bu şekilde yapsaydım kombine tablonun sabit bir boyutta olması gerekmez mi? Ve tablo olması gerekenden daha büyük yapıldıysa, birleştirilmiş tablodan veri işleyen bir Pivot Tablo yapmaya çalışsaydım bu karışıklık olmaz mıydı? (Tablodaki değerlerin bazıları '-' karakterlerden dolayı mı?) Yoksa bu sorunların bir yolu var mı?
Ajedi32

(Btw, genellikle bunun gibi saf Excel çözümlerini tercih ederim, çünkü kullanıcının çalışmaya başlamadan önce makroları etkinleştirmesini gerektirmezler.)
Ajedi32

Formüllerin iki tablodaki tüm verileri yakaladığından emin olmak için biraz el bakımı gerekir. Kısa çizgilerden kaçınmak için, formülleri kısa çizgiler yerine verileri döndürdüğü yere kopyalamanız gerekir.
chuff

Yalnızca birleştirilmiş tablodan boş olmayan ('-' karakterlerle dolu) satırları içeren başka bir adlandırılmış aralık oluşturmak mümkün müdür? Bu şekilde, pivot tablolarını verilerini bu aralıktan almak için ayarlayabilirim ve çizgiler hakkında endişelenmem gerekmeyecekti.
Ajedi32

Cevabı hariç, pivot tabloyu nasıl oluşturabileceğinizi açıklamak için cevabımı genişlettim. "Kesiksiz" bir tablo koymaya çalışmak, kaynak verilerdeki satır sayısı her değiştiğinde yeni tablo elle boyutlandırılmadığı sürece tire problemini başka bir sayfaya aktaracaktır.
chuff

5

Bunu yapmanın bir yolunu buldum. Bu çözüm biraz zor ve her iki tablonun kendi ayrı sayfalarına sahip olmalarını gerektirir (üzerlerinde başka bir şey olmadan), ancak bunun dışında neredeyse tam olarak ne istediğimi yapar. (Burada, birleşimler gibi daha karmaşık işlemler yapmak için de çok fazla potansiyel var gibi görünüyor.)

Şeritteki veri sekmesine gidin, "Diğer Kaynaklardan" ve "Microsoft Sorgusundan" öğelerini tıklayın. Ardından Excel Dosyaları'na tıklayın, çalışmakta olduğunuz dosyayı seçin ve Tamam'a tıklayın. Ardından, iptal'e basın ve Microsoft Query'de düzenlemeye devam etmek isteyip istemediğinize terfi ettiğinizde "Evet" e basın. Buradan SQL düğmesine tıklayabilir ve e-tablodaki herhangi bir sayfaya özel bir SQL Sorgusu yazabilirsiniz. Benim durumumda:

SELECT *
FROM `'Sheet1$'` `'Sheet1$'`
UNION ALL
SELECT *
FROM `'Sheet2$'` `'Sheet2$'`

Not: Benim için, dosyayı kapatıp yeniden açtıktan sonra bu yöntem çalışmayı durduruyor. Bilgisayarımla ilgili bir sorun olması veya başka birinin çalışabilmesi için yine de buraya gönderiyorum.


1
İki farklı çalışma kitabını birbirine bağlayarak çalışır. Tam da ihtiyacım olan buydu. Teşekkür ederim!
daVe

Bu yöntem benim için çok iyi çalışıyor. Sorguyu yürütün, ardından verileri ve geçmişi excel'e kopyalayın. Ancak, verilerinizdeki yinelenen satırları kaldıracağını unutmayın, umarım bu cevabı biraz düzenlersem sakıncası olmaz.
Some_Guy

Bu aslında bana olduğu için ekleyerek, neredeyse toplamları elde etmek için bir döndürülebilir hale getirmeden önce bir sürü satış verisini 1 e-tabloya birleştirmek için kullandım ve birden çok kez satılan bir ürünün aynı hacminin sahip olacağı birkaç hata alırdım kaçırılmış.
Some_Guy

@Some_Guy Bunun yerine sadece UNION ALL kullanın.
Ajedi32

3

Bir VBA çözümüyle ilgileniyorsanız, aşağıdakileri çalıştırabildim:

  • SQL Server'dan çektiğiniz veriler için dinamik bir adlandırılmış aralık ayarlayın. Ad Yöneticisi'ni açın, yeni bir ad girin (örneğin, "SQLDB") ve aşağıdaki formülü Başvuru Yeri giriş kutusuna kopyalayın. Çektiğiniz verilerinizin Sayfa1'de olduğunu varsaydım:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • Manuel verilerin girildiği aralık için başka bir adlandırılmış aralık ayarlayın. EXCELRNG adını kullandım ve Sayfa2'de olduğunu varsaydım. Adlandırılmış aralık, başlık satırını hariç tutmak için 2. satırda başlar. Buradaki formül, başvurduğu sayfa haricinde ilkiyle aynıdır:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • İşte SQL tablosuna bağlantı için kullandığım ilk ayarlar. İletişim kutusuna Şerit üzerindeki Veri sekmesinde Bağlantılar seçilerek erişilir. Arka plan yenilemeyi devre dışı bırakmak, Excel sayfasındaki verilerin yenilenmesi tamamlanana kadar VBA makrosunun duraklatılmasını sağlar. Çalışma sayfası açıldığında bağlantı yenilemeye gerek olmayabilir, ancak makro çalıştırılmadan önce herhangi bir kimlik doğrulamasının yapılacağından emin olmak istedim.

bağlantı ayarları

  • İşte ikinci ayar grubu. Bunlar Veri sekmesinin Özellikler bölümünde bulunur (içe aktarılan SQL tablosundaki bir hücre seçiliyken). "Yeni veriler için tüm satırları ekle, kullanılmayan hücreleri sil" seçeneğini seçmiş olmama rağmen, "Hücreleri ekle ..." seçeneğiyle ilgili herhangi bir sorunla karşılaşmadım.

bağlantı özellikleri

  • Son olarak, bu VBA kodu. Eklemek için, Geliştirici sekmesi altında Visual Basic'i seçin. Soldaki listede çalışma sayfası adını vurgulayın. "VBA Projesi (sayfa adı)" olarak adlandırılacaktır. Ardından ekranın üst kısmındaki menü çubuğundaki Modül Ekle'yi seçin ve kodu yeni modüle yapıştırın. makro yeni tabloyu sıralamaz, ancak eklemek zor olmaz.

    Sub StackTables()
    
       Dim Rng1 As Range, Rng2 As Range
    
       Set Rng1 = ThisWorkbook.Names("SQLDB").RefersToRange
       Set Rng2 = ThisWorkbook.Names("EXCELRNG").RefersToRange
    
       ' refresh the SQL table
       ThisWorkbook.Connections(1).Refresh
    
       ' clear the consolidated table range  
       Sheet3.Cells.ClearContents
    
       ' copy the SQL data into the consolidation range
       Rng1.Copy
       Sheet3.Range("A1").PasteSpecial xlPasteValues
    
       'copy the manually entered data into the consolidate range
       Rng2.Copy
       Sheet3.Range("A1").Offset(Rng1.Rows.Count, 0).PasteSpecial xlPasteValues
       Application.CutCopyMode = False
    
       Sheets("Sheet3").Activate
       ActiveSheet.Range("A1").Select
    
    End Sub
    

Bu oldukça sağlam bir çözüm gibi görünüyor. Yine de birkaç sorum var. Bu makroyu tetikleyen nedir? Veri bağlantılarını yenilediğinizde otomatik olarak çalışır veya manuel olarak çalıştırmak için ayrı bir düğmeye basmanız gerekir mi? İkincisi, bu tablolarla çalışıyor değil mi? (Yalnızca tablo olarak biçimlendirilmemiş aralıklar değil) Durum buysa, tablonun kendisi sıralamayı kaldıramaz mı? (VBA makrosu yerine sıralamayı yapıyor, önerdiğin gibi?)
Ajedi32

1
Durduğu gibi, Geliştirici sekmesinden Makrolar'ı seçip makroyu seçip çalıştırarak makroyu çalıştırırsınız. İki alternatif: Şerit üzerindeki özel bir düğmeye atayın ve çalıştırmak için bunu kullanın; veya bir Worksheet_Activate olayına makro kodu olarak gömün. Bu, konsolidasyon sayfasını her seçtiğinizde çalışır. Sıralama yapabilen tablolarla çalışacaktır. Ancak, veri eklendiğinde tabloların otomatik olarak başvurup uymadığından emin değilim.
chuff

3

@ Chuff'ın "Pure Excel" çözümünün tablolarla çalışmak için özel olarak tasarlanmış bir sürümü . (IE Birleştirmek istediğiniz iki veri kaynağı tablodur.)

Bu yöntem ve cevabında yayınlanan bir chuff arasındaki temel fark, birleştirdiğiniz iki veri kümesi için adlandırılmış aralıklar tanımlamanıza gerek olmamasıdır, çünkü bunlar tablolardır ve zaten kendi adlandırılmış aralıkları vardır. Öyleyse devam edin ve ilk tablonuzu Table1ve ikinci tablonuzu adlandırın Table2.

Şimdi, yeni bir sayfanın sol üst köşesinde yeni bir tablo oluşturun ve diğer iki tablo ile aynı sütun adlarını verin. Ardından, az önce oluşturduğunuz sayfanın A2 hücresine aşağıdaki formülü girin:

=IFERROR(INDEX(Table1,ROWS(A$2:A2),COLUMN(A2)), IFERROR(INDEX(Table2,ROWS(A$2:A2)-ROWS(Table1),COLUMN(A2)), "-"))

Ardından, bu formülü tüm tablo sütunlarına kopyalayın ve ardından formüllerin sonuçları kesik çizgiler ("-") olana kadar satırları aşağı doğru kaydırın. Not: Bu yeni tabloyu sıralamak hiçbir şey yapmaz, çünkü her hücrenin içeriği aslında aynıdır (hepsi aynı formülü içerir).

Birleştirilen tablodaki sütunlar boş bir hücre görüntülemeleri gerektiğinde 0'ları görüntülüyorsa, bu sütundaki formülü aşağıdaki gibi yerine işleviyle sarabilirsiniz:

=SUBSTITUTE(<old expression here>, 0, "")

Bu yeni tablodaki verileri kullanan bir pivot tablo oluşturmak istiyorsanız, adlandırılmış bir aralık oluşturmanız gerekir. İlk olarak, tabloyu adlandırın Table3. Şimdi, formüller sekmesine gidin ve "Adı Tanımla" yı tıklayın. Referansa bir ad verin, değeri için aşağıdaki denklemi girin ("Şuna karşılık gelir"):

=OFFSET(Table3[#All],0,0,ROWS(Table1)+ROWS(Table2)+1)

Daha sonra bu adlandırılmış başvuruyu Pivot Tablonuz için aralık olarak kullanabilirsiniz.


0

Sadece bir kerelik bir sonuç istiyorsanız, sizin için iki tabloyu birleştirecek bir web sitesi vardır: https://office-tools.online/table/merge/

Tabloları web sayfasına yapıştırır ve ilgili parametreleri seçersiniz. Yerleşik örneğin nasıl kullanılacağını gösteren bir ekran görüntüsü:

resim açıklamasını buraya girin

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.